Linux內核中等待隊列的幾種用法


Linux內核里的等待隊列機制在做驅動開發時用的非常多,多用來實現阻塞式訪問,下面簡單總結了等待隊列的四種用法,希望對讀者有所幫助。

1. 睡眠等待某個條件發生(條件為假時睡眠):

    睡眠方式:wait_event, wait_event_interruptible
            喚醒方式:wake_up (喚醒時要檢測條件是否為真,如果還為假則繼續睡眠,喚醒前一定要把條件變為真)

2. 手工休眠方式一:

    1)建立並初始化一個等待隊列項
                DEFINE_WAIT(my_wait) <==> wait_queue_t my_wait; init_wait(&my_wait);
            2)將等待隊列項添加到等待隊列頭中,並設置進程的狀態
                prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)
            3)調用schedule(),告訴內核調度別的進程運行
            4)schedule返回,完成后續清理工作
                finish_wait()

3. 手工休眠方式二:

    1)建立並初始化一個等待隊列項:
                DEFINE_WAIT(my_wait) <==> wait_queue_t my_wait; init_wait(&my_wait);
            2)將等待隊列項添加到等待隊列頭中:
                add_wait_queue
            3)設置進程狀態
                __set_current_status(TASK_INTERRUPTIBLE);
            4)schedule()
            5)將等待隊列項從等待隊列中移除
                remove_wait_queue()

其實,這種休眠方式相當於把手工休眠方式一中的第二步prepare_to_wait拆成兩步做了,即prepare_to_wait <====>add_wait_queue + __set_current_status,其他都是一樣的。

4. 老版本的睡眠函數sleep_on(wait_queue_head_t *queue):

    將當前進程無條件休眠在給定的等待隊列上,極不贊成使用這個函數,因為它對競態沒有任何保護機制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM