epoll的LT和ET

1 socket IO事件

1.1 讀事件

讀事件:句柄從不可讀變成可讀邓嘹,或者句柄寫緩沖區(qū)有新的數據進來且超過SO_RCVLOWAT。
常見的產生讀事件有如下幾種:

  • socket有一個未清除的錯誤惰说。如非阻塞的connect連接錯誤會使socket變成可讀寫狀態(tài)。
  • 非阻塞accept有新的連接進來奴烙。
  • socket寫對端關閉助被,read返回0剖张。
  • socket讀緩沖區(qū)有新的數據進來且超過SO_RCVLOWAT

1.2 寫事件

寫事件:句柄從不可寫變成可寫,或者句柄寫緩沖區(qū)有新的數據進來而且緩沖區(qū)水位高于SO_SNDLOWAT揩环。常見的寫事件事件有如下幾種:

  • socket有一個未清除的錯誤搔弄。例如非阻塞connect連接出錯會導致socket變成可讀可寫狀態(tài)。
  • 非阻塞connect連接成功后端口狀態(tài)會變成可寫丰滑。
  • socket讀對端關閉顾犹,socket變成可寫狀態(tài),產生SIGPIPE信號褒墨。
  • socket寫緩沖區(qū)有新的數據進來且超過SO_SNDLOWAT
    在epoll中炫刷,讀事件對應EPOLLIN,寫事件對應EPOLLOUT郁妈。

2 ET

句柄在發(fā)生讀寫事件時只會通知用戶一次
ET模式主要關注fd從不可用到可用或者可用到不可用的情況浑玛。
ET只支持非阻塞模式。

2.1 應用層邏輯

ET模式下讀寫操作要時用wihle循環(huán)噩咪,直到讀/寫夠足夠多的數據顾彰,或者讀/寫到返回EAGAIN。尤其時在寫大塊數據時胃碾,一次write操作不足以寫完全部數據涨享,或者在讀大塊數據時,應用層緩沖區(qū)數據太小仆百,一次read操作不足以讀完全部數據厕隧,應用層要么一直調用while循環(huán)一直IO到EGAIN,或者自己調用epoll_ctl手動觸發(fā)ET響應。

2.2 優(yōu)缺點

缺點:應用層業(yè)務邏輯復雜俄周,容易遺漏事件吁讨,很難用好。
優(yōu)點:相對LT模式效率比較高峦朗。

3 LT

只要句柄一直處于可用狀態(tài)挡爵,就會一直通知用戶。
LT模式下甚垦,句柄讀緩沖區(qū)被讀空后,句柄會從可用轉變未不可以用涣雕,這個時候不會通知用戶艰亮。寫緩沖區(qū)只要還沒寫滿,就會一直通知用戶挣郭。
LT模式支持阻塞和非阻塞兩種方式迄埃。epoll默認的模式是LT。
LT下兑障,應用層的業(yè)務邏輯比較簡單侄非,更不容易遺漏事件蕉汪,更不容易出錯。通常逞怨,在將數據寫完后者疤,我們會關閉句柄的寫事件。

3.1 優(yōu)缺點

優(yōu)點:編程更符合用戶直覺叠赦,業(yè)務層邏輯更簡單驹马。
缺點:效率比ET低。

3.2 ET比LT更高效得原因

ET在通知用戶后除秀,就會把fd從就緒隊列里刪除糯累。而LT通知用戶后fd還在就緒鏈表中,隨著fd的增多册踩,就緒鏈表越大泳姐。下次epoll要通知用戶時還需要遍歷整個就緒鏈表。遍歷的性能是線性暂吉,如果fd的數量非常多胖秒,就會帶來比較顯著的效率下降。
同樣數量的fd下借笙,LT模式維護的就緒鏈表比ET的大扒怖。

3.3 非阻塞模式下的accept該用什么觸發(fā)模式?

LT和ET各有優(yōu)缺點业稼。使用哪種模式取決于并發(fā)量盗痒。當并發(fā)量比較小時,比較推薦LT低散,因為LT模式下應用的讀寫邏輯比較簡單俯邓,不容易遺漏事件,代碼不易出錯好維護熔号,而且性能損失不大稽鞭。當并發(fā)量非常大時,推薦使用ET模式引镊,可以有效提升EPOLL效率朦蕴。

3.4 LT模式下,可寫狀態(tài)的fd會一直觸發(fā)事件弟头,該怎么處理這個問題

  • 方法1:每次要寫數據時吩抓,將fd綁定EPOLLOUT事件,寫完后將fd同EPOLLOUT從epoll中移除赴恨。
  • 方法2:方法一中每次寫數據都要操作epoll疹娶。如果數據量很少,socket很容易將數據發(fā)送出去伦连∮杲龋可以考慮改成:數據量很少時直接send钳垮,數據量很多時在采用方法1.

應用

使用ET的例子

nginx

使用LT的例子

redis

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市额港,隨后出現的幾起案子饺窿,更是在濱河造成了極大的恐慌,老刑警劉巖锹安,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件短荐,死亡現場離奇詭異,居然都是意外死亡叹哭,警方通過查閱死者的電腦和手機忍宋,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來风罩,“玉大人糠排,你說我怎么就攤上這事〕” “怎么了入宦?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長室琢。 經常有香客問我乾闰,道長,這世上最難降的妖魔是什么盈滴? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任涯肩,我火速辦了婚禮,結果婚禮上巢钓,老公的妹妹穿的比我還像新娘病苗。我一直安慰自己,他們只是感情好症汹,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布硫朦。 她就那樣靜靜地躺著,像睡著了一般背镇。 火紅的嫁衣襯著肌膚如雪咬展。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天瞒斩,我揣著相機與錄音挚赊,去河邊找鬼。 笑死济瓢,一個胖子當著我的面吹牛,可吹牛的內容都是我干的妹卿。 我是一名探鬼主播旺矾,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蔑鹦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了箕宙?” 一聲冷哼從身側響起嚎朽,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柬帕,沒想到半個月后哟忍,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡陷寝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年锅很,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凤跑。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡爆安,死狀恐怖,靈堂內的尸體忽然破棺而出仔引,到底是詐尸還是另有隱情扔仓,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布咖耘,位于F島的核電站翘簇,受9級特大地震影響,放射性物質發(fā)生泄漏儿倒。R本人自食惡果不足惜版保,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望义桂。 院中可真熱鬧找筝,春花似錦、人聲如沸慷吊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溉瓶。三九已至急鳄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堰酿,已是汗流浹背疾宏。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留触创,地道東北人坎藐。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岩馍。 傳聞我的和親對象是個殘疾皇子碉咆,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容

  • title: 論事件驅動與異步IOtag: 事件驅動 異步IOcategories: notes 轉載自人云思云 ...
    cmustard閱讀 965評論 0 0
  • iPhone的標準推薦是CFNetwork 庫編程,其封裝好的開源庫是 cocoa AsyncSocket庫蛀恩,用它...
    Ethan_Struggle閱讀 2,245評論 2 12
  • 作者:靜海聽風鏈接:https://www.zhihu.com/question/20122137/answer/...
    C_A_dogN閱讀 2,895評論 0 4
  • 4.17週一 雨 下雨天疫铜,氣溫驟降,又濕又冷的大理又是一種不一樣的感覺双谆。路上行人極少壳咕,地裡沒人乾活,田野一片祥靜...
    薇薇董閱讀 191評論 0 0
  • 一段時間以來確實忙了點顽馋,84天的陪伴中成長,沒能做完趣避,故此庞呕,成長記錄半路停止了,小小遺憾住练。但我盡可能的發(fā)現歡兒的點...
    歡歡樂樂1317閱讀 386評論 0 0