Linux內(nèi)核里的等待隊列機(jī)制在做驅(qū)動開發(fā)時用的非常多,多用來實(shí)現(xiàn)阻塞式訪問,下面簡單總結(jié)了等待隊列的四種用法,希望對讀者有所幫助。
1. 睡眠等待某個條件發(fā)生(條件為假時睡眠):
睡眠方式:wait_event, wait_event_interruptible
喚醒方式:wake_up (喚醒時要檢測條件是否為真,如果還為假則繼續(xù)睡眠,喚醒前一定要把條件變?yōu)檎妫?/p>
2. 手工休眠方式一:
1)建立并初始化一個等待隊列項
DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊列項添加到等待隊列頭中,并設(shè)置進(jìn)程的狀態(tài)
prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)
3)調(diào)用schedule(),告訴內(nèi)核調(diào)度別的進(jìn)程運(yùn)行
4)schedule返回,完成后續(xù)清理工作
finish_wait()
3. 手工休眠方式二:
1)建立并初始化一個等待隊列項:
DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊列項添加到等待隊列頭中:
add_wait_queue
3)設(shè)置進(jìn)程狀態(tài)
__set_current_status(TASK_INTERRUPTIBLE);
4)schedule()
5)將等待隊列項從等待隊列中移除
remove_wait_queue()
其實(shí),這種休眠方式相當(dāng)于把手工休眠方式一中的第二步prepare_to_wait拆成兩步做了,即prepare_to_wait 《====》add_wait_queue + __set_current_status,其他都是一樣的。
4. 老版本的睡眠函數(shù)sleep_on(wait_queue_head_t *queue):
將當(dāng)前進(jìn)程無條件休眠在給定的等待隊列上,極不贊成使用這個函數(shù),因?yàn)樗鼘Ω倯B(tài)沒有任何保護(hù)機(jī)制。
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209521 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21651
發(fā)布評論請先 登錄
相關(guān)推薦
評論