溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析NIO

發(fā)布時(shí)間:2022-01-14 15:17:41 來(lái)源:億速云 閱讀:110 作者:柒染 欄目:云計(jì)算

今天就跟大家聊聊有關(guān)如何分析NIO,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(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)說的。同步IO,用戶發(fā)出IO請(qǐng)求,如果數(shù)據(jù)沒有就緒,需要通過用戶線程或者內(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、讀寫限制limit、讀寫位置position。需要正確理解!

通道:NIO特性,通道不是從IO操作所處理的數(shù)據(jù)這個(gè)層次上去抽象,而是表示為一個(gè)已經(jīng)建立好的到支持IO操作的實(shí)體的鏈接。一旦建立這個(gè)連接,就可以在這個(gè)

連接上進(jìn)行各種IO操作。具體做什么操作取決于通道的特性,一般的操作讀和寫等。在java NIO中,不同的實(shí)體有不同的通道實(shí)現(xiàn),比如文件通道和網(wǎng)絡(luò)通道等。

通道在進(jìn)行讀寫操作時(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ù)用已有的線程問題,當(dāng)某個(gè)線程由于等待網(wǎng)絡(luò)操作而阻塞時(shí),其他線程還可以繼續(xù)執(zhí)行,整體性能和吞吐量

得到了提高。不過由于多線程太復(fù)雜,容易出現(xiàn)很多隱含的錯(cuò)誤(*)。

javaNIO 提供了非阻塞式和多路復(fù)用的套字節(jié)連接

1、阻塞式套節(jié)字通道

2、多路復(fù)用套字節(jié)通道

通過一個(gè)專門的選擇器(selector)來(lái)同時(shí)對(duì)多個(gè)套接字通道進(jìn)行監(jiān)聽。當(dāng)其中的某個(gè)套接字通道上有它感興趣的事件發(fā)生時(shí),這些通道會(huì)變?yōu)榭捎玫臓顟B(tài),

可以在選擇器的選擇操作中被選中。選擇器通過一次選擇操作可以獲取這些被選中的通道列表,然后根據(jù)所發(fā)生的事件類型分別進(jìn)行處理。

核心:選擇器,非阻塞的套接字通道可以注冊(cè)到selector上,》在進(jìn)行注冊(cè)時(shí)需要提供一個(gè)套接字通道感興趣的事件列表,這些事件包括連接完成、接收到新連接請(qǐng)求、

有數(shù)據(jù)可讀和可以寫入數(shù)據(jù)等。這些事件都定義在SelectionKey類中,在完成注冊(cè)后可以通過selector的select方法進(jìn)行選擇?!愤x擇之后可以從Selector類的對(duì)象中得到一個(gè)可用的

套接字通道的列表。

3、IP組播通道

通過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í)讀寫。

管道:Pipe,廣義上講,管道就是一個(gè)用來(lái)在兩個(gè)實(shí)體之間單向傳輸數(shù)據(jù)的管道,管道通常被用來(lái)連接一個(gè)進(jìn)程的輸出和另一個(gè)進(jìn)程的輸入。Pipe類實(shí)現(xiàn)一個(gè)管道范例,

不過它所創(chuàng)建的管道式進(jìn)程內(nèi)(在java虛擬機(jī)進(jìn)程內(nèi)部)而非進(jìn)程間使用的。

管道有一對(duì)通道組成:一個(gè)可寫入的sink通道和一個(gè)可讀取的source通道。一旦將某些字節(jié)寫入接收器的通道,就可以按照與寫入時(shí)完全相同的順序從源通道中

讀取這些字節(jié)。

通道:

DatagramChannel,針對(duì)面向數(shù)據(jù)報(bào)套接字的可選擇通道

Pipe.SinkChannel, 表示 Pipe 的可寫入結(jié)尾的通道。 

Pipe.SourceChannel, 表示 Pipe 的可讀取結(jié)尾的通道。 

ServerSocketChannel, 針對(duì)面向流的偵聽套接字的可選擇通道。 

SocketChannel,針對(duì)面向流的連接套接字的可選擇通道。

看完上述內(nèi)容,你們對(duì)如何分析NIO有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)
推薦閱讀:
  1. Java NIO
  2. Java NIO深入分析

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

nio
AI