天天看點

什麼是IO,BIO,NIO,AIO

一、基本概念

IO:阻塞IO

BIO:同步阻塞IO。伺服器實作模式為一個連接配接一個線程,即用戶端有連接配接請求時伺服器需要啟動一個線程進行處理,如果這個連結不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

NIO:同步非阻塞IO,伺服器實作模式為一個請求一個線程,即用戶端發送的連接配接請求都會注冊到多路複用器上,多路複用器輪詢到連接配接有IO請求時才啟動一個線程進行處理。使用者程序也需要時不時的詢問IO操作是否就緒,這需要使用者進行不停的去詢問。NIO的包括三個核心概念:緩沖區(Buffer)、通道(Channel)、選擇器(Selector)。

AIO:Asynchronous IO,異步非阻塞AIO。最大的特性時具有異步能力,這種能力對socket與檔案I/O都起作用。AIO其實是一種在讀寫操作結束之前允許進行其他操作的I/O處理。

可概括為:BIO是“我要讀”,NIO是“我可以讀了”,AIO是“我讀完了”

二、差別

(1)NIO和IO的主要差別

IO NIO
面向流 面向緩沖區
阻塞 非阻塞
選擇器

(2)BIO,NIO,AIO對比

同步阻塞IO(VIO) 非阻塞IO(NIO) 異步IO(AIO)
用戶端個數:IO線程 1:1 M:1(1個IO線程處理多個用戶端連接配接) M:0(不需要啟動額外的IO線程,被動回調)
IO類型(阻塞) 阻塞 非阻塞 非阻塞
IO類型(同步) 同步 同步 異步
API使用難度 簡單 簡單 複雜
調試難度 簡單 簡單 複雜
可靠性 非常差
吞吐量

三、應用場景

BIO:适用于連接配接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,并發局限于應用中,JDK1.4之前的唯一選擇, 但是程式簡單直覺容易了解。

NIO:适用于連接配接數目多且連接配接比較短(輕操作)的架構,比如聊推薦伺服器,并發局限于應用中,程式設計比較複雜,JDK1.4開始支援。

AIO:适用于連接配接數目多且連接配接比較長(重操作)的架構,比如相冊伺服器,充分調用OS參與并發操作,程式設計比較複雜,JDK1.7開始支援。

繼續閱讀