等待队列有很多用途,尤其用在中断处理、进程同步以及定时。等待队列实现了再事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。因此,等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。
等待队列由双向链表实现,其元素包括指向进程描述符的指针,每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构
Struct __wait_queque_head
{
Spinlock_t lock;
Struct list_head task_list;
};
Typedefstruct __wait_queque_head wait_queque_head_t;
同步是通过等待队列头的lock自旋达到的,task_list字段是等待进程链表的头
等待队列链表中的元素类型:
Struct __wait_queue
{
Unsigned int flags;
Struct task_struct * task;
Wait_queue_func_t func;
Struct list_head task_list;
};
Typedefstruct __wait_queue wait_queue_t;
等待队列链表中的每个元素代表一个睡眠进程,该进程等待某一事件的发生,它的描述符放在task字段中,task_list字段中包含的是指针,由这个指针把一个元素连接到等待相同事件的进程链表中。
有两种睡眠进程:互斥进程(等待队列元素的flags字段为1)由内核有选择的唤醒,而非互斥进程(flags字段为0),总是由内核在事件发生时唤醒。