水平觸發(fā)和邊沿觸發(fā)

水平觸發(fā)LT(Level Trigger)
邊緣觸發(fā)ET(Edge Trigger)

epoll有EPOLLLT和EPOLLET兩種觸發(fā)模式轻纪,LT是默認(rèn)的模式,ET是“高速”模式兄旬。LT模式下赖瞒,只要這個(gè)fd還有數(shù)據(jù)可讀翁逞,每次 epoll_wait都會返回它的事件总珠,提醒用戶程序去操作办绝,而在ET(邊緣觸發(fā))模式中,它只會提示一次姚淆,直到下次再有數(shù)據(jù)流入之前都不會再提示了,無 論fd中是否還有數(shù)據(jù)可讀屡律。所以在ET模式下腌逢,read一個(gè)fd的時(shí)候一定要把它的buffer讀光,也就是說一直讀到read的返回值小于請求值超埋,或者 遇到EAGAIN錯(cuò)誤搏讶。

進(jìn)一步理解:

在linux的IO多路復(fù)用中有水平觸發(fā),邊緣觸發(fā)兩種模式,這兩種模式的區(qū)別如下:

  • 水平觸發(fā):如果文件描述符已經(jīng)就緒可以非阻塞的執(zhí)行IO操作了,此時(shí)會觸發(fā)通知.允許在任意時(shí)刻重復(fù)檢測IO的狀態(tài).select,poll就屬于水平觸發(fā).

  • 邊緣觸發(fā):如果文件描述符自上次狀態(tài)改變后有新的IO活動(dòng)到來,此時(shí)會觸發(fā)通知.在收到一個(gè)IO事件通知后要盡可能多的執(zhí)行IO操作,因?yàn)槿绻谝淮瓮ㄖ袥]有執(zhí)行完IO那么就需要等到下一次新的IO活動(dòng)到來才能獲取到就緒的描述符.信號驅(qū)動(dòng)式IO就屬于邊緣觸發(fā).

寫過單片機(jī)的人可以從另一方理解水平觸發(fā)和邊緣觸發(fā)的區(qū)別:

  • 水平觸發(fā):就是只有高電平(1)或低電平(0)時(shí)才觸發(fā)通知,只要在這兩種狀態(tài)就能得到通知.上面提到的只要有數(shù)據(jù)可讀(描述符就緒)那么水平觸發(fā)的epoll就立即返回.

  • 邊緣觸發(fā):只有電平發(fā)生變化(高電平到低電平,或者低電平到高電平)的時(shí)候才觸發(fā)通知.上面提到即使有數(shù)據(jù)可讀,但是io狀態(tài)沒有變化epoll也不會立即返回.

epoll既可以采用水平觸發(fā),也可以采用邊緣觸發(fā).

大家可能還不能完全了解這兩種模式的區(qū)別,我們可以舉例說明:一個(gè)管道收到了1kb的數(shù)據(jù),epoll會立即返回,此時(shí)讀了512字節(jié)數(shù)據(jù),然后再次調(diào)用epoll.這時(shí)如果是水平觸發(fā)的,epoll會立即返回,因?yàn)橛袛?shù)據(jù)準(zhǔn)備好了.如果是邊緣觸發(fā)的不會立即返回,因?yàn)榇藭r(shí)雖然有數(shù)據(jù)可讀但是已經(jīng)觸發(fā)了一次通知,在這次通知到現(xiàn)在還沒有新的數(shù)據(jù)到來,直到有新的數(shù)據(jù)到來epoll才會返回,此時(shí)老的數(shù)據(jù)和新的數(shù)據(jù)都可以讀取到(當(dāng)然是需要這次你盡可能的多讀取).所以當(dāng)我們寫epoll網(wǎng)絡(luò)模型時(shí)佳鳖,如果我們用水平觸發(fā)不用擔(dān)心數(shù)據(jù)有沒有讀完因?yàn)橄麓蝒poll返回時(shí),沒有讀完的socket依然會被返回媒惕,但是要注意這種模式下的寫事件系吩,因?yàn)槭撬接|發(fā),每次socket可寫時(shí)epoll都會返回妒蔚,當(dāng)我們寫的數(shù)據(jù)包過大時(shí)穿挨,一次寫不完,要多次才能寫完或者每次socket寫都寫一個(gè)很小的數(shù)據(jù)包時(shí)肴盏,每次寫都會被epoll檢測到科盛,因此長期關(guān)注socket寫事件會無故cpu消耗過大甚至導(dǎo)致cpu跑滿,所以在水平觸發(fā)模式下我們一般不關(guān)注socket可寫事件而是通過調(diào)用socket write或者send api函數(shù)來寫socket菜皂,說到這我們可以看到這種模式在效率上是沒有邊緣觸發(fā)高的贞绵,因?yàn)槊總€(gè)socket讀或者寫可能被返回兩次甚至多次,所以有時(shí)候我們也會用到邊緣觸發(fā)但是這種模式下在讀數(shù)據(jù)的時(shí)候一定要注意恍飘,因?yàn)槿绻淮慰蓪懯录覀儧]有把數(shù)據(jù)讀完榨崩,如果沒有讀完,在socket沒有新的數(shù)據(jù)可讀時(shí)epoll就不回返回了章母,只有在新的數(shù)據(jù)到來時(shí)母蛛,我們才能讀取到上次沒有讀完的數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胳施,一起剝皮案震驚了整個(gè)濱河市溯祸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舞肆,老刑警劉巖焦辅,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異椿胯,居然都是意外死亡筷登,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門哩盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來前方,“玉大人,你說我怎么就攤上這事廉油』菹眨” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵抒线,是天一觀的道長班巩。 經(jīng)常有香客問我,道長嘶炭,這世上最難降的妖魔是什么抱慌? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任逊桦,我火速辦了婚禮,結(jié)果婚禮上抑进,老公的妹妹穿的比我還像新娘强经。我一直安慰自己,他們只是感情好寺渗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布匿情。 她就那樣靜靜地躺著,像睡著了一般户秤。 火紅的嫁衣襯著肌膚如雪码秉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天鸡号,我揣著相機(jī)與錄音转砖,去河邊找鬼。 笑死鲸伴,一個(gè)胖子當(dāng)著我的面吹牛府蔗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汞窗,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼姓赤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仲吏?” 一聲冷哼從身側(cè)響起不铆,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裹唆,沒想到半個(gè)月后誓斥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡许帐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年劳坑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成畦。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡距芬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出循帐,到底是詐尸還是另有隱情框仔,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布拄养,位于F島的核電站存和,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捐腿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柿顶。 院中可真熱鬧茄袖,春花似錦、人聲如沸嘁锯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽家乘。三九已至蝗羊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仁锯,已是汗流浹背耀找。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留业崖,地道東北人野芒。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像双炕,于是被迫代替她去往敵國和親狞悲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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