0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

干貨:Linux內(nèi)核中等待隊列的四個用法

如意 ? 來源:CSDN ? 作者:楊碩 ? 2020-06-20 09:59 ? 次閱讀

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ī)制。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209521
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21651
收藏 人收藏

    評論

    相關(guān)推薦

    Linux驅(qū)動等待隊列與poll機(jī)制

    ,可以極大的減輕CPU負(fù)荷,在進(jìn)程掛起是可以讓CPU去執(zhí)行其它資源。而通過等待隊列的方式就可實(shí)現(xiàn)進(jìn)程阻塞,滿足要求時再喚醒進(jìn)程。
    的頭像 發(fā)表于 09-25 09:00 ?1921次閱讀
    <b class='flag-5'>Linux</b>驅(qū)動<b class='flag-5'>等待</b><b class='flag-5'>隊列</b>與poll機(jī)制

    RT-thread內(nèi)核之消息隊列

    ,接著再初始化消息隊列,此時消息隊列為空。刪除消息隊列:rt_err_t rt_mq_delete(rt_mq_t mq);刪除消息隊列時,如果有線程被掛起在該消息
    發(fā)表于 03-06 17:17

    學(xué)習(xí)Linux四個步驟

    學(xué)習(xí)Linux四個步驟解答:學(xué)習(xí)Linux四個步驟假設(shè)你是計算機(jī)科班出身,計算機(jī)系的基本課程如數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、體系結(jié)構(gòu)、編譯原理、計算機(jī)網(wǎng)絡(luò)你全修過我想大概可以分為4
    發(fā)表于 09-24 15:27

    Linux等待隊列如何實(shí)現(xiàn)

    在軟件開發(fā)中任務(wù)經(jīng)常由于某種條件沒有得到滿足而不得不進(jìn)入睡眠狀態(tài),然后等待條件得到滿足的時候再繼續(xù)運(yùn)行,進(jìn)入運(yùn)行狀態(tài)。這種需求需要等待隊列機(jī)制的支持。Linux中提供了
    發(fā)表于 08-05 07:47

    Linux內(nèi)核等待隊列是什么意思?如何實(shí)現(xiàn)呢

    Linux內(nèi)核等待隊列是以雙循環(huán)鏈表為基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),與進(jìn)程調(diào)度機(jī)制緊密結(jié)合,能夠用于實(shí)現(xiàn)核心的異步事件通知機(jī)制。在這個鏈表中,有兩種數(shù)據(jù)結(jié)構(gòu):等待
    發(fā)表于 08-29 16:42

    Linux內(nèi)核修煉之道》精華版

    本書將Linux內(nèi)核的學(xué)習(xí)分為四個層次:全面了解,掌握基本功;興趣導(dǎo)向,選擇重點(diǎn)深度鉆研;融入
    發(fā)表于 11-09 17:05 ?0次下載

    linux kernel工作隊列及源碼解析

    1. 前言 工作隊列(workqueue)的Linux內(nèi)核中的定義的用來處理不是很緊急事件的回調(diào)方式處理方法。 以下代碼的linux內(nèi)核版本
    發(fā)表于 10-27 10:19 ?0次下載

    linux kernel工作隊列及源碼詳細(xì)講解

    1. 前言 工作隊列(workqueue)的Linux內(nèi)核中的定義的用來處理不是很緊急事件的回調(diào)方式處理方法. 以下代碼的linux內(nèi)核版本
    發(fā)表于 11-30 17:43 ?613次閱讀

    poll&&epoll之poll實(shí)現(xiàn)

    Linux內(nèi)核中等待隊列有很多用途,可用于中斷處理、進(jìn)程同步及定時。我們在這里只說,進(jìn)程經(jīng)常必須等待某些事件的發(fā)生。
    發(fā)表于 05-14 14:41 ?848次閱讀
    poll&&epoll之poll實(shí)現(xiàn)

    淺談鴻蒙內(nèi)核代碼調(diào)度隊列

    鴻蒙內(nèi)核代碼中有兩源文件是關(guān)于隊列的,一是用于調(diào)度的隊列,另一是用于線程間通訊的IPC
    的頭像 發(fā)表于 10-23 11:00 ?2024次閱讀

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

    鴻蒙內(nèi)核代碼中有兩源文件是關(guān)于隊列的,一是用于調(diào)度的隊列,另一是用于線程間通訊的IPC
    發(fā)表于 11-23 15:48 ?31次下載
    鴻蒙<b class='flag-5'>內(nèi)核</b>源碼分析:進(jìn)程和Task的就緒<b class='flag-5'>隊列</b>對調(diào)度的作用

    音頻處理器擁有四個內(nèi)核來支持支持語音的設(shè)計

    Knowles 的新音頻處理器具有四個異構(gòu)內(nèi)核和 5.7 MB 共享內(nèi)存,適用于手機(jī)、耳戴式可穿戴設(shè)備、智能揚(yáng)聲器、電視和電器等語音驅(qū)動設(shè)備。
    的頭像 發(fā)表于 08-11 14:30 ?1413次閱讀

    Liteos-a內(nèi)核工作隊列的實(shí)現(xiàn)原理分析及經(jīng)驗(yàn)總結(jié)——芯海科技PPG芯片CS1262接入OpenHarmony實(shí)戰(zhàn)

    摘要OpenHarmony系統(tǒng)中使用了liteos-m、liteos-a、linux三種內(nèi)核,工作隊列linux內(nèi)核引入的一種異步處理機(jī)制
    的頭像 發(fā)表于 04-26 09:26 ?2132次閱讀
    Liteos-a<b class='flag-5'>內(nèi)核</b>工作<b class='flag-5'>隊列</b>的實(shí)現(xiàn)原理分析及經(jīng)驗(yàn)總結(jié)——芯??萍糚PG芯片CS1262接入OpenHarmony實(shí)戰(zhàn)

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

    :[Linux內(nèi)核網(wǎng)絡(luò)基礎(chǔ)-TCP相關(guān)的幾個關(guān)鍵結(jié)構(gòu)體-小記]中進(jìn)行了介紹,如下圖是四個核心結(jié)構(gòu)體,四個結(jié)構(gòu)的關(guān)系具有面向?qū)ο蟮奶卣?,通過層層繼承,實(shí)現(xiàn)了類的復(fù)用;
    的頭像 發(fā)表于 07-28 11:34 ?829次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>網(wǎng)絡(luò)擁塞控制算法的實(shí)現(xiàn)框架(二)

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

    盟通技術(shù)干貨構(gòu)建實(shí)時Linux內(nèi)核簡介盟通技術(shù)干貨Motrotech如果需要在Linux中實(shí)現(xiàn)實(shí)時計算性能,進(jìn)而有效地將
    的頭像 發(fā)表于 04-12 08:36 ?2473次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時 <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>