1、等待队列由等待队列头和队列节点构成,当进程要获得某一资源而暂时不能得到时候,进程可以进入睡眠状态
内核为此要生成一个队列节点,并将睡眠的进程挂到等待队列中。
2、等待队列头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 ;
spinlock lock 是用来在对等待队列访问时做互斥操作的自旋锁。
task_list 是双向链表,用来管理睡眠在此等待队列的进程。
3、等待队列头的初始化
DECLARE_WAIT_QUEUE_HEAD : 完成等待队列头的静态定义和初始化。
init_waitqueue_head :动态初始化一个等待队列头。
4、等待队列节点
typedef struct __wait_queue wait_queue_t;
typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int flags,void *key);
struct __wait_queue {
unsigned int flags;
void *private;
wait_queue_func_t func;
struct list_head task_list;
}
flags : 唤醒等待队列上的进程时,该标志会影响唤醒操作的行为模式。
private : 指向睡眠的进程的task_struct结构体。
func : 该节点上的进程被唤醒时执行的唤醒函数。
task_list : 将个个节点链成链表。
5、等待队列节点的初始化
DECLARE_WAIT_QUEUE(name, tsk) : 静态定义和初始化。
init_waitqueue_entry(wait_queue_t *q , struct task_struct *p) :动态初始化一个队列节点
6、等待队列的操作:
TODO