IO BIO NIO AIO

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

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

IO的基本常識(shí)

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ū)動(dòng)模式

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

Reactor模型:

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

Proactor模型:

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

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

同步阻塞IO(BIO)

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


同步非阻塞IO(NIO)

New IO是對(duì)BIO的改進(jìn),基于Reactor模型。我們知道,一個(gè)socket連接只有在特定時(shí)間才會(huì)發(fā)生數(shù)據(jù)傳輸IO操作,大部分時(shí)間這個(gè)“數(shù)據(jù)通道”是空閑的,但還是占用著線程。NIO作出的改進(jìn)就是“多個(gè)連接一個(gè)線程”,在連接到服務(wù)端的眾多socket中,只有需要進(jìn)行IO操作的才能獲取服務(wù)端的處理線程進(jìn)行IO。這樣就不會(huì)因?yàn)榫€程不夠用而限制了socket的接入。客戶端的socket連接到服務(wù)端時(shí),就會(huì)在事件分離器注冊(cè)一個(gè) IO請(qǐng)求事件 和 IO 事件處理器。在該連接發(fā)生IO請(qǐng)求時(shí),IO事件處理器就會(huì)啟動(dòng)一個(gè)線程來處理這個(gè)IO請(qǐng)求,不斷嘗試獲取系統(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是對(duì)NIO的改進(jìn)(所以AIO又叫NIO.2),它是基于Proactor模型的。每個(gè)socket連接在事件分離器注冊(cè) IO完成事件 和 IO完成事件處理器。程序需要進(jìn)行IO時(shí),向分離器發(fā)出IO請(qǐng)求并把所用的Buffer區(qū)域告知分離器,分離器通知操作系統(tǒng)進(jìn)行IO操作,操作系統(tǒng)自己不斷嘗試獲取IO權(quán)限并進(jìn)行IO操作(數(shù)據(jù)保存在Buffer區(qū)),操作完成后通知分離器;分離器檢測(cè)到 IO完成事件,則激活 IO完成事件處理器,處理器會(huì)通知程序說“IO已完成”,程序知道后就直接從Buffer區(qū)進(jìn)行數(shù)據(jù)的讀寫。

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


總結(jié)

BIO,NIO,AIO可以簡(jiǎn)述如下:

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

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

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

BIO、NIO、AIO適用場(chǎng)景分析:

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • IO一直是軟件開發(fā)中的核心部分之一,而隨著互聯(lián)網(wǎng)技術(shù)的提高,IO的重要性也越來越重??v觀開發(fā)界,能夠巧妙運(yùn)用IO...
    那些年的代碼閱讀 233評(píng)論 0 0
  • IO一直是軟件開發(fā)中的核心部分之一,而隨著互聯(lián)網(wǎng)技術(shù)的提高,IO的重要性也越來越重??v觀開發(fā)界,能夠巧妙運(yùn)用...
    guoliang閱讀 4,263評(píng)論 0 47
  • 五味雜陳的寫下這段文字,本想著扣錢就扣錢吧,沒心思寫。 但看到淑瑜組長(zhǎng)和上個(gè)組長(zhǎng)劉鵬的鼓勵(lì)和他們的堅(jiān)持,我還是寫了...
    Lina_c911閱讀 215評(píng)論 1 1
  • 大家早上好,今天我分享的是一部電影,名字叫:《分雨哈佛路》,主要是講一個(gè)成長(zhǎng)在毒品、艾滋、饑餓纏繞的家庭環(huán)境中...
    小貝加油閱讀 452評(píng)論 0 1
  • 這是一本被很多人安利的好書。是的,它是一本好書。雖然有人說不要看當(dāng)下流行的書,沒經(jīng)過時(shí)間的洗禮,它的分量至今還未可...
    飛鳥逐溪閱讀 223評(píng)論 0 2

友情鏈接更多精彩內(nèi)容