SoEasy-聊聊BIO、NIO與AIO的區別?

BIO(Blocking I/O)同步阻塞I/O

這是最基本與簡單的I/O操作方式,其根本特性是做完一件事再去做另一件事,一件事一定要等前一件事做完,這很符合程序員傳統的順序來開發

思想,因此BIO模型程序開發起來較為簡單,易於把握。

我們熟知的Socket編程就是BIO,一個socket連接一個處理線程(這個線程負責這個Socket連接的一系列數據傳輸操作)。阻塞的原因在於:操作

系統允許的線程數量是有限的,多個socket申請與服務端建立連接時,服務端不能提供相應數量的處理線程,沒有分配到處理線程的連接就會阻塞

等待或被拒絕。

NIO (New I/O) 同步非阻塞I/O

關於NIO,國內有很多技術博客將英文翻譯成No-Blocking I/O,非阻塞I/O模型 ,當然這樣就與BIO形成了鮮明的特性對比。

New IO是對BIO的改進,基於Reactor模型。NIO作出的改進就是“一個請求一個線程”,在連接到服務端的眾多socket中,只有需要進行IO操作的

才能獲取服務端的處理線程進行IO。這樣就不會因為線程不夠用而限制了socket的接入。客戶端的socket連接到服務端時,就會在事件分離器註冊

一個 IO請求事件 和 IO 事件處理器。在該連接發生IO請求時,IO事件處理器就會啟動一個線程來處理這個IO請求,不斷嘗試獲取系統的IO的使用

權限,一旦成功(即:可以進行IO),則通知這個socket進行IO數據傳輸。

相對於BIO的流,NIO抽象出了新的通道(Channel)作為輸入輸出的通道,並且提供了緩存(Buffer)的支持,在進行讀操作時,需要使用Buffer

分配空間,然後將數據從Channel中讀入Buffer中,對於Channel的寫操作,也需要現將數據寫入Buffer,然後將Buffer寫入Channel中。

AIO (Asynchronous I/O) 異步非阻塞I/O

AIO是對NIO的改進(所以AIO又叫NIO.2),它是基於Proactor模型的。每個socket連接在事件分離器註冊 IO完成事件 和 IO完成事件處理器。程

序需要進行IO時,向分離器發出IO請求並把所用的Buffer區域告知分離器,分離器通知操作系統進行IO操作,操作系統自己不斷嘗試獲取IO權限並

進行IO操作(數據保存在Buffer區),操作完成後通知分離器;分離器檢測到 IO完成事件,則激活 IO完成事件處理器,處理器會通知程序說“IO

已完成”,程序知道後就直接從Buffer區進行數據的讀寫。

也就是說:AIO是發出IO請求後,由操作系統自己去獲取IO權限並進行IO操作;NIO則是發出IO請求後,由線程不斷嘗試獲取IO權限,獲

取到後通知應用程序自己進行IO操作。

BIO、NIO、AIO適用場景分析:

BIO方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程序直觀簡單

易理解。

NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。

AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,JDK7開始支持。


分享到:


相關文章: