Linux内核运行机制学习笔记
2011-06-24 10:56
316 查看
等待队列
参考:
http://blog.csdn.net/murui/archive/2008/04/23/2318280.aspx http://blog.ednchina.com/tiloog/133368/message.aspx http://blogold.chinaunix.net/u2/73528/showart_1108420.html
什么是等待队列?
在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠
状态,然后等待条件得到满足的时候再继续运行
,进入运行状态。这种需求需要等待队列机制的支持。
Linux
中提供了等待队列的机制,该机制在内核中应用很广泛。
在
Linux
内核中使用等待队列的过程很简单,首先定义一个
wait_queue_head
,然后如果一个
task
想等待某种事件,那么调用
wait_event
(等待队列,事件)就可以了。
linux
中等待队列的实现思想如下图所示,当一个任务需要在某个
wait_queue_head
上睡眠时,将自己的进程控制块信息封装到
wait_queue
中,然后挂载到
wait_queue
的链表中,执行调度睡眠。当某些事件发生后,另一个任务(进程)会唤醒
wait_queue_head
上的某个或者所有任务,唤醒工作也就是将等待队列中的任务设置为可调度的状态,并且从队列中删除。
Linux
内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在
Linux2.4.21
中,等待队列在源代码树
include/linux/wait.h
中,这是一个通过
list_head
连接的典型双循环链表,如下图所示。
在这个链表中,有两种数据结构:等待队列头(
wait_queue_head_t
)和等待队列项(
wait_queue_t
)。等待队列头和等待队列项中都包含一个
list_head
类型的域作为
"
连接件
"
。由于我们只需要对队列进行添加和删除操作,并不会修改其中的对象(等待队列项),因此,我们只需要提供一把保护整个基础设施和所有对象的锁,这把锁保存在等待队列头中,为
wq_lock_t
类型。在实现中,可以支持读写锁(
rwlock
)或自旋锁(
spinlock
)两种类型,通过一个宏定义来切换。如果使用读写锁,将
wq_lock_t
定义为
rwlock_t
类型;如果是自旋锁,将
wq_lock_t
定义为
spinlock_t
类型。无论哪种情况,分别相应设置
wq_read_lock
、
wq_read_unlock
、
wq_read_lock_irqsave
、
wq_read_unlock_irqrestore
、
wq_write_lock_irq
、
wq_write_unlock
、
wq_write_lock_irqsave
和
wq_write_unlock_irqrestore
等宏。
Linux中的物理地址与虚拟地址
http://blog.csdn.net/do2jiang/archive/2010/04/05/5450839.aspx
linux中,驱动程序不能直接访问物理地址空间,要访问外设的寄存器,需要将寄存器的地址映射到虚拟地址中,才能访问,wince也是这样的。
Linux中的Socket编程
htons(将16位主机字符顺序转换成网络字符顺序)host to network
因为网络的字节顺序与CPU的字节顺序可能不同,所以转一下,只有16位,32位需要,8位一个字节的不需要了。
peeraddr.sin_port=htons(atoi(argv[2]));argv2是port
atoi:ascii to int,字符串转成有符号整数。
inet_pton(AF_INET, argv[1], &peeraddr.sin_addr),点分十进制IP地址转成IP地址结构体
参考:
http://blog.csdn.net/murui/archive/2008/04/23/2318280.aspx http://blog.ednchina.com/tiloog/133368/message.aspx http://blogold.chinaunix.net/u2/73528/showart_1108420.html
什么是等待队列?
在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态,然后等待条件得到满足的时候再继续运行
,进入运行状态。这种需求需要等待队列机制的支持。
Linux
中提供了等待队列的机制,该机制在内核中应用很广泛。
在
Linux
内核中使用等待队列的过程很简单,首先定义一个
wait_queue_head
,然后如果一个
task
想等待某种事件,那么调用
wait_event
(等待队列,事件)就可以了。
linux
中等待队列的实现思想如下图所示,当一个任务需要在某个
wait_queue_head
上睡眠时,将自己的进程控制块信息封装到
wait_queue
中,然后挂载到
wait_queue
的链表中,执行调度睡眠。当某些事件发生后,另一个任务(进程)会唤醒
wait_queue_head
上的某个或者所有任务,唤醒工作也就是将等待队列中的任务设置为可调度的状态,并且从队列中删除。
Linux
内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在
Linux2.4.21
中,等待队列在源代码树
include/linux/wait.h
中,这是一个通过
list_head
连接的典型双循环链表,如下图所示。
在这个链表中,有两种数据结构:等待队列头(
wait_queue_head_t
)和等待队列项(
wait_queue_t
)。等待队列头和等待队列项中都包含一个
list_head
类型的域作为
"
连接件
"
。由于我们只需要对队列进行添加和删除操作,并不会修改其中的对象(等待队列项),因此,我们只需要提供一把保护整个基础设施和所有对象的锁,这把锁保存在等待队列头中,为
wq_lock_t
类型。在实现中,可以支持读写锁(
rwlock
)或自旋锁(
spinlock
)两种类型,通过一个宏定义来切换。如果使用读写锁,将
wq_lock_t
定义为
rwlock_t
类型;如果是自旋锁,将
wq_lock_t
定义为
spinlock_t
类型。无论哪种情况,分别相应设置
wq_read_lock
、
wq_read_unlock
、
wq_read_lock_irqsave
、
wq_read_unlock_irqrestore
、
wq_write_lock_irq
、
wq_write_unlock
、
wq_write_lock_irqsave
和
wq_write_unlock_irqrestore
等宏。
Linux中的物理地址与虚拟地址
http://blog.csdn.net/do2jiang/archive/2010/04/05/5450839.aspx
linux中,驱动程序不能直接访问物理地址空间,要访问外设的寄存器,需要将寄存器的地址映射到虚拟地址中,才能访问,wince也是这样的。
Linux中的Socket编程
htons(将16位主机字符顺序转换成网络字符顺序)host to network
因为网络的字节顺序与CPU的字节顺序可能不同,所以转一下,只有16位,32位需要,8位一个字节的不需要了。
peeraddr.sin_port=htons(atoi(argv[2]));argv2是port
atoi:ascii to int,字符串转成有符号整数。
inet_pton(AF_INET, argv[1], &peeraddr.sin_addr),点分十进制IP地址转成IP地址结构体
相关文章推荐
- Linux内核运行机制学习笔记
- Java学习笔记(一)Java运行机制及JVM相关
- MFC学习笔记之:MFC运行机制
- PHP学习笔记(一)——PHP的生命周期、运行机制及并发模型
- VC++学习笔记之MFC应用程序创建/执行顺序和MFC运行机制
- GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)
- vc学习笔记之windows程序内部运行机制
- Linux内核学习笔记3——分段机制和分页机制
- 黑马程序员_多线程的创建和运行机制学习笔记
- 第102讲:通过案例解析Akka中的Actor运行机制以及Actor的生命周期学习笔记
- (笔记)Linux内核学习(五)之中断推后处理机制
- JVM学习笔记1—JVM运行机制
- ASP.NET MVC学习笔记-MVC运行机制之源码剖析
- 4. Laravel5学习笔记:Facade的运行机制
- GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)
- GAN︱生成模型学习笔记(运行机制、NLP结合难点、应用案例、相关Paper)
- 第133讲:Hadoop集群监控Ganglia架构设计和运行机制详细解析学习笔记
- VS 2008 学习笔记(2) --- MFC 应用程序的运行机制
- VC学习笔记: 1. Window程序内部运行机制
- JAVA之学习笔记(1)-------------Java运行机制及JVM