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):
將當前進程無條件休眠在給定的等待隊列上,極不贊成使用這個函數,因為它對競態沒有任何保護機制。
-
Linux
+關注
關注
87文章
11232瀏覽量
208950 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21619
發布評論請先 登錄
相關推薦
評論