小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java.nio包學(xué)習(xí)

 LibraryPKU 2013-05-02

一、為什么要引入java.nio包?

  Java 平臺傳統(tǒng)的I/O 系統(tǒng)都是基于Byte(字節(jié))和Stream(數(shù)據(jù)流)的,相應(yīng)的I/O 操
作都是阻塞型的,所以服務(wù)器程序也采用阻塞型I/O 進(jìn)行數(shù)據(jù)的讀、寫操作。本文以TCP
長連接模式來討論并發(fā)型服務(wù)器的相關(guān)設(shè)計,為了實現(xiàn)服務(wù)器程序的并發(fā)性要求,系統(tǒng)由一
個單獨的主線程來監(jiān)聽用戶發(fā)起的連接請求,一直處于阻塞狀態(tài);當(dāng)有用戶連接請求到來時,
程序都會啟一個新的線程來統(tǒng)一處理用戶數(shù)據(jù)的讀、寫操作。

 

這種模式的優(yōu)點是簡單、實用、易管理;然而缺點也是顯而易見的:由于是為每一個客
戶端分配一個線程來處理輸入、輸出數(shù)據(jù),其線程與客戶機(jī)的比例近似為1:1,隨著線程
數(shù)量的不斷增加,服務(wù)器啟動了大量的并發(fā)線程,會大大加大系統(tǒng)對線程的管理開銷,這將
成為吞吐量瓶頸的主要原因;其次由于底層的I/O 操作采用的同步模式,I/O 操作的阻塞管

理粒度是以服務(wù)于請求的線程為單位的,有可能大量的線程會閑置,處于盲等狀態(tài),造成I/O
資源利用率不高,影響整個系統(tǒng)的性能。


對于并發(fā)型服務(wù)器,系統(tǒng)用在阻塞型I/O 等待和線程間切換的時間遠(yuǎn)遠(yuǎn)多于CPU 在內(nèi)
存中處理數(shù)據(jù)的時間,因此傳統(tǒng)的阻塞型I/O 已經(jīng)成為制約系統(tǒng)性能的瓶頸。Java1.4 版本
后推出的NIO 工具包,提供了非阻塞型I/O 的異步輸入輸出機(jī)制,為提高系統(tǒng)的性能提供
了可實現(xiàn)的基礎(chǔ)機(jī)制。

二、什么是nio?

  針對傳統(tǒng)I/O 工作模式的不足,NIO 工具包提出了基于Buffer(緩沖區(qū))、Channel(通
道)、Selector(選擇器)的新模式;Selector(選擇器)、可選擇的Channel(通道)和
SelectionKey(選擇鍵)配合起來使用,可以實現(xiàn)并發(fā)的非阻塞型I/O 能力。

 

NIO 工具包的成員


 Buffer(緩沖器)
Buffer 類是一個抽象類,它有7 個子類分別對應(yīng)于七種基本的數(shù)據(jù)類型:ByteBuffer、
CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer 和ShortBuffer。每一個Buffer
對象相當(dāng)于一個數(shù)據(jù)容器,可以把它看作內(nèi)存中的一個大的數(shù)組,用來存儲和提取所有基本
類型(boolean 型除外)的數(shù)據(jù)。Buffer 類的核心是一塊內(nèi)存區(qū),可以直接對其執(zhí)行與內(nèi)存有關(guān)
的操作,利用操作系統(tǒng)特性和能力提高和改善Java 傳統(tǒng)I/O 的性能。


 Channel(通道)
Channel 被認(rèn)為是NIO 工具包的一大創(chuàng)新點,是(Buffer)緩沖器和I/O 服務(wù)之間的通道,
具有雙向性,既可以讀入也可以寫出,可以更高效的傳遞數(shù)據(jù)。我們這里主要討論
ServerSocketChannel 和SocketChannel,它們都繼承了SelectableChannel,是可選擇的通道,
分別可以工作在同步和異步兩種方式下(這里的可選擇不是指可以選擇兩種工作方式,而是
指可以有選擇的注冊自己感興趣的事件)。當(dāng)通道工作在同步方式時,它的功能和編程方法
與傳統(tǒng)的ServerSocket、Socket 對象相似;當(dāng)通道工作在異步工作方式時,進(jìn)行輸入輸出處
理不必等到輸入輸出完畢才返回,并且可以將其感興趣的(如:接受操作、連接操作、讀出
操作、寫入操作)事件注冊到Selector 對象上,與Selector 對象協(xié)同工作可以更有效率的支

持和管理并發(fā)的網(wǎng)絡(luò)套接字連接。
Selector(選擇器)和SelectionKey(選擇鍵)
各類 Buffer 是數(shù)據(jù)的容器對象;各類Channel 實現(xiàn)在各類Buffer 與各類I/O 服務(wù)間傳輸
數(shù)據(jù)。Selector 是實現(xiàn)并發(fā)型非阻塞I/O 的核心,各種可選擇的通道將其感興趣的事件注冊
到Selector 對象上,Selector 在一個循環(huán)中不斷輪循監(jiān)視這各些注冊在其上的Socket 通道。
SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息。當(dāng)Selector 監(jiān)測
到在某個注冊的SelectableChannel 上發(fā)生了感興趣的事件時,自動激活產(chǎn)生一個SelectionKey
對象,在這個對象中記錄了哪一個SelectableChannel 上發(fā)生了哪種事件,通過對被激活的
SelectionKey 的分析,外界可以知道每個SelectableChannel 發(fā)生的具體事件類型,進(jìn)行相應(yīng)的

處理。

三、nio工作原理

  在并發(fā)型服務(wù)器程序中使用NIO,實際上是通過網(wǎng)絡(luò)事
件驅(qū)動模型實現(xiàn)的。我們應(yīng)用Select 機(jī)制,不用為每一個客戶端連接新啟線程處理,而是將
其 注冊到特定的Selector 對象上,這就可以在單線程中利用Selector 對象管理大量并發(fā)的網(wǎng)絡(luò)連接,更好的利用了系統(tǒng)資源;采用非阻塞I/O 的通信方式,不要求阻塞等待I/O 操作完成即可返回,從而減少了管理I/O 連接導(dǎo)致的系統(tǒng)開銷,大幅度提高了系統(tǒng)性能。

當(dāng)有讀或?qū)懙热魏巫缘氖录l(fā)生時,可以從Selector 中獲得相應(yīng)的
SelectionKey , 從SelectionKey 中可以找到發(fā)生的事件和該事件所發(fā)生的具體的
SelectableChannel, 以獲得客戶端發(fā)送過來的數(shù)據(jù)。由于在非阻塞網(wǎng)絡(luò)I/O 中采用了事件觸發(fā)機(jī)制,處理程序可以得到系統(tǒng)的主動通知,從而可以實現(xiàn)底層網(wǎng)絡(luò)I/O 無阻塞、流暢地讀寫,而不像在原來的阻塞模式下處理程序需要不斷循環(huán)等待。使用NIO,可以編寫出性能更好、更易擴(kuò)展的并發(fā)型服務(wù)器程序。

分享到:

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多