2.1. 唤醒机制:等待队列

Posted broler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.1. 唤醒机制:等待队列相关的知识,希望对你有一定的参考价值。

等待队列

等待队列是内核中非常常见的唤醒机制,等待者加入等待队列等待唤醒者进行唤醒,会有唤醒者主动执行唤醒函数。默认的唤醒函数就是调用try_to_wake_up唤醒目标任务,然后将等待者从等待队列中移除,但是允许使用者自定义唤醒函数。等待队列的实现主要是队列头struct wait_queue_head 和队列条目struct wait_queue_entry 两个结构体,两个结构体的定义如下:

struct wait_queue_entry 
	unsigned int		flags; 
	void			*private;
	wait_queue_func_t	func;
	struct list_head	entry;
;

struct wait_queue_head 
	spinlock_t		lock;
	struct list_head	head;

队列头的lock是用来保护队列操作,队列的添加删除都需要持有lock自旋锁。每个等待队列条目都作为链表的一个节点加入到等待队列开始阻塞等待,并且在被唤醒后从等待队列中摘除。
等待队列并不是很严格封装的一个结构,由于其数据结构非常简单,有的模块可以绕过API直接进行数据结构的操作,或者说模块本身认为自身足够简单,数据结构就是API的一部分。等待队列虽然简单,但是它却要适用于各种调用场所,并且由于默认的唤醒函数try_to_wake_up需要传入一个当前任务的状态作为参数,唤醒等待队列的时候就需要传入各种状态参数,这种封装如下:

#define wake_up(x)			__wake_up(x, TASK_NORMAL, 1, NULL)
#define wake_up_nr(x, nr)		__wake_up(x, TASK_NORMAL, nr, NULL)
#define wake_up_all(

以上是关于2.1. 唤醒机制:等待队列的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程:阻塞队列与等待唤醒机制初探

Linux队列

阻塞与唤醒,等待队列的舞台

阻塞与唤醒,等待队列的舞台

阻塞与唤醒,等待队列的舞台

阻塞与唤醒,等待队列的舞台