Linux內(nèi)核里的等待隊列機制在做驅(qū)動開發(fā)時用的非常多,多用來實現(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è)置進程的狀態(tài)
prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)
3)調(diào)用schedule(),告訴內(nèi)核調(diào)度別的進程運行
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è)置進程狀態(tài)
__set_current_status(TASK_INTERRUPTIBLE);
4)schedule()
5)將等待隊列項從等待隊列中移除
remove_wait_queue()
其實,這種休眠方式相當(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)前進程無條件休眠在給定的等待隊列上,極不贊成使用這個函數(shù),因為它對競態(tài)沒有任何保護機制。
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213895 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
317瀏覽量
22415
發(fā)布評論請先 登錄
RT-thread內(nèi)核之消息隊列
學(xué)習(xí)Linux的四個步驟
Linux等待隊列如何實現(xiàn)
Linux內(nèi)核的等待隊列是什么意思?如何實現(xiàn)呢
《Linux內(nèi)核修煉之道》精華版
linux kernel工作隊列及源碼解析
linux kernel工作隊列及源碼詳細講解
poll&&epoll之poll實現(xiàn)

淺談鴻蒙內(nèi)核代碼調(diào)度隊列
鴻蒙內(nèi)核源碼分析:進程和Task的就緒隊列對調(diào)度的作用

音頻處理器擁有四個內(nèi)核來支持支持語音的設(shè)計
Liteos-a內(nèi)核工作隊列的實現(xiàn)原理分析及經(jīng)驗總結(jié)——芯??萍糚PG芯片CS1262接入OpenHarmony實戰(zhàn)

Linux內(nèi)核網(wǎng)絡(luò)擁塞控制算法的實現(xiàn)框架(二)

使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實時 Linux 內(nèi)核

評論