1. 程式人生 > 其它 >javaNio學習 -- 四種主要的io模型

javaNio學習 -- 四種主要的io模型

來源與尼恩的《Java高併發核心卷》

同步阻塞io

阻塞與非阻塞:
阻塞是指需要核心io徹底執行完畢後才返回到使用者空間執行使用者程式的指令,阻塞是指使用者程式的執行狀態。
同步與非同步:
同步io是指使用者空間主動發起io請求的一方,核心系統是接收方;相反的非同步io是指,系統的核心空間是主動的發起io請求的一方,使用者空間是被動接受的一方。
同步阻塞io是指使用者空間主動發起,需要等待核心空間的io徹底完成操作後才返回到使用者空間的io操作;在io操作的過程中,發起io請求的使用者程序處於阻塞狀態。

同步非阻塞io

同步非阻塞io是指使用者空間的程式不需要等待核心空間的io徹底完成,立即返回使用者空間去執行後續的操作,發起io請求的使用者程序處於非阻塞狀態,核心空間會立即返回給使用者一個io狀態值。

io多路複用

Linux系統中通過呼叫select/epoll的系統呼叫,一個使用者程序監控多個檔案描述符,一旦某個檔案描述符狀態可用,核心將檔案描述符的就緒狀態返回給使用者程序,使用者空間可以根據檔案描述符進行相應io呼叫。
io多複用是一種典型的reactor模式的實現,又是也稱為非同步阻塞io,Java中的selector就是這種模型。

非同步io

核心空間為主動的io請求發起方,使用者空間程序為被動的接收方;當用戶接收到請求後,資料已經被核心空間讀取完畢並放到了使用者緩衝區,使用者空間程序直接使用即可。
非同步io類似於Java中的回撥函式,使用者程序在核心空間註冊了各種io事件的回撥函式,由核心主動的去呼叫。在整個核心的資料處理過程中(包括將資料從網路裝置讀取到核心緩衝區,再從核心緩衝區複製到使用者緩衝區),使用者程序都不需要阻塞。
非同步io模型的特點是,核心等待資料和複製資料的連哥哥階段,使用者程序都是不需要阻塞的。使用者執行緒需要接受核心io的完成事件,或者使用者執行緒註冊一個io操作的回撥函式。非同步io也被稱為訊號驅動的io。

總結

同步阻塞io需要為每一個連線建立一個執行緒,高併發的情況下效能會比較差;
同步非阻塞io需要不斷的發起io呼叫用以讀取最終核心空間處理完的資料;使用者執行緒不會阻塞,事實性好;核心空間有資料的情況下,資料的複製過程是阻塞的,直到資料完成從核心空間到使用者空間的複製,完成複製後核心空間返回成功給使用者空間進行。
io多路複用,使用者執行緒獲得了就緒狀態列表後,根據其中的socket連線發起read/write的系統呼叫,使用者執行緒阻塞,資料從核心緩衝區複製到使用者緩衝區;複製完成後核心返回結果,使用者程序接觸阻塞狀態,繼續執行。Java的nio就是一種io多路複用。
非同步io相比於以上三種,徹底的解除了阻塞。