linux内核资料收集
1. 等待队列
进程经常要等待某些事件,如,磁盘操作完成,一段时间间隔等。等待队列实现了在事件上的条件待:进程把自己放进
合适的等待队列,并放弃控制权。因此,等待队列表示一组睡眠的进程。当某一条件满足时,由内核唤醒它们。
等待队列由双向链表实现,其元素指向进程描述符的指针。每个等待队列都有一个等待队列头。等待队列头是一个类型
为wait_queue_head_t的数据结构:
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
等待队列由中断和主要内核函数修改,因此必须用队列中的自旋锁lock对双向链表进行访问同步。task_list是链表头。
等待队列链表中的元素类型为wait_queue_t
struct __wait_queue {
unsigned int flags;
struct task_struct * task;
wait_queue_func_t func;
struct list_head task_list;
}
typedef struct __wait_queue wait_queue_t;
等待队列链表中的每个元素代表一个睡眠进程,该进程等待某一事件发生。其进程符描述符地址放在task字段中。task_list
字段中包含双向链表指针,它可以把元素链入到等待相同事件的进程链表中。
有两种睡眠进程:互斥进程,由内核有选择的唤醒。非互斥进程,总是由内核在事件发生时唤醒。等待队列元素的func字段
用来表示等待队列中睡眠进程应该用什么方式唤醒。
2. 等待队列的操作
初始化:
用DECLARE_WAIT_QUEUE_HEAD(name)定义一个新的等待队列的头,表态的声明一个叫name的等待队列头变量,并初始化
其中的变量。 init_waitqueue_head()初始化动态分配的等待队列头变量。
唤醒:
default_wake_function()
autoremove_wake_function()
加入等待队列:
add_wait_queue()
add_wait_queue_exclusive()
移出等待队列:
remove_wait_queue()
......
3. 等待特定条件
sleep_on()
sleep_on_timeout()
interruptible_sleep_on_timeout()
prepare_to_wait()/prepare_to_wait_exclusive()
wait_event/wait_event_interruptible
wake_up_locked/wake_up
阅读(450) | 评论(0) | 转发(0) |