天天看點

【Java IO】I/O模型之BIO、NIO、AIO + 深拷貝、淺拷貝

1、關于I/O

應用程式對作業系統的核心發起IO調用(系統調用),作業系統負責的核心執行具體IO操作。

常見的IO操作有:磁盤IO(讀寫檔案),網絡IO(網絡請求)

當應用程式發起 I/O 調用後,會經曆兩個步驟:

  • 核心等待 I/O 裝置準備好資料
  • 核心将資料從核心空間拷貝到使用者空間

Unix系統下的I/O模型一共有 5 種: 同步阻塞 I/O、同步非阻塞 I/O、I/O 多路複用、信号驅動 I/O 和異步 I/O。

2、Java中常見的IO模型

首先,應用程式發起read調用後,核心會先準備資料,等待資料就緒,然後拷貝資料。

BIO (Blocking I/O)——屬于同步阻塞IO

應用程式發起 read 調用後,會一直阻塞,直到在核心把資料拷貝到使用者空間。

【Java IO】I/O模型之BIO、NIO、AIO + 深拷貝、淺拷貝

NIO (Non-blocking/New I/O) ——屬于同步非阻塞IO模型

面向緩沖,基于通道的I/O操作方法,适用于高負載高并發的網絡應用。

應用程式發起 read 調用後,會不斷進行 I/O 系統調用輪詢資料是否已經準備好,避免一直阻塞。

【Java IO】I/O模型之BIO、NIO、AIO + 深拷貝、淺拷貝

但是,應用程式不斷進行 I/O 系統調用輪詢資料是否已經準備好的過程是十分消耗 CPU 資源的。

是以,就有了I/O多路複用模型:線程首先發起 select 調用,詢問核心資料是否準備就緒,等核心把資料準備好了,使用者線程再發起 read 調用。read 調用的過程(資料從核心空間->使用者空間)還是阻塞的。

IO 多路複用模型,通過減少無效的系統調用,減少了對 CPU 資源的消耗。

【Java IO】I/O模型之BIO、NIO、AIO + 深拷貝、淺拷貝

AIO(Asynchronous I/O)——NIO的改進版NIO2,異步IO模型

異步 IO 是基于事件和回調機制實作的,也就是應用操作之後會直接傳回,不會堵塞在那裡,當背景處理完成,作業系統會通知相應的線程進行後續的操作。

3、小總結:

【Java IO】I/O模型之BIO、NIO、AIO + 深拷貝、淺拷貝

可以這麼了解和記憶:

一個商人,要求某個裁縫店為他做身衣服。

BIO就是,該商人一直在裁縫店等着裁縫空閑,然後拿走衣服;

NIO就是,商人派了幾個小弟,守着各個裁縫店,哪個裁縫店是空閑的就要求店主做衣服,然後拿走衣服;

AIO就是,裁縫點空閑了,就打電話通知商人。

參考連接配接:I/O模型

【Java IO】I/O模型之BIO、NIO、AIO + 深拷貝、淺拷貝