Nio (what why how)

 

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
資源利用率不高,影響整個系統的性能。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章