select 和 epoll 區(qū)別

select原理

  • 將 文件描述符集合 fd_set 從用戶空間拷貝到內(nèi)核空間井联,進入內(nèi)核態(tài)
  • 遍歷所有的文件描述符,對每個文件描述符調(diào)用 poll(), 該函數(shù)返回一組標準掩碼娄猫,其中各個位指示相對應的文件描述符的就緒狀態(tài)(全為0表示沒有任何事件就緒),根據(jù)掩碼對 fd_set 進行賦值,如果沒有文件就緒且時間未到則會進入短暫的睡眠衫生,然后再恢復并再次對 fd_set 輪詢調(diào)用 poll(), 如此反復,直到有文件就緒或者時間到達土浸。
  • 只要有文件就緒罪针,函數(shù)就返回, 將fd_set 再次從內(nèi)核空間拷貝到用戶空間黄伊,系統(tǒng)返回用戶態(tài)泪酱,用戶就可以對相應的文件進行讀和寫了

epoll原理

epoll 一共有三個函數(shù),分別是 epoll_create() , epoll_ctl(),
epoll_wait()
还最。
下面介紹三個函數(shù)的原理
epoll_create()

該函數(shù)建立一個epoll句柄

內(nèi)核在epoll文件系統(tǒng)中建立了一個 file節(jié)點
在內(nèi)核緩沖區(qū) Cache 中建立一棵紅黑樹和一條雙向鏈表墓阀, 紅黑樹用來存儲以后 epoll_ctl() 注冊的文件描述符, 雙向鏈表用來存放就緒的文件描述符憋活。

epoll_ctl()
該函數(shù)是功能是將被監(jiān)聽的文件描述符添加到epoll句柄岂津,或者從epoll句柄中刪除,或者更改文件描述符的監(jiān)聽狀態(tài)

將對應的文件描述符添加到紅黑樹中悦即,或者從紅黑樹中刪除吮成,當將文件描述添加到紅黑樹時,并給內(nèi)核中斷函數(shù)注冊一條回調(diào)函數(shù)辜梳,告訴內(nèi)核粱甫,如果該文件描述符就緒,將其添加到就緒鏈表中

epoll_wait()
該函數(shù)返回就緒的文件描述和就緒數(shù)目的大小

該函數(shù)觀察就緒鏈表中的數(shù)據(jù)作瞄,有數(shù)據(jù)就返回茶宵,沒數(shù)據(jù)就sleep,直到有事件發(fā)生或者事件到達

select 和 epoll 的優(yōu)缺點:

select 缺點

  • 最大并發(fā)數(shù)有限制宗挥,默認數(shù)量是1024個
  • 每次都會線性地掃描整個 文件描述符集合 fd_set, 集合越大乌庶,速度越慢,效率延展性差
  • 每次調(diào)用都需要在用戶空間和內(nèi)核空間來回的拷貝契耿,而且每次調(diào)用select需要重新初始化 fd_set

epoll 效率提升

  • 最大并發(fā)數(shù)量沒有限制瞒大,依賴于系統(tǒng)所能打開的最大文件數(shù)目限制
  • 只有已經(jīng)就緒的文件才會主動觸發(fā)回調(diào)函數(shù),效率和文件數(shù)目大小無關搪桂,性能延展性好
  • 省去了不必要的拷貝

當然以上優(yōu)點是在特定環(huán)境下:
高并發(fā)透敌,且任意時間只有少量的文件是活躍的,如果并發(fā)量低,文件活躍地多酗电,select就不一定比 epoll 慢魄藕。

文件描述符何時就緒

正確使用select和epoll需要理解在什么情況下,文件描述符會表示為就緒態(tài)撵术。
SUSv3中說:如果對I/O函數(shù)的調(diào)用不會被阻塞背率,而不論該函數(shù)是否能夠?qū)嶋H傳輸數(shù)據(jù),此時文件描述符(未指定 O_NONBLOCK 標志)被認為是就緒的荷荤。
select 和 epoll 只會告訴我們 I/O 操作是否會阻塞退渗, 而不是告訴我們到底能否成功傳輸數(shù)據(jù)。

epoll的水平觸發(fā)LT和邊緣觸發(fā)ET

默認情況下蕴纳,epoll提供的是水平觸發(fā)通知,表示epoll會告訴我們何時能在文件描述符上以非阻塞的方式執(zhí)行 I/O 操作个粱。 這和 select所提供的通知類型相同
epoll的邊緣觸發(fā)通知古毛,表示自從上一次調(diào)用epoll_wait() 依賴,文件上是否已經(jīng)有 I/O活動了都许,如果有多個I/O 事件發(fā)生的話稻薇,epoll將它們合并成一次單獨的通知, 通過epoll_wait() 返回胶征。 注意: 這里不同于信號驅(qū)動 I/O, 信號驅(qū)動 I/O中會產(chǎn)生多個信號塞椎。
想象下面一種情景
使用epoll監(jiān)視一個套接字上的輸入 (EPOLLIN), 接下來會發(fā)生如下事件。

  1. 套接字上有輸入的到來睛低。
  2. 調(diào)用一次 epoll_wait()案狠。無論采用 LT 還是 ET , 該調(diào)用都會告訴我們套接字已經(jīng)處于就緒狀態(tài)。
  3. 再次調(diào)用 epoll_wait()
    如果是 LT 模式钱雷,函數(shù)仍將直接返回骂铁,告訴我們套接字處于 就緒 狀態(tài)。
    如果是 ET 模式罩抗, 函數(shù)將 阻塞拉庵, 因為自從第一次 調(diào)用 epoll_wait() 之后,并沒有新的輸入到來套蒂。

邊緣觸發(fā)通知通常和非阻塞文件描述符結合使用

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞支,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子操刀,更是在濱河造成了極大的恐慌烁挟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍刮,死亡現(xiàn)場離奇詭異信夫,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門静稻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來警没,“玉大人,你說我怎么就攤上這事振湾∩奔#” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵押搪,是天一觀的道長树酪。 經(jīng)常有香客問我,道長大州,這世上最難降的妖魔是什么续语? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮厦画,結果婚禮上疮茄,老公的妹妹穿的比我還像新娘。我一直安慰自己根暑,他們只是感情好力试,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著排嫌,像睡著了一般畸裳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淳地,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天怖糊,我揣著相機與錄音,去河邊找鬼薇芝。 笑死蓬抄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的夯到。 我是一名探鬼主播嚷缭,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耍贾!你這毒婦竟也來了阅爽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤荐开,失蹤者是張志新(化名)和其女友劉穎付翁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晃听,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡百侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年砰识,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佣渴。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辫狼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辛润,到底是詐尸還是另有隱情膨处,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布砂竖,位于F島的核電站真椿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乎澄。R本人自食惡果不足惜突硝,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望三圆。 院中可真熱鬧狞换,春花似錦囱桨、人聲如沸低斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽路媚。三九已至,卻和暖如春樊销,著一層夾襖步出監(jiān)牢的瞬間整慎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工围苫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裤园,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓剂府,卻偏偏與公主長得像拧揽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腺占,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

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