Wait_Queue------等待隊(duì)列的喚醒事件

wake_up()與wait_event()或者wait_event_timeout成對使用蚂且,

wake_up_intteruptible()與wait_event_intteruptible()或者wait_event_intteruptible_timeout()成對使用上渴。


在 Linux 中, 一個(gè)等待隊(duì)列由一個(gè)"等待隊(duì)列頭"來管理, 一個(gè) wait_queue_head_t 類型的結(jié)構(gòu), 定義在中. 一個(gè)等待隊(duì)列頭可被定義和初始化, 使用:

DECLARE_WAIT_QUEUE_HEAD(name);

或者動態(tài)地, 如下:

wait_queue_head_t my_queue;

init_waitqueue_head(&my_queue);


1类腮、簡單睡眠:? ?

Linux 內(nèi)核中睡眠的最簡單方式是一個(gè)宏定義, 稱為 wait_event(有幾個(gè)變體); 它結(jié)合了處理睡眠的細(xì)節(jié)和進(jìn)程在等待的條件的檢查. wait_event 的形式是:

wait_event(queue, condition)

wait_event_interruptible(queue, condition)

wait_event_timeout(queue, condition, timeout)

wait_event_interruptible_timeout(queue, condition, timeout)

這些東西如何使用私杜?queue 是等待隊(duì)列頭秋冰,condition 是條件妇智,如果調(diào)用 wait_event 前 condition == 0 拙友,則調(diào)用 wait_event 之后,當(dāng)前進(jìn)程就會休眠


wait_event:

將當(dāng)前進(jìn)程的狀態(tài)設(shè)置為 TASK_UNINTERRUPTIBLE? 背苦,然后 schedule()


wait_event_interruptible:? ? ? ?

TASK_INTERRUPTIBLE? ? 互捌,然后 schedule()


wait_event_timeout:? ? ? ? ? ? ?

TASK_UNINTERRUPTIBLE? ,然后 schedule_timeout()


wait_event_interruptible_timeout:

TASK_INTERRUPTIBLE? ? , 然后 schedule_timeout()


TASK_INTERRUPTIBLE 與 TASK_UNINTERRUPTIBLE 區(qū)別在于:

它的休眠是否會被信號打斷行剂,別的進(jìn)程發(fā)來一個(gè)信號比如 kill 秕噪,TASK_INTERRUPTIBLE 就會醒來去處理。然而 TASK_UNINTERRUPTIBLE 不會硼讽。schedule()巢价,進(jìn)程調(diào)度牲阁,而schedule_timeout()進(jìn)行調(diào)度之后固阁,一定時(shí)間后自動喚醒。


對應(yīng)于不同的進(jìn)程狀態(tài)城菊,使用不同的喚醒函數(shù):

void wake_up(wait_queue_head_t *queue);

void wake_up_interruptible(wait_queue_head_t *queue);

喚醒時(shí)很有意思备燃,比如你調(diào)用 wake_up 去喚醒一個(gè)使用 wait_event 等,進(jìn)入休眠的進(jìn)程凌唬,喚醒之后并齐,它會判斷 condition 是否為真,如果還是假的繼續(xù)睡眠客税。


2况褪、手動睡眠:

? ? ? ? DECLARE_WAITQUEUE(name, tsk)? 創(chuàng)建一個(gè)等待隊(duì)列:

? ? ? ? ? ? ? ? ? ? ? ? tsk一般為當(dāng)前進(jìn)行current. 這個(gè)宏定義并初始化一個(gè)名為name的等待隊(duì)列.

? ? ? ? 將等待隊(duì)列頭 加入/移除 等待隊(duì)列:

? ? ? ? ? ? ? ? ? ? ? void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

? ? ? ? ? ? ? ? ? ? ? void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait);

? ? ? ? ? ? ? ? ? ? ? void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

? ? ? ? 設(shè)置進(jìn)程狀態(tài):

? ? ? ? ? ? ? ? ? ? ? set_current_state(TASK_INTERRUPTIBLE) 等

? ? ? ? 進(jìn)程調(diào)度:?

? ? ? ? ? ? ? ? ? ? ? schedule() 或者 schedule_timeout()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市更耻,隨后出現(xiàn)的幾起案子测垛,更是在濱河造成了極大的恐慌,老刑警劉巖秧均,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件食侮,死亡現(xiàn)場離奇詭異,居然都是意外死亡目胡,警方通過查閱死者的電腦和手機(jī)锯七,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉己,“玉大人眉尸,你說我怎么就攤上這事。” “怎么了噪猾?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵地消,是天一觀的道長。 經(jīng)常有香客問我畏妖,道長脉执,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任戒劫,我火速辦了婚禮半夷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迅细。我一直安慰自己巫橄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布茵典。 她就那樣靜靜地躺著湘换,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统阿。 梳的紋絲不亂的頭發(fā)上彩倚,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音扶平,去河邊找鬼帆离。 笑死,一個(gè)胖子當(dāng)著我的面吹牛结澄,可吹牛的內(nèi)容都是我干的哥谷。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼麻献,長吁一口氣:“原來是場噩夢啊……” “哼们妥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勉吻,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤监婶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后餐曼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压储,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年源譬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了集惋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踩娘,死狀恐怖刮刑,靈堂內(nèi)的尸體忽然破棺而出喉祭,到底是詐尸還是另有隱情,我是刑警寧澤雷绢,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布泛烙,位于F島的核電站,受9級特大地震影響翘紊,放射性物質(zhì)發(fā)生泄漏蔽氨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一帆疟、第九天 我趴在偏房一處隱蔽的房頂上張望鹉究。 院中可真熱鬧,春花似錦踪宠、人聲如沸自赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍妨。三九已至,卻和暖如春柬脸,著一層夾襖步出監(jiān)牢的瞬間他去,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工肖粮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孤页,地道東北人尔苦。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓涩馆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親允坚。 傳聞我的和親對象是個(gè)殘疾皇子魂那,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)稠项,斷路器涯雅,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 看到網(wǎng)上有不少討論epoll活逆,但大多不夠詳細(xì)準(zhǔn)確,以前面試有被問到這個(gè)問題拗胜。不去更深入的了解蔗候,只能停留在知其然...
    電臺_Fang閱讀 11,572評論 0 8
  • 名稱 libev - 一個(gè) C 編寫的功能全面的高性能事件循環(huán)。 概要 示例程序 關(guān)于 libev Libev 是...
    hanpfei閱讀 15,218評論 0 5
  • 我:“人生導(dǎo)師大人所灸,謝謝賞賜丽惶,好久沒吃的這么爽了,一個(gè)人兩人份” 妹:“那你爬立,你跪安吧” 不對啊钾唬,我吃了她心愛的早...
    苗條瘦身閱讀 317評論 0 1
  • 看完了七月與安生,真的是哭的不行侠驯,不知道為什么知纷,閨蜜情是多么的珍貴,她們兩個(gè)人雖然從18歲就聚少離多但是好像時(shí)...
    在未來徘徊的快樂閱讀 191評論 0 0