[OS] I/O模型

背景

阻塞

阻塞這個(gè)詞來自操作系統(tǒng)的線程/進(jìn)程的狀態(tài)模型中浪腐,如下圖:


一個(gè)線程/進(jìn)程經(jīng)歷的5個(gè)狀態(tài)纵揍,創(chuàng)建,就緒议街,運(yùn)行泽谨,阻塞,終止特漩。
各個(gè)狀態(tài)的轉(zhuǎn)換條件如上圖吧雹,其中有個(gè)阻塞狀態(tài),就是說當(dāng)線程中調(diào)用某個(gè)函數(shù)涂身,需要I/O請求雄卷,或者暫時(shí)得不到競爭資源的,操作系統(tǒng)會(huì)把該線程阻塞起來蛤售,避免浪費(fèi)CPU資源丁鹉,等到得到了資源,再變成就緒狀態(tài)悴能,等待CPU調(diào)度運(yùn)行揣钦。

UNIX I/O模型

Unix下可用的5種I/O模型:
(1)阻塞式I/O
(2)非阻塞式I/O
(3)I/O復(fù)用
(4)信號驅(qū)動(dòng)式I/O
(5)異步I/O

輸入操作

一個(gè)輸入操作通常包括兩個(gè)不同的階段:
(1)等待數(shù)據(jù)準(zhǔn)備好
(2)從內(nèi)核向進(jìn)程復(fù)制數(shù)據(jù)

而對于一個(gè)套接字上的輸入操作:
(1)等待數(shù)據(jù)從網(wǎng)絡(luò)中到達(dá),當(dāng)所等待分組到達(dá)時(shí)搜骡,它被復(fù)制到內(nèi)核中的某個(gè)緩沖區(qū)
(2)把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)

1. 阻塞式I/O模型(blocking I/O)

我們把recvfrom函數(shù)視為系統(tǒng)調(diào)用拂盯,因?yàn)槲覀儏^(qū)分了應(yīng)用程序和內(nèi)核。
不論它如何實(shí)現(xiàn)记靡,一般都會(huì)從在應(yīng)用進(jìn)程空間中運(yùn)行切換到內(nèi)核空間中運(yùn)行谈竿,
一段時(shí)間之后再切換回來。

上圖中摸吠,進(jìn)程調(diào)用recvfrom空凸,其系統(tǒng)調(diào)用直到數(shù)據(jù)報(bào)到達(dá)且被復(fù)制到應(yīng)用進(jìn)程的緩沖區(qū)中或者發(fā)生錯(cuò)誤才返回。最常見的錯(cuò)誤是系統(tǒng)調(diào)用被信號中斷寸痢。我們說呀洲,進(jìn)程在從調(diào)用recvfrom開始到它返回的整段時(shí)間內(nèi)是被阻塞的。recvfrom成功返回后,應(yīng)用進(jìn)程開始處理數(shù)據(jù)報(bào)道逗。

2. 非阻塞式I/O模型(nonblocking I/O)

前三次調(diào)用recvfrom時(shí)沒有數(shù)據(jù)可返回兵罢,因此內(nèi)核轉(zhuǎn)而立即返回一個(gè)EWOULDBLOCK錯(cuò)誤。第四次調(diào)用recvfrom時(shí)已有一個(gè)數(shù)據(jù)報(bào)準(zhǔn)備好滓窍,它被復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)卖词,于是recvfrom成功返回。

當(dāng)一個(gè)應(yīng)用進(jìn)程像這樣對一個(gè)非阻塞描述符循環(huán)調(diào)用recvfrom時(shí)吏夯,我們稱之為輪詢(polling)此蜈。應(yīng)用進(jìn)程持續(xù)輪詢內(nèi)核,以查看某個(gè)操作是否就緒噪生。這么做往往耗費(fèi)大量CPU時(shí)間裆赵,不過這種模型偶爾也會(huì)遇到,通常是在專門提供某一功能的系統(tǒng)中才有跺嗽。

3. I/O復(fù)用模型(I/O multiplexing)

有了I/O復(fù)用战授,我們就可以調(diào)用select或poll,阻塞在這兩個(gè)系統(tǒng)調(diào)用中的某一個(gè)之上抛蚁,而不是阻塞在真正的I/O系統(tǒng)調(diào)用之上陈醒。

我們阻塞于select調(diào)用,等待數(shù)據(jù)報(bào)套接字變?yōu)榭勺x瞧甩。當(dāng)select返回套接字可讀這一條件時(shí)钉跷,我們調(diào)用recvfrom把所讀數(shù)據(jù)報(bào)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)。select的優(yōu)勢在于我們可以等待多個(gè)描述符就緒肚逸。

4. 信號驅(qū)動(dòng)式I/O模型(signal-driven I/O)

我們可以使用信號爷辙,讓內(nèi)核在描述符就緒時(shí)發(fā)送SIGIO信號通知我們。
我們稱這種模型為信號驅(qū)動(dòng)式I/O朦促。

我們首先通過sigaction系統(tǒng)調(diào)用安裝一個(gè)信號處理函數(shù)膝晾。該系統(tǒng)調(diào)用將立即返回,我們的進(jìn)程繼續(xù)工作务冕,也就是說它沒有被阻塞血当。當(dāng)數(shù)據(jù)報(bào)準(zhǔn)備好讀取時(shí),內(nèi)核就為該進(jìn)程產(chǎn)生一個(gè)SIGIO信號禀忆。我們隨后既可以在信號處理函數(shù)中調(diào)用recvfrom讀取數(shù)據(jù)報(bào)臊旭,并通知主循環(huán)數(shù)據(jù)已準(zhǔn)備好待處理,也可以立即通知主循環(huán)箩退,讓它讀取數(shù)據(jù)報(bào)离熏。

無論如何處理SIGIO信號,這種模型的優(yōu)勢在于等待數(shù)據(jù)報(bào)到達(dá)期間進(jìn)程不被阻塞戴涝。主循環(huán)可以繼續(xù)執(zhí)行滋戳,只要等待來自信號處理函數(shù)的通知钻蔑。既可以是數(shù)據(jù)已準(zhǔn)備好被處理,也可以是數(shù)據(jù)報(bào)已準(zhǔn)備好被讀取奸鸯。

5. 異步I/O模型(asynchronous I/O)

異步I/O模型中咪笑,首先告知內(nèi)核啟動(dòng)某個(gè)操作,并讓內(nèi)核在整個(gè)操作完成后通知我們娄涩。這種模型與信號驅(qū)動(dòng)模型的主要區(qū)別在于:信號驅(qū)動(dòng)式I/O是由內(nèi)核通知我們何時(shí)可以啟動(dòng)一個(gè)I/O操作蒲肋,而異步I/O模型是由內(nèi)核通知我們I/O操作何時(shí)完成。

aio_read系統(tǒng)調(diào)用立即返回钝满,而且在等待I/O完成期間,我們的進(jìn)程不被阻塞申窘。


各種I/O模型比較

我們可以看出弯蚜,前4種模型主要區(qū)別在于第一階段,因?yàn)樗鼈兊牡诙A段是一樣的剃法。在數(shù)據(jù)從內(nèi)核復(fù)制到調(diào)用者的緩沖區(qū)期間碎捺,進(jìn)程阻塞于recvfrom調(diào)用。
相反贷洲,異步I/O模型在這兩個(gè)階段都要處理收厨,從而不同于其他4種模型。

POSIX把這兩個(gè)數(shù)據(jù)定義如下:
(1)同步I/O操作(synchronous I/O operation)導(dǎo)致請求進(jìn)程阻塞优构,直到I/O操作完成诵叁。
(2)異步I/O操作(asynchronous I/O operation)不導(dǎo)致請求進(jìn)程阻塞。

根據(jù)上述定義钦椭,我們的前4種模型——阻塞式I/O模型拧额,非阻塞式I/O模型,I/O復(fù)用模型和信號驅(qū)動(dòng)式I/O模型彪腔,都是同步I/O模型侥锦,因?yàn)槠渲姓嬲腎/O操作(recvfrom)將阻塞進(jìn)程。只有異步I/O模型與POSIX定義的異步I/O匹配德挣。


參考

UNIX網(wǎng)絡(luò)編程(卷一)- P122-P127

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恭垦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子格嗅,更是在濱河造成了極大的恐慌番挺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吗浩,死亡現(xiàn)場離奇詭異建芙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懂扼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門禁荸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來右蒲,“玉大人,你說我怎么就攤上這事赶熟」逋” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵映砖,是天一觀的道長间坐。 經(jīng)常有香客問我,道長邑退,這世上最難降的妖魔是什么竹宋? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮地技,結(jié)果婚禮上蜈七,老公的妹妹穿的比我還像新娘。我一直安慰自己莫矗,他們只是感情好飒硅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著作谚,像睡著了一般三娩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妹懒,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天雀监,我揣著相機(jī)與錄音,去河邊找鬼彬伦。 笑死滔悉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的单绑。 我是一名探鬼主播回官,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搂橙!你這毒婦竟也來了歉提?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤区转,失蹤者是張志新(化名)和其女友劉穎苔巨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體废离,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侄泽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜻韭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼尾。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柿扣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闺魏,到底是詐尸還是另有隱情未状,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布析桥,位于F島的核電站司草,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泡仗。R本人自食惡果不足惜埋虹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娩怎。 院中可真熱鬧吨岭,春花似錦、人聲如沸峦树。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魁巩。三九已至,卻和暖如春姐浮,著一層夾襖步出監(jiān)牢的瞬間谷遂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工卖鲤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肾扰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓蛋逾,卻偏偏與公主長得像集晚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子区匣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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