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

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):

   不推薦


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章