等待队列还是弄的不太明白,线有点乱……
把知道的记录下吧。wait_queue确实是双向链表。有一个表头,加后面的链表体,就像火车头拖着后面的车厢。不同的是这个车头还跟最后一节车厢连在一起形成一个闭环。这就是双向链表了。
结构如下
/*
* A single wait-queue entry structure:
*/
struct wait_queue_entry {
unsigned int flags;
void *private;//指向task_struct,就是进程pcb了
wait_queue_func_t func;
struct list_head entry;//双向链表
};
struct wait_queue_head {
spinlock_t lock;
struct list_head head;
};
typedef struct wait_queue_head wait_queue_head_t;
struct task_struct;
其中,struct list_head如下
struct list_head {
struct list_head *next, *prev;
};
双向链表无疑了。之前没有看list_head的结构,还觉得网上的博客都说错了……
copy一张图,很清晰
图来自这篇文章https://blog.51cto.com/weiguozhihui/1566704,其中对队列的操作写的很清楚了,然而我还是不知道把进程加入队列后,它怎么去休眠的,是主动schedule()然后醒来后检查条件一直循环还是调用其他东西进入休眠?