Linux內(nèi)核里的等待隊(duì)列機(jī)制在做驅(qū)動(dòng)開發(fā)時(shí)用的非常多,多用來實(shí)現(xiàn)阻塞式訪問,下面簡單總結(jié)了等待隊(duì)列的四種用法,希望對(duì)讀者有所幫助。
1. 睡眠等待某個(gè)條件發(fā)生(條件為假時(shí)睡眠):
睡眠方式:wait_event, wait_event_interruptible
喚醒方式:wake_up (喚醒時(shí)要檢測(cè)條件是否為真,如果還為假則繼續(xù)睡眠,喚醒前一定要把條件變?yōu)檎妫?/p>
2. 手工休眠方式一:
1)建立并初始化一個(gè)等待隊(duì)列項(xiàng)
DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊(duì)列項(xiàng)添加到等待隊(duì)列頭中,并設(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)建立并初始化一個(gè)等待隊(duì)列項(xiàng):
DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊(duì)列項(xiàng)添加到等待隊(duì)列頭中:
add_wait_queue
3)設(shè)置進(jìn)程狀態(tài)
__set_current_status(TASK_INTERRUPTIBLE);
4)schedule()
5)將等待隊(duì)列項(xiàng)從等待隊(duì)列中移除
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)程無條件休眠在給定的等待隊(duì)列上,極不贊成使用這個(gè)函數(shù),因?yàn)樗鼘?duì)競態(tài)沒有任何保護(hù)機(jī)制。
-
Linux
+關(guān)注
關(guān)注
88文章
11622瀏覽量
217821 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
318瀏覽量
23027
發(fā)布評(píng)論請(qǐng)先 登錄
Linux驅(qū)動(dòng)等待隊(duì)列與poll機(jī)制
RT-thread內(nèi)核之消息隊(duì)列
學(xué)習(xí)Linux的四個(gè)步驟
Linux等待隊(duì)列如何實(shí)現(xiàn)
Linux內(nèi)核的等待隊(duì)列是什么意思?如何實(shí)現(xiàn)呢
《Linux內(nèi)核修煉之道》精華版
linux kernel工作隊(duì)列及源碼解析
linux kernel工作隊(duì)列及源碼詳細(xì)講解
poll&&epoll之poll實(shí)現(xiàn)
淺談鴻蒙內(nèi)核代碼調(diào)度隊(duì)列
鴻蒙內(nèi)核源碼分析:進(jìn)程和Task的就緒隊(duì)列對(duì)調(diào)度的作用
音頻處理器擁有四個(gè)內(nèi)核來支持支持語音的設(shè)計(jì)
Liteos-a內(nèi)核工作隊(duì)列的實(shí)現(xiàn)原理分析及經(jīng)驗(yàn)總結(jié)——芯??萍糚PG芯片CS1262接入OpenHarmony實(shí)戰(zhàn)
Linux內(nèi)核網(wǎng)絡(luò)擁塞控制算法的實(shí)現(xiàn)框架(二)
使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) Linux 內(nèi)核

干貨:Linux內(nèi)核中等待隊(duì)列的四個(gè)用法
評(píng)論