LINUX 等待隊列

來源:互聯網
上載者:User

 (轉載) bojan 收錄於2010-10-09 閱讀數:  公眾公開  
 我也要收藏  
在Linux驅動程式中,可以使用等待隊列(wait queue)來實現阻塞進程的喚醒。wait queue很早就作為一種基本的功能單位出現在Linux核心裡了,它以隊列位基礎資料結構,與進程調度機制緊密結合,能夠用於實現核心中非同步事件通知機制。等待隊列可以用來同步對系統資源的訪問。(訊號量在核心中也依賴等待隊列來實現).

    Linux-2.6提供如下關於等待隊列的操作:
    (1) 定義"等待隊列頭"
        wait_queue_head_t my_queue;

    (2) 初始化"等待隊列頭"
        init_waitqueue_head(&my_queue);
        定義和初始化的捷徑:
        DECLARE_WAIT_QUEUE_HEAD(my_queue);  

    (3) 定義等待隊列
        DECLARE_WAITQUEUE(name, tsk);
        定義並初始化一個名為name的等待隊列(wait_queue_t);

    (4) 添加/移除等待隊列
        void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
        void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
        add_wait_queue()用於將等待隊列wait添加到等待隊列頭q指向的等待隊列鏈表中,而remove_wait_queue()用於將等待隊列wait從附屬的等待隊列頭q指向的等待隊列鏈表中移除。

    (5) 等待事件
        wait_event(queue, condition);
        wait_event_interruptible(queue, condition);
        wait_event_timeout(queue, condition, timeout);
        wait_event_interruptible_timeout(queue, condition, timeout);
        等待第一個參數queue作為等待隊列頭的等待隊列被喚醒,而且第二個參數condition必須滿足,否則阻塞。wait_event()和wait_event_interruptible()的區別在於後者可以被訊號打斷,而前者不能。加上timeout後的宏意味著阻塞等待的逾時時間,以jiffy為單位,在第三個參數的timeout到達時,不論condition是否滿足,均返回。

    (6) 喚醒隊列
        void wake_up(wait_queue_head_t *queue);
        void wake_up_interruptible(wait_queue_head_t *queue);
        上述操作會喚醒以queue作為等待隊列頭的所有等待隊列對應的進程。
        wake_up()               <--->    wait_event()
                                         wait_event_timeout()
        wake_up_interruptible() <--->    wait_event_interruptible()  
                                         wait_event_interruptible_timeout()

        wake_up()可以喚醒處於TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的進程
        wake_up_interruptble()只能喚醒處於TASK_INTERRUPTIBLE的進程。

    (7) 在等待隊列上睡眠
        sleep_on(wait_queue_head_t *q);
        interruptible_sleep_on(wait_queue_head_t *q);
     
        sleep_on()函數的作用就是將當前進程的狀態置成TASK_UNINTERRUPTIBLE,定義一個等待隊列,並把它添加到等待隊列頭q,直到支援獲得,q引導的等待隊列被喚醒。
        interruptible_sleep_on()與sleep_on()函數類似,其作用是將目前進程的狀態置成TASK_INTERRUPTIBLE,並定義一個等待隊列,之後把它附屬到等待隊列頭q,直到資源可獲得,q引導的等待隊列被喚醒或者進程收到訊號。  

        sleep_on()               <--->   wake_up()
        interruptible_sleep_on() <--->   wake_up_interruptible()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.