天天看點

Linux核心開發之核心等待隊列

核心等待隊列

一、

        在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的程序。

繼續閱讀