IO BIO NIO AIO

非原創(chuàng)瓢省,只為記錄方便日后查看。如有不當(dāng)請聯(lián)系本人。

原文鏈接https://www.e-learn.cn/content/qita/2076832

IO的基本常識

1.同步

用戶進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否完成

2.異步

用戶觸發(fā)IO操作以后,可以干別的事妇拯,IO操作完成以后再通知當(dāng)前線程繼續(xù)處理

3.阻塞

當(dāng)一個(gè)線程調(diào)用 read() 或 write()時(shí),該線程被阻塞庇配,直到有一些數(shù)據(jù)被讀取或?qū)懭耄摼€程在此期間不能執(zhí)行其他任務(wù)

4.非阻塞

當(dāng)線程從某通道進(jìn)行讀寫數(shù)據(jù)時(shí)栖疑,若沒有數(shù)據(jù)可用時(shí)讨永,該線程可以進(jìn)行其他任務(wù)。線程通常將非阻塞 IO 的空閑時(shí)間用于在其他通道上執(zhí)行 IO 操作遇革,所以單獨(dú)的線程可以管理多個(gè)輸入和輸出通道卿闹。

IO事件驅(qū)動模式

在IO讀寫時(shí),把 IO請求 與 讀寫操作 分離調(diào)配進(jìn)行萝快,需要用到事件分離器锻霎。根據(jù)處理機(jī)制的不同,事件分離器又分為:同步的Reactor和異步的Proactor揪漩。

Reactor模型:

- 應(yīng)用程序在事件分離器注冊 讀就緒事件 和 讀就緒事件處理器 - 事件分離器等待讀就緒事件發(fā)生 - 讀就緒事件發(fā)生旋恼,激活事件分離器,分離器調(diào)用 讀就緒事件處理器(即:可以進(jìn)行讀操作了奄容,開始讀) - 讀事件處理器開始進(jìn)行讀操作冰更,把讀到的數(shù)據(jù)提供給程序使用

Proactor模型:

- 應(yīng)用程序在事件分離器注冊 讀完成事件 和 讀完成事件處理器,并向操作系統(tǒng)發(fā)出異步讀請求 - 事件分離器等待操作系統(tǒng)完成讀取 - 在分離器等待過程中昂勒,操作系統(tǒng)利用并行的內(nèi)核線程執(zhí)行實(shí)際的讀操作蜀细,并將結(jié)果數(shù)據(jù)存入用戶自定義緩沖區(qū),最后通知事件分離器讀操作完成 - 事件分離器監(jiān)聽到 讀完成事件 后戈盈,激活 讀完成事件的處理器 - 讀完成事件處理器 處理用戶自定義緩沖區(qū)中的數(shù)據(jù)給應(yīng)用程序使用

同步和異步的區(qū)別就在于 讀 操作由誰完成:同步的Reactor是指程序發(fā)出讀請求后奠衔,由分離器監(jiān)聽到可以進(jìn)行讀操作時(shí)通知事件處理器進(jìn)行讀操作,異步的Proactor是指程序發(fā)出讀請求后塘娶,操作系統(tǒng)立刻異步地進(jìn)行讀操作了归斤,讀完之后在通知分離器,分離器激活處理器直接取用已讀到的數(shù)據(jù)刁岸。

同步阻塞IO(BIO)

我們熟知的Socket就是BIO脏里,每一個(gè)socket套接字需要使用一個(gè)線程來處理。建立連接难捌、進(jìn)行讀寫操作的時(shí)候都可能阻塞膝宁。在服務(wù)器端如果要支持并發(fā)的連接時(shí),需要更多的線程根吁。連接不做任何事情的時(shí)候會造成不必要的線程開銷员淫,可通過線程池來改善。


同步非阻塞IO(NIO)

New IO是對BIO的改進(jìn)击敌,基于Reactor模型介返。我們知道,一個(gè)socket連接只有在特定時(shí)間才會發(fā)生數(shù)據(jù)傳輸IO操作,大部分時(shí)間這個(gè)“數(shù)據(jù)通道”是空閑的圣蝎,但還是占用著線程刃宵。NIO作出的改進(jìn)就是“多個(gè)連接一個(gè)線程”,在連接到服務(wù)端的眾多socket中徘公,只有需要進(jìn)行IO操作的才能獲取服務(wù)端的處理線程進(jìn)行IO牲证。這樣就不會因?yàn)榫€程不夠用而限制了socket的接入」孛妫客戶端的socket連接到服務(wù)端時(shí)坦袍,就會在事件分離器注冊一個(gè) IO請求事件 和 IO 事件處理器。在該連接發(fā)生IO請求時(shí)等太,IO事件處理器就會啟動一個(gè)線程來處理這個(gè)IO請求捂齐,不斷嘗試獲取系統(tǒng)的IO的使用權(quán)限,則通知這個(gè)socket進(jìn)行IO數(shù)據(jù)傳輸缩抡。


NIO主要有三大核心部分:Channel(通道)奠宜,Buffer(緩沖區(qū)), Selector。傳統(tǒng)IO基于字節(jié)流和字符流進(jìn)行操作瞻想,而NIO基于Channel和Buffer(緩沖區(qū))進(jìn)行操作压真,數(shù)據(jù)總是從通道讀取到緩沖區(qū)中,或者從緩沖區(qū)寫入到通道中蘑险。Selector(選擇區(qū))用于監(jiān)聽多個(gè)通道的事件(比如:連接打開榴都,數(shù)據(jù)到達(dá))。因此漠其,單個(gè)線程可以監(jiān)聽多個(gè)數(shù)據(jù)通道。

NIO基于Channel和Buffer(緩沖區(qū))進(jìn)行操作

Selector(選擇區(qū))用于監(jiān)聽多個(gè)通道的事件

異步阻塞IO(AIO)

NIO是同步的IO竿音,是因?yàn)槌绦蛐枰狪O操作時(shí)和屎,必須獲得了IO權(quán)限后親自進(jìn)行IO操作才能進(jìn)行下一步操作。AIO是對NIO的改進(jìn)(所以AIO又叫NIO.2)春瞬,它是基于Proactor模型的柴信。每個(gè)socket連接在事件分離器注冊 IO完成事件 和 IO完成事件處理器。程序需要進(jìn)行IO時(shí)宽气,向分離器發(fā)出IO請求并把所用的Buffer區(qū)域告知分離器随常,分離器通知操作系統(tǒng)進(jìn)行IO操作,操作系統(tǒng)自己不斷嘗試獲取IO權(quán)限并進(jìn)行IO操作(數(shù)據(jù)保存在Buffer區(qū))萄涯,操作完成后通知分離器绪氛;分離器檢測到 IO完成事件,則激活 IO完成事件處理器涝影,處理器會通知程序說“IO已完成”枣察,程序知道后就直接從Buffer區(qū)進(jìn)行數(shù)據(jù)的讀寫。

AIO是發(fā)出IO請求后,由操作系統(tǒng)自己去獲取IO權(quán)限并進(jìn)行IO操作序目;NIO則是發(fā)出IO請求后臂痕,由線程不斷嘗試獲取IO權(quán)限,獲取到后通知應(yīng)用程序自己進(jìn)行IO操作猿涨。


總結(jié)

BIO握童,NIO,AIO可以簡述如下:

BIO是同步并阻塞叛赚,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程澡绩,即客戶端有連接請求時(shí)服務(wù)器端就需要啟動一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會造成不必要的線程開銷红伦,當(dāng)然可以通過線程池機(jī)制改善英古。

NIO是同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請求一個(gè)線程昙读,即客戶端發(fā)送的連接請求都會注冊到多路復(fù)用器上召调,多路復(fù)用器輪詢到連接有I/O請求時(shí)才啟動一個(gè)線程進(jìn)行處理。

AIO是異步非阻塞蛮浑,服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請求一個(gè)線程唠叛,客戶端的I/O請求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動線程進(jìn)行處理。

BIO沮稚、NIO艺沼、AIO適用場景分析:

BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對服務(wù)器資源要求比較高

NIO方式適用于連接數(shù)目多且連接比較短的架構(gòu)蕴掏,可充分利用服務(wù)器資源

AIO方式使用于連接數(shù)目多且連接比較長的架構(gòu)障般,充分調(diào)用OS參與并發(fā)操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盛杰,隨后出現(xiàn)的幾起案子挽荡,更是在濱河造成了極大的恐慌,老刑警劉巖即供,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定拟,死亡現(xiàn)場離奇詭異,居然都是意外死亡逗嫡,警方通過查閱死者的電腦和手機(jī)青自,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱证,“玉大人延窜,你說我怎么就攤上這事∧ǔ” “怎么了需曾?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我呆万,道長商源,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任谋减,我火速辦了婚禮牡彻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘出爹。我一直安慰自己庄吼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布严就。 她就那樣靜靜地躺著总寻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梢为。 梳的紋絲不亂的頭發(fā)上渐行,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音铸董,去河邊找鬼祟印。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粟害,可吹牛的內(nèi)容都是我干的蕴忆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼悲幅,長吁一口氣:“原來是場噩夢啊……” “哼套鹅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汰具,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤芋哭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后郁副,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豌习,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年存谎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肥隆。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡既荚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栋艳,到底是詐尸還是另有隱情恰聘,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站晴叨,受9級特大地震影響凿宾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兼蕊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一初厚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孙技,春花似錦产禾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哈雏,卻和暖如春楞件,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背僧著。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工履因, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盹愚。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓栅迄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皆怕。 傳聞我的和親對象是個(gè)殘疾皇子毅舆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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

  • IO一直是軟件開發(fā)中的核心部分之一,而隨著互聯(lián)網(wǎng)技術(shù)的提高橱乱,IO的重要性也越來越重辜梳。縱觀開發(fā)界泳叠,能夠巧妙運(yùn)用IO...
    那些年的代碼閱讀 206評論 0 0
  • IO一直是軟件開發(fā)中的核心部分之一契耿,而隨著互聯(lián)網(wǎng)技術(shù)的提高瞒大,IO的重要性也越來越重∠梗縱觀開發(fā)界糠赦,能夠巧妙運(yùn)用...
    guoliang閱讀 4,223評論 0 47
  • IO的方式通常分為幾種,同步阻塞的BIO锅棕、同步非阻塞的NIO拙泽、異步非阻塞的AIO。 阻塞和非阻塞:是針對于進(jìn)程在訪...
    誰在烽煙彼岸閱讀 371評論 1 1
  • 五味雜陳的寫下這段文字裸燎,本想著扣錢就扣錢吧顾瞻,沒心思寫。 但看到淑瑜組長和上個(gè)組長劉鵬的鼓勵(lì)和他們的堅(jiān)持德绿,我還是寫了...
    Lina_c911閱讀 171評論 1 1
  • 大家早上好荷荤,今天我分享的是一部電影,名字叫:《分雨哈佛路》移稳,主要是講一個(gè)成長在毒品蕴纳、艾滋、饑餓纏繞的家庭環(huán)境中...
    小貝加油閱讀 438評論 0 1