RM新时代网站-首页

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

干貨:Linux內核中等待隊列的四個用法

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

Linux內核里的等待隊列機制在做驅動開發(fā)時用的非常多,多用來實現(xiàn)阻塞式訪問,下面簡單總結了等待隊列的四種用法,希望對讀者有所幫助。

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)將等待隊列項添加到等待隊列頭中,并設置進程的狀態(tài)

prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)

3)調用schedule(),告訴內核調度別的進程運行

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)設置進程狀態(tài)

__set_current_status(TASK_INTERRUPTIBLE);

4)schedule()

5)將等待隊列項從等待隊列中移除

remove_wait_queue()

其實,這種休眠方式相當于把手工休眠方式一中的第二步prepare_to_wait拆成兩步做了,即prepare_to_wait 《====》add_wait_queue + __set_current_status,其他都是一樣的。

4. 老版本的睡眠函數(shù)sleep_on(wait_queue_head_t *queue):

將當前進程無條件休眠在給定的等待隊列上,極不贊成使用這個函數(shù),因為它對競態(tài)沒有任何保護機制。

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

    關注

    87

    文章

    11292

    瀏覽量

    209318
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21644
收藏 人收藏

    評論

    相關推薦

    Linux驅動等待隊列與poll機制

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

    RT-thread內核之消息隊列

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

    學習Linux四個步驟

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

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

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

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

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

    Linux內核修煉之道》精華版

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

    linux kernel工作隊列及源碼解析

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

    linux kernel工作隊列及源碼詳細講解

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

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

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

    淺談鴻蒙內核代碼調度隊列

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

    鴻蒙內核源碼分析:進程和Task的就緒隊列對調度的作用

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

    音頻處理器擁有四個內核來支持支持語音的設計

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

    Liteos-a內核工作隊列的實現(xiàn)原理分析及經(jīng)驗總結——芯??萍糚PG芯片CS1262接入OpenHarmony實戰(zhàn)

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

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

    :[Linux內核網(wǎng)絡基礎-TCP相關的幾個關鍵結構體-小記]中進行了介紹,如下圖是四個核心結構體,四個結構的關系具有面向對象的特征,通過層層繼承,實現(xiàn)了類的復用;
    的頭像 發(fā)表于 07-28 11:34 ?816次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>網(wǎng)絡擁塞控制算法的實現(xiàn)框架(二)

    使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核

    盟通技術干貨構建實時Linux內核簡介盟通技術干貨Motrotech如果需要在Linux中實現(xiàn)實時計算性能,進而有效地將
    的頭像 發(fā)表于 04-12 08:36 ?2412次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構建實時 <b class='flag-5'>Linux</b> <b class='flag-5'>內核</b>
    RM新时代网站-首页