io多路復用技術對比:select vs epoll

我覺得要理解一個概念,往往需要把幾個相近的概念拿到一起談啸罢,然后對比各種異同财著,這樣才能更好的理解耕皮,并且一通百通。

先談談select谊惭,首先select每次調(diào)用前需要進行FD_SET 關注多少描述符就需要調(diào)用多少次FD_SET汽馋,所以這個是o(n)的操作;其次每次select需要把描述符集合從用戶空間拷貝到內(nèi)核空間圈盔;再次在內(nèi)核中查詢的時候豹芯,select查詢又是o(n)的查詢,每次需遍歷所有的關注的描述符查詢是否滿足條件(可讀或者可寫)驱敲,然后返回給用戶空間铁蹈;最后select的描述符集合實現(xiàn)是數(shù)組,所以大小有一定的限制众眨。

epoll對fd的管理采用紅黑樹握牧,只有當fd真的增刪前才會調(diào)用epoll_ctl(對比select,epoll而不是每次epoll_wait前需要添加所有的fd娩梨,也不會每次epoll_wait前有所有描述符數(shù)據(jù)從用戶空間到內(nèi)核空間的拷貝)沿腰;其次紅黑樹增刪都是o(logN)的操作,比較高效狈定。最后當描述符準備好時矫俺,調(diào)用epoll_wait時,只需要返回滿足條件的描述符鏈表掸冤,這個本身是o(1)的操作。最后epoll本身也是線程安全的友雳,采用紅黑樹時稿湿,不論增刪,復雜度都是0(logN),由于紅黑樹的性質(zhì)押赊,增最多2次旋轉(zhuǎn)饺藤,刪最多3次旋轉(zhuǎn),其余都是染色的過程流礁,所以就算多線程訪問鎖的粒度也比較小涕俗,由于染色操作本身不影響查詢,只需旋轉(zhuǎn)時lock即可神帅。

epoll工作有2種模式再姑,水平觸發(fā)和邊緣觸發(fā),水平觸發(fā)關注的事件是socket層緩沖的可讀或者可寫字節(jié)數(shù)大于1即添加到返回鏈表中找御,邊緣觸發(fā)當其僅當socket層需要的緩沖從不可讀到可讀元镀,或者從不可寫到可寫才會添加到返回鏈表绍填。所以水平模式下,當返回鏈表中描述符返回給用戶的空間后栖疑,再次epoll_wait會在次檢查之前的鏈表是否真沒有關注的事件了讨永,否則再次加入鏈表中,這個相對來說就比較低效了遇革。在寫的場景下epoll需要關注的事件是EPOLLOUT卿闹,如果使用水平觸發(fā),每次寫入完畢后萝快,需要使用EPOLL_CTL_MOD關閉對EPOLLOUT事件的關注锻霎,這個也是相對邊緣觸發(fā)模式下的開銷,所以當寫入越頻繁杠巡,尤其在寫入一個大的數(shù)據(jù)包的時候量窘,由于協(xié)議窗口大小的限制無法一次寫完,這時性能差異就能體現(xiàn)出來氢拥。

還有一個概念不論epoll還是select都沒有進行io操作蚌铜,本質(zhì)都不算同步或者異步io的概念,獲取到關注的描述符信息后還要再次進行io操作嫩海,比如read/write冬殃。read/wirte本身還有一個數(shù)據(jù)從內(nèi)核空間和用戶空間的轉(zhuǎn)換的開銷。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叁怪,一起剝皮案震驚了整個濱河市审葬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奕谭,老刑警劉巖涣觉,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異血柳,居然都是意外死亡官册,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門难捌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膝宁,“玉大人,你說我怎么就攤上這事根吁≡币” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵击敌,是天一觀的道長介返。 經(jīng)常有香客問我,道長愚争,這世上最難降的妖魔是什么映皆? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任挤聘,我火速辦了婚禮,結(jié)果婚禮上捅彻,老公的妹妹穿的比我還像新娘组去。我一直安慰自己,他們只是感情好步淹,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布从隆。 她就那樣靜靜地躺著,像睡著了一般缭裆。 火紅的嫁衣襯著肌膚如雪键闺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天澈驼,我揣著相機與錄音辛燥,去河邊找鬼。 笑死缝其,一個胖子當著我的面吹牛挎塌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播内边,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼榴都,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漠其?” 一聲冷哼從身側(cè)響起嘴高,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎和屎,沒想到半個月后拴驮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡柴信,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年莹汤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠印。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抹竹,靈堂內(nèi)的尸體忽然破棺而出线罕,到底是詐尸還是另有隱情,我是刑警寧澤窃判,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布钞楼,位于F島的核電站,受9級特大地震影響袄琳,放射性物質(zhì)發(fā)生泄漏询件。R本人自食惡果不足惜燃乍,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宛琅。 院中可真熱鬧刻蟹,春花似錦、人聲如沸嘿辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽红伦。三九已至英古,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昙读,已是汗流浹背召调。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛮浑,地道東北人唠叛。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像陵吸,于是被迫代替她去往敵國和親玻墅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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