1what
是Java1. 4 開始引入的一種新I/O(API)
2why
通過使用非阻塞型I/O(Nio),不要求阻塞等待I/O 操作完成即可返回,從而減少了管理I/O 連接導致的系統開銷,實現流暢的網絡讀寫操作,大幅度提高了系統性能
3how
工作原理
針對傳統I/O 工作模式的不足,NIO 工具包提出了基於Buffer(緩衝區)、Channel(通
道)、Selector(選擇器)的新模式、Selector(選擇器)、可選擇的Channel(通道)和
SelectionKey(選擇鍵)配合起來使用,可以實現併發的非阻塞型I/O 能力。
4Nio工具包的成員
Buffer(緩衝器)
的核心是一塊內存區,可以直接對其執行與內存有關的操作,利用操作系統特性和能力提高和改善Java 傳統I/O 的性能。
Channel(通道)
被認爲是NIO 工具包的一大創新點,是(Buffer)緩衝器和I/O 服務之間的通道,具有雙向性,既可以讀入也可以寫出,可以更高效的傳遞數據
Selector(選擇器)和SelectionKey(選擇鍵)
Selector 是實現併發型非阻塞I/O 的核心,各種可選擇的通道將其感興趣的事件註冊
到Selector 對象上,Selector 在一個循環中不斷輪循監視這各些註冊在其上的Socket 通道。
SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的註冊信息。當Selector 監測
到在某個註冊的SelectableChannel 上發生了感興趣的事件時,自動激活產生一個SelectionKey
對象,在這個對象中記錄了哪一個SelectableChannel 上發生了哪種事件,通過對被激活的
SelectionKey 的分析,外界可以知道每個SelectableChannel 發生的具體事件類型,進行相應的
處理。
5傳統的阻塞型網絡 I/O的不足
Java 平臺傳統的I/O 系統都是基於Byte(字節)和Stream(數據流)的,相應的I/O 操
作都是阻塞型的,所以服務器程序也採用阻塞型I/O 進行數據的讀、寫操作。爲了實現服
務器程序的併發性要求,系統由一個單獨的主線程來監聽用戶發起的連接請求,一直處於阻塞狀態;
當有用戶連接請求到來時,程序都會啓一個新的線程來統一處理用戶數據的讀、寫操作。
這種模式的優點是簡單、實用、易管理;然而缺點也是顯而易見的:由於是爲每一個客
戶端分配一個線程來處理輸入、輸出數據,其線程與客戶機的比例近似爲1:1,隨着線程
數量的不斷增加,服務器啓動了大量的併發線程,會大大加大系統對線程的管理開銷,這將
成爲吞吐量瓶頸的主要原因;其次由於底層的I/O 操作採用的同步模式,I/O 操作的阻塞管
理粒度是以服務於請求的線程爲單位的,有可能大量的線程會閒置,處於盲等狀態,造成I/O
資源利用率不高,影響整個系統的性能。