今天就跟大家聊聊有關如何分析NIO,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
linux下五種I/O模型
1)阻塞I/O
2) 非阻塞I/O
3)I/O復用
4)信號驅動I/O
5)異步I/O
前四種都是同步,只有最后一種才是異步IO.
1、同步IO:如果一個線程請求進行IO操作,在IO操作完成之前,該線程會被阻塞!
2、異步IO:如果一個線程請求進行IO操作,IO操作不會導致請求線程被阻塞!
同步和異步是針對用戶線程和內核的交互來說的。同步IO,用戶發出IO請求,如果數據沒有就緒,需要通過用戶線程或者內核不斷的輪詢數據是否就緒,當數據
就緒時,再將數據從內核拷貝到用戶線程。
異步IO和同步關鍵區別:數據拷貝階段是由用戶線程完成還是有內核完成
緩沖區:緩沖區的三個狀態變量:容量capacity、讀寫限制limit、讀寫位置position。需要正確理解!
通道:NIO特性,通道不是從IO操作所處理的數據這個層次上去抽象,而是表示為一個已經建立好的到支持IO操作的實體的鏈接。一旦建立這個連接,就可以在這個
連接上進行各種IO操作。具體做什么操作取決于通道的特性,一般的操作讀和寫等。在java NIO中,不同的實體有不同的通道實現,比如文件通道和網絡通道等。
通道在進行讀寫操作時都是使用緩沖區實現的,而不是字節數組。
套接字通道:
傳統的IO是阻塞式的,可以一旦有請求就建立連接進行處理,這種一個請求對應一個線程的方式,顯然不適合負載壓力比較大的情況,因為每個線程都要占用資源,
創建線程也是有代價的,對此引用線程池的實現,以能夠復用已有的線程問題,當某個線程由于等待網絡操作而阻塞時,其他線程還可以繼續執行,整體性能和吞吐量
得到了提高。不過由于多線程太復雜,容易出現很多隱含的錯誤(*)。
javaNIO 提供了非阻塞式和多路復用的套字節連接
1、阻塞式套節字通道
2、多路復用套字節通道
通過一個專門的選擇器(selector)來同時對多個套接字通道進行監聽。當其中的某個套接字通道上有它感興趣的事件發生時,這些通道會變為可用的狀態,
可以在選擇器的選擇操作中被選中。選擇器通過一次選擇操作可以獲取這些被選中的通道列表,然后根據所發生的事件類型分別進行處理。
核心:選擇器,非阻塞的套接字通道可以注冊到selector上,》在進行注冊時需要提供一個套接字通道感興趣的事件列表,這些事件包括連接完成、接收到新連接請求、
有數據可讀和可以寫入數據等。這些事件都定義在SelectionKey類中,在完成注冊后可以通過selector的select方法進行選擇?!愤x擇之后可以從Selector類的對象中得到一個可用的
套接字通道的列表。
3、IP組播通道
通過IP協議的組播(multicasting)支持可以將數據報文傳輸給屬于同一分組的多個主機。當不同主機上的程序都需要接收相同的數據報文時,使用IP組播是最自然地方式。
每一條組播消息都會被屬于特定分組的所有主機接收到。每個組播分組都有一個對應的標識符,該標識符是一個D類IP地址,范圍在“224.0.0.1”和“239.255.255.255”之間。
進行組播的程序可以選擇加入某個組播分組來接收所有發送給該分組的消息。
通道分為兩大類:文件通道、Socket通道
通道與流:通道時雙向的,而流只是從這一個方向到另一個方向。通道可以讀或寫或者同時讀寫。
管道:Pipe,廣義上講,管道就是一個用來在兩個實體之間單向傳輸數據的管道,管道通常被用來連接一個進程的輸出和另一個進程的輸入。Pipe類實現一個管道范例,
不過它所創建的管道式進程內(在java虛擬機進程內部)而非進程間使用的。
管道有一對通道組成:一個可寫入的sink通道和一個可讀取的source通道。一旦將某些字節寫入接收器的通道,就可以按照與寫入時完全相同的順序從源通道中
讀取這些字節。
通道:
DatagramChannel,針對面向數據報套接字的可選擇通道
Pipe.SinkChannel, 表示 Pipe 的可寫入結尾的通道。
Pipe.SourceChannel, 表示 Pipe 的可讀取結尾的通道。
ServerSocketChannel, 針對面向流的偵聽套接字的可選擇通道。
SocketChannel,針對面向流的連接套接字的可選擇通道。
看完上述內容,你們對如何分析NIO有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。