共計(jì) 1848 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。
今天就跟大家聊聊有關(guān)如何分析 NIO,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
linux 下五種 I / O 模型
1)阻塞 I /O
2) 非阻塞 I /O
3)I/ O 復(fù)用
4)信號(hào)驅(qū)動(dòng) I /O
5)異步 I /O
前四種都是同步,只有最后一種才是異步 IO.
1、同步 IO: 如果一個(gè)線程請(qǐng)求進(jìn)行 IO 操作,在 IO 操作完成之前,該線程會(huì)被阻塞!
2、異步 IO: 如果一個(gè)線程請(qǐng)求進(jìn)行 IO 操作,IO 操作不會(huì)導(dǎo)致請(qǐng)求線程被阻塞!
同步和異步是針對(duì)用戶線程和內(nèi)核的交互來(lái)說(shuō)的。同步 IO,用戶發(fā)出 IO 請(qǐng)求,如果數(shù)據(jù)沒(méi)有就緒,需要通過(guò)用戶線程或者內(nèi)核不斷的輪詢數(shù)據(jù)是否就緒,當(dāng)數(shù)據(jù)
就緒時(shí),再將數(shù)據(jù)從內(nèi)核拷貝到用戶線程。
異步 IO 和同步關(guān)鍵區(qū)別:數(shù)據(jù)拷貝階段是由用戶線程完成還是有內(nèi)核完成
緩沖區(qū):緩沖區(qū)的三個(gè)狀態(tài)變量:容量 capacity、讀寫(xiě)限制 limit、讀寫(xiě)位置 position。需要正確理解!
通道:NIO 特性,通道不是從 IO 操作所處理的數(shù)據(jù)這個(gè)層次上去抽象,而是表示為一個(gè)已經(jīng)建立好的到支持 IO 操作的實(shí)體的鏈接。一旦建立這個(gè)連接,就可以在這個(gè)
連接上進(jìn)行各種 IO 操作。具體做什么操作取決于通道的特性,一般的操作讀和寫(xiě)等。在 java NIO 中,不同的實(shí)體有不同的通道實(shí)現(xiàn),比如文件通道和網(wǎng)絡(luò)通道等。
通道在進(jìn)行讀寫(xiě)操作時(shí)都是使用緩沖區(qū)實(shí)現(xiàn)的,而不是字節(jié)數(shù)組。
套接字通道:
傳統(tǒng)的 IO 是阻塞式的,可以一旦有請(qǐng)求就建立連接進(jìn)行處理,這種一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)線程的方式,顯然不適合負(fù)載壓力比較大的情況,因?yàn)槊總€(gè)線程都要占用資源,
創(chuàng)建線程也是有代價(jià)的,對(duì)此引用線程池的實(shí)現(xiàn),以能夠復(fù)用已有的線程問(wèn)題,當(dāng)某個(gè)線程由于等待網(wǎng)絡(luò)操作而阻塞時(shí),其他線程還可以繼續(xù)執(zhí)行,整體性能和吞吐量
得到了提高。不過(guò)由于多線程太復(fù)雜,容易出現(xiàn)很多隱含的錯(cuò)誤(*)。
javaNIO 提供了非阻塞式和多路復(fù)用的套字節(jié)連接
1、阻塞式套節(jié)字通道
2、多路復(fù)用套字節(jié)通道
通過(guò)一個(gè)專門(mén)的選擇器(selector)來(lái)同時(shí)對(duì)多個(gè)套接字通道進(jìn)行監(jiān)聽(tīng)。當(dāng)其中的某個(gè)套接字通道上有它感興趣的事件發(fā)生時(shí),這些通道會(huì)變?yōu)榭捎玫臓顟B(tài),
可以在選擇器的選擇操作中被選中。選擇器通過(guò)一次選擇操作可以獲取這些被選中的通道列表,然后根據(jù)所發(fā)生的事件類型分別進(jìn)行處理。
核心:選擇器,非阻塞的套接字通道可以注冊(cè)到 selector 上,》在進(jìn)行注冊(cè)時(shí)需要提供一個(gè)套接字通道感興趣的事件列表,這些事件包括連接完成、接收到新連接請(qǐng)求、
有數(shù)據(jù)可讀和可以寫(xiě)入數(shù)據(jù)等。這些事件都定義在 SelectionKey 類中,在完成注冊(cè)后可以通過(guò) selector 的 select 方法進(jìn)行選擇。》選擇之后可以從 Selector 類的對(duì)象中得到一個(gè)可用的
套接字通道的列表。
3、IP 組播通道
通過(guò) IP 協(xié)議的組播(multicasting)支持可以將數(shù)據(jù)報(bào)文傳輸給屬于同一分組的多個(gè)主機(jī)。當(dāng)不同主機(jī)上的程序都需要接收相同的數(shù)據(jù)報(bào)文時(shí),使用 IP 組播是最自然地方式。
每一條組播消息都會(huì)被屬于特定分組的所有主機(jī)接收到。每個(gè)組播分組都有一個(gè)對(duì)應(yīng)的標(biāo)識(shí)符,該標(biāo)識(shí)符是一個(gè) D 類 IP 地址,范圍在“224.0.0.1”和“239.255.255.255”之間。
進(jìn)行組播的程序可以選擇加入某個(gè)組播分組來(lái)接收所有發(fā)送給該分組的消息。
通道分為兩大類:文件通道、Socket 通道
通道與流:通道時(shí)雙向的,而流只是從這一個(gè)方向到另一個(gè)方向。通道可以讀或?qū)懟蛘咄瑫r(shí)讀寫(xiě)。
管道:Pipe,廣義上講,管道就是一個(gè)用來(lái)在兩個(gè)實(shí)體之間單向傳輸數(shù)據(jù)的管道,管道通常被用來(lái)連接一個(gè)進(jìn)程的輸出和另一個(gè)進(jìn)程的輸入。Pipe 類實(shí)現(xiàn)一個(gè)管道范例,
不過(guò)它所創(chuàng)建的管道式進(jìn)程內(nèi)(在 java 虛擬機(jī)進(jìn)程內(nèi)部)而非進(jìn)程間使用的。
管道有一對(duì)通道組成:一個(gè)可寫(xiě)入的 sink 通道和一個(gè)可讀取的 source 通道。一旦將某些字節(jié)寫(xiě)入接收器的通道,就可以按照與寫(xiě)入時(shí)完全相同的順序從源通道中
讀取這些字節(jié)。
通道:
DatagramChannel, 針對(duì)面向數(shù)據(jù)報(bào)套接字的可選擇通道
Pipe.SinkChannel, 表示 Pipe 的可寫(xiě)入結(jié)尾的通道。
Pipe.SourceChannel, 表示 Pipe 的可讀取結(jié)尾的通道。
ServerSocketChannel, 針對(duì)面向流的偵聽(tīng)套接字的可選擇通道。
SocketChannel,針對(duì)面向流的連接套接字的可選擇通道。
看完上述內(nèi)容,你們對(duì)如何分析 NIO 有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。