linux 之 等待队列

来源:互联网 发布:excel标注重复数据 编辑:程序博客网 时间:2024/05/27 00:38

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


原创粉丝点击