Linux IO模式 select poll epoll詳解

概念說明

  1. 內(nèi)核態(tài)(內(nèi)核空間)和用戶態(tài)(用戶空間)的區(qū)別和聯(lián)系
  • 用戶空間是用戶進(jìn)程所在的內(nèi)存區(qū)域了讨,系統(tǒng)空間是操作系統(tǒng)所在的內(nèi)存區(qū)域
  • 為了保證內(nèi)核安全,處于用戶態(tài)的程序只能訪問用戶空間,而處于內(nèi)核態(tài)的程序可以訪問用戶空間和內(nèi)核空間。

2.文件描述符fd

  • linux將所有設(shè)備都當(dāng)做文件來處理,文件描述符來表示每個(gè)文件對(duì)象悉默。
  • 當(dāng)程序打開一個(gè)現(xiàn)有文件或創(chuàng)建一個(gè)新文件時(shí), 內(nèi)核想進(jìn)城返回一個(gè)文件描述符苟穆。

3.緩存IO

  • Linux的緩存IO機(jī)制中抄课,操作系統(tǒng)會(huì)將IO的數(shù)據(jù)緩存在文件系統(tǒng)的頁緩存中,也就是說數(shù)據(jù)會(huì)先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)雳旅,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間跟磨。

IO模式
對(duì)于一次IO訪問(以read為例),數(shù)據(jù)會(huì)先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中攒盈,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間抵拘。所以說,當(dāng)一個(gè)read操作發(fā)生時(shí)型豁,會(huì)經(jīng)歷兩個(gè)階段:
1.等待數(shù)據(jù)準(zhǔn)備(Waiting for the data to be ready)
2.將數(shù)據(jù)從內(nèi)核拷貝到進(jìn)程中(Copy the data from kernel to the process)

linux系統(tǒng)產(chǎn)生了下面五種網(wǎng)絡(luò)模式的方案:

  • 1.阻塞IO (blocking IO)
  • 2.非阻塞IO (nonblocking IO)
  • 3.IO多路復(fù)用 (IO multiplexing)
  • 4.信號(hào)驅(qū)動(dòng)IO (signal driven IO) 不常用
  • 5.異步IO (asynchonous IO)

1.阻塞模式

阻塞IO流程圖
  • 1.當(dāng)用戶進(jìn)程調(diào)用了系統(tǒng)函數(shù)read僵蛛,kernel就開始了IO的第一個(gè)階段,準(zhǔn)備數(shù)據(jù)(此時(shí)有可能還沒有到一個(gè)完整的包迎变,這個(gè)時(shí)候kernel就需要等待足夠的數(shù)據(jù)到來)充尉,這時(shí)用戶進(jìn)程是阻塞的(當(dāng)然是進(jìn)程自己選擇的阻塞)。
  • 2.當(dāng)kernel一直等到數(shù)據(jù)準(zhǔn)備好氏豌,他就會(huì)將數(shù)據(jù)從kernel中拷貝到用戶內(nèi)存喉酌,然后kernel返回結(jié)果,用戶進(jìn)程才接觸block的狀態(tài)泵喘,重新運(yùn)行起來。
    所以blockingIO的特點(diǎn)就是在IO執(zhí)行的兩個(gè)階段都被block了

2.非阻塞IO

Linux下般妙〖推蹋可以通過設(shè)置socket使其變?yōu)閚on-block。當(dāng)對(duì)一個(gè)non-blocking socket執(zhí)行讀操作時(shí):


非阻塞IO流程圖
  • 1.當(dāng)用戶進(jìn)程發(fā)出read操作時(shí),如果kernel中還沒有準(zhǔn)備好數(shù)據(jù)碟渺,那么它并不會(huì)block用戶進(jìn)程鲜锚,而是立刻返回一個(gè)error。從用戶進(jìn)程角度講,它發(fā)起一個(gè)read操作后芜繁,并不需要等待旺隙。而是馬上就得到了一個(gè)結(jié)果。
  • 2.用戶進(jìn)程判斷結(jié)果是一個(gè)error時(shí) 骏令,它就知道數(shù)據(jù)還沒有準(zhǔn)備好蔬捷,那么它可以再次發(fā)送read操作。
  • 3.一旦kernel中的數(shù)據(jù)準(zhǔn)備好了榔袋,并且又再次收到了用戶進(jìn)程的系統(tǒng)調(diào)用周拐,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存,然后返回凰兑。
    所以妥粟,nonblockingIO的特點(diǎn)是用戶進(jìn)程需要不斷的主動(dòng)詢問kernel數(shù)據(jù)好了沒有。

3.IO多路復(fù)用

IO多路復(fù)用就是我們說的select吏够,poll勾给,epoll有些地方也成這種IO方式為事件驅(qū)動(dòng)IO,這種好處就在于單個(gè)process就可以同時(shí)處理多個(gè)網(wǎng)絡(luò)連接的IO.它的基本原理就是select锅知、poll播急、epoll這個(gè)function會(huì)不斷的輪詢所負(fù)責(zé)的所有socket,只要其中一個(gè)輸數(shù)據(jù)到達(dá)喉镰,就通知用戶線程旅择。


IO多路復(fù)用流程圖
  • 1.當(dāng)用戶進(jìn)程調(diào)用了select,那么整個(gè)用戶進(jìn)程就會(huì)被block 侣姆,而同時(shí)kernel會(huì)監(jiān)視所有select負(fù)責(zé)的socket生真,當(dāng)任何一個(gè)socket中的數(shù)據(jù)準(zhǔn)備好,select就會(huì)返回捺宗,這個(gè)時(shí)候用戶進(jìn)程在調(diào)用read操作柱蟀,將數(shù)據(jù)從kernel拷貝到用戶進(jìn)程。
  • 2.這里需要使用兩個(gè)系統(tǒng)調(diào)用(select和read)蚜厉,而blocking IO 只調(diào)用了一個(gè)系統(tǒng)調(diào)用(read)长已。但是用多路復(fù)用的優(yōu)勢(shì)在于它可以同時(shí)處理多個(gè)connection。
  • 3.如果處理的連接說不是很高的話昼牛,使用IO多路復(fù)用不一定比多線程+阻塞IO的性能好术瓮,可能延遲還更大。IO多路復(fù)用的優(yōu)勢(shì)在于它可以處理更多的連接數(shù)贰健,而不是對(duì)單個(gè)鏈接處理的更好胞四。

所以,IO多路復(fù)用的特點(diǎn)是通過一種機(jī)制一個(gè)進(jìn)程能同時(shí)等待多個(gè)文件秒數(shù)據(jù)伶椿,而這些文件描述符(socket描述符)辜伟,其中的任意一個(gè)進(jìn)入就緒狀態(tài)氓侧,select()函數(shù)就可以返回。

4.異步IO
異步IO流程圖

1.用戶發(fā)起read操作之后导狡,立刻就開始做其他事情约巷。另一方面從kernel的角度,當(dāng)它收到一個(gè)asynchronous read之后旱捧,首先會(huì)立刻返回独郎,所以不會(huì)對(duì)用戶進(jìn)程產(chǎn)生任何block。
2.kernel會(huì)等待數(shù)據(jù)準(zhǔn)備完成廊佩,然后將數(shù)據(jù)拷貝到用戶內(nèi)存囚聚,當(dāng)這一切都完成之后,kernel會(huì)給用戶進(jìn)程發(fā)送一個(gè)signal标锄,告訴它操作已經(jīng)完成了顽铸。

select、poll料皇、epoll區(qū)別

select:IO多路復(fù)用 ---它僅僅知道有IO時(shí)間發(fā)生谓松,卻不知道是哪個(gè)流,只能無差別輪詢所有流找出能讀寫數(shù)據(jù)的流践剂,對(duì)他們進(jìn)行操作 時(shí)間復(fù)雜度為O(n).
poll:IO多路復(fù)用 --- 本質(zhì)上和select無區(qū)別鬼譬,但是它沒有最大連接數(shù)限制,原因是用鏈表來存儲(chǔ) 時(shí)間復(fù)雜度為O(n)
epoll:IO多路復(fù)用 --- event poll逊脯,不同于輪詢优质,epoll會(huì)把哪個(gè)流發(fā)生了怎樣的IO事件通知我們。所以我們說epoll實(shí)際上是基于事件驅(qū)動(dòng)的(每個(gè)事件關(guān)聯(lián)上資源描述符fd)军洼,此時(shí)我們對(duì)這些流的操作都是有意義的巩螃。時(shí)間復(fù)雜度O(1)


總結(jié):

最大連接數(shù):

select:?jiǎn)蝹€(gè)進(jìn)程所能打開的最大連接數(shù)有限,當(dāng)然可以進(jìn)行修改匕争,然后重新編譯內(nèi)核避乏。但是性能可能會(huì)收到影響。
poll:本質(zhì)上和select沒有區(qū)別甘桑,但是沒有最大連接數(shù)限制拍皮。原因是用鏈表來存儲(chǔ)。
epoll:雖然連接數(shù)有上限跑杭,但是很大铆帽,1G內(nèi)存的機(jī)器上可以打開10萬左右連接,2G內(nèi)存的機(jī)器可以20萬德谅。

FD劇增后帶來的IO效率問題

select:因?yàn)槊看握{(diào)用都會(huì)進(jìn)行線性遍歷锄贼,所以隨著FD增加會(huì)造成遍歷速度線性下降。
poll:同select
epoll:因?yàn)槭褂檬录|發(fā)回調(diào)機(jī)制女阀,只有活躍的socket才會(huì)主動(dòng)調(diào)用callback宅荤,所以沒有線性下降的問題,但是如果所有socket都很活躍浸策,會(huì)比select和poll效率低冯键。

消息傳遞方式

select:內(nèi)核需要將消息傳遞到用戶空間,需要內(nèi)核拷貝動(dòng)作
poll:內(nèi)核需要將消息拷貝到用戶空間庸汗,需要內(nèi)核拷貝動(dòng)作
epoll:通過內(nèi)核和用戶空間共享一塊內(nèi)存來實(shí)現(xiàn)(直接內(nèi)存)不需要拷貝動(dòng)作惫确。

1.表面上看epoll的性能最好,但是在連接數(shù)少并且鏈接都十分活躍的情況下蚯舱,select和poll的性能可能比epoll好改化,畢竟epoll的通知機(jī)制需要很多回調(diào)函數(shù)。
2.select低效是因?yàn)槊看味夹枰喸兺骰瑁托б彩窍鄬?duì)的陈肛,視情況而定⌒至眩可以通過良好的設(shè)計(jì)改善句旱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晰奖,隨后出現(xiàn)的幾起案子谈撒,更是在濱河造成了極大的恐慌,老刑警劉巖匾南,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啃匿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛆楞,警方通過查閱死者的電腦和手機(jī)溯乒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臊岸,“玉大人橙数,你說我怎么就攤上這事∷Ы洌” “怎么了灯帮?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逻住。 經(jīng)常有香客問我钟哥,道長(zhǎng),這世上最難降的妖魔是什么瞎访? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任腻贰,我火速辦了婚禮,結(jié)果婚禮上扒秸,老公的妹妹穿的比我還像新娘播演。我一直安慰自己冀瓦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布写烤。 她就那樣靜靜地躺著翼闽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洲炊。 梳的紋絲不亂的頭發(fā)上感局,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音暂衡,去河邊找鬼询微。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狂巢,可吹牛的內(nèi)容都是我干的撑毛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼隧膘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼代态!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疹吃,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤蹦疑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后萨驶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歉摧,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年腔呜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叁温。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡核畴,死狀恐怖膝但,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谤草,我是刑警寧澤跟束,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站丑孩,受9級(jí)特大地震影響冀宴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜温学,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一略贮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦逃延、人聲如沸览妖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽黄痪。三九已至,卻和暖如春盔然,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背是嗜。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工愈案, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹅搪。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓站绪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親丽柿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恢准,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354