核心等待隊列
一、
在Linux驅動程式設計中,使用等待隊列來實作程序的阻塞,等待隊列可看作儲存程序的容器,在阻塞程序時,将程序放入等待隊列,當喚醒程序時,從等待等列中取出程序。
二、
等待隊列以隊列為基礎資料結構,與程序排程機制緊密結合,能夠用于實作核心中的異步事件通知機制,也可以用來同步對系統資源的通路(如信号量)。
三、
Linux2.6核心提供如下關于等待隊列的操作:
1、定義等待隊列
wait_queue_head_t my_queue;
2、初始化等待隊列
init_waitqueue_head(&my_queue);
3、定義并初始化等待隊列
DECLARE_WAIT_QUEUE_HEAD(my_queue);
4、有條件睡眠
wait_event(queue,condition)
當condition(一個布爾表達式)為真時,立即傳回;否則讓程序進入TASK_UNINTERRUPTIBLE(不可以被信号/中斷喚醒)模式的睡眠,并挂在queue參數所指定的等待隊列上。
wait_event_interruptible(queue,condition)
當condition(一個布爾表達式)為真時,立即傳回;否則讓程序進入TASK_INTERRUPTIBLE(可以被信号/中斷喚醒)的睡眠,并挂在queue參數所指定的等待隊列上。
wait_event_timeout(queue,condition, timeout);
wait_event_interruptible_timeout(queue,condition, timeout);
wait_event_killable(wait_queue_t queue, condition);
當condition(一個布爾表達式)為真時,立即傳回;否則讓程序進入TASK_KILLABLE(可以被緻命信号喚醒)的睡眠,并挂在queue參數所指定的等待隊列上。
5、無條件睡眠(老版本,建議不再使用)
sleep_on(wait_queue_head_t*q)
讓程序進入不可中斷的睡眠,并把它放入等待隊列q。
interruptible_sleep_on(wait_queue_head_t*q)
讓程序進入可中斷的睡眠,并把它放入等待隊列q。
6、從等待隊列中喚醒程序
wake_up(wait_queue_t*q)
從等待隊列q中喚醒狀态為TASK_UNINTERRUPTIBLE, TASK_INTERRUPTIBLE,TASK_KILLABLE 的所有程序。
wake_up_interruptible(wait_queue_t*q)
從等待隊列q中喚醒狀态為TASK_INTERRUPTIBLE的程序。