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開始支持。
閱讀更多 IT碼將 的文章