常見JAVA中IO/NIO模型有哪些-創(chuàng)新互聯(lián)

常見JAVA中IO/NIO模型有哪些?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)建站專注于靈壽網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供靈壽營銷型網(wǎng)站建設(shè),靈壽網(wǎng)站制作、靈壽網(wǎng)頁設(shè)計、靈壽網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造靈壽網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供靈壽網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

 我們常見的IO模型有:阻塞 IO 模型、非阻塞 IO 模型、多路復(fù)用 IO 模型、 信號驅(qū)動 IO 模型、異步 IO 模型;下面我們就簡單介紹一下以上IO模型。

1、阻塞 IO 模型

最傳統(tǒng)的一種IO 模型,即在讀寫數(shù)據(jù)過程中會發(fā)生阻塞現(xiàn)象。當(dāng)用戶線程發(fā)出IO 請求之后,內(nèi)核會去查看數(shù)據(jù)是否就緒,如果沒有就緒就會等待數(shù)據(jù)就緒,而用戶線程就會處于阻塞狀態(tài),用戶線程交出CPU。當(dāng)數(shù)據(jù)就緒之后,內(nèi)核會將數(shù)據(jù)拷貝到用戶線程,并返回結(jié)果給用戶線程,用戶線程才解除block 狀態(tài)。典型的阻塞IO 模型的例子為:data = socket.read();如果數(shù)據(jù)沒有就緒,就會一直阻塞在read 方法。

2、非阻塞 IO 模型

當(dāng)用戶線程發(fā)起一個read 操作后,并不需要等待,而是馬上就得到了一個結(jié)果。如果結(jié)果是一個error 時,它就知道數(shù)據(jù)還沒有準(zhǔn)備好,于是它可以再次發(fā)送read 操作。一旦內(nèi)核中的數(shù)據(jù)準(zhǔn)備好了,并且又再次收到了用戶線程的請求,那么它馬上就將數(shù)據(jù)拷貝到了用戶線程,然后返回。所以事實(shí)上,在非阻塞IO 模型中,用戶線程需要不斷地詢問內(nèi)核數(shù)據(jù)是否就緒,也就說非阻塞IO不會交出CPU,而會一直占用CPU。典型的非阻塞IO 模型一般如下:

while(true){
        data = socket.read();
        if(data!= error){
        處理數(shù)據(jù)
        break;
    }
}

但是對于非阻塞IO 就有一個非常嚴(yán)重的問題,在while 循環(huán)中需要不斷地去詢問內(nèi)核數(shù)據(jù)是否就緒,這樣會導(dǎo)致CPU 占用率非常高,因此一般情況下很少使用while 循環(huán)這種方式來讀取數(shù)據(jù)。

3、多路復(fù)用 IO 模型

多路復(fù)用IO 模型是目前使用得比較多的模型。

Java NIO 實(shí)際上就是多路復(fù)用IO。在多路復(fù)用IO模型中,會有一個線程不斷去輪詢多個socket 的狀態(tài),只有當(dāng)socket 真正有讀寫事件時,才真正調(diào)用實(shí)際的IO 讀寫操作。

因?yàn)樵诙嗦窂?fù)用IO 模型中,只需要使用一個線程就可以管理多個socket,系統(tǒng)不需要建立新的進(jìn)程或者線程,也不必維護(hù)這些線程和進(jìn)程,并且只有在真正有socket 讀寫事件進(jìn)行時,才會使用IO 資源,所以它大大減少了資源占用。

在Java NIO 中,是通過selector.select()去查詢每個通道是否有到達(dá)事件,如果沒有事件,則一直阻塞在那里,因此這種方式會導(dǎo)致用戶線程的阻塞。

多路復(fù)用IO 模式,通過一個線程就可以管理多個socket,只有當(dāng)socket 真正有讀寫事件發(fā)生才會占用資源來進(jìn)行實(shí)際的讀寫操作。因此,多路復(fù)用IO 比較適合連接數(shù)比較多的情況。

另外多路復(fù)用IO 為何比非阻塞IO 模型的效率高是因?yàn)樵诜亲枞鸌O 中,不斷地詢問socket 狀態(tài)時通過用戶線程去進(jìn)行的,而在多路復(fù)用IO 中,輪詢每個socket 狀態(tài)是內(nèi)核在進(jìn)行的,這個效率要比用戶線程要高的多。

不過要注意的是,多路復(fù)用IO 模型是通過輪詢的方式來檢測是否有事件到達(dá),并且對到達(dá)的事件逐一進(jìn)行響應(yīng)。因此對于多路復(fù)用IO 模型來說,一旦事件響應(yīng)體很大,那么就會導(dǎo)致后續(xù)的事件遲遲得不到處理,并且會影響新的事件輪詢。

4、信號驅(qū)動 IO 模型

在信號驅(qū)動IO 模型中,當(dāng)用戶線程發(fā)起一個IO 請求操作,會給對應(yīng)的socket 注冊一個信號函數(shù),然后用戶線程會繼續(xù)執(zhí)行,當(dāng)內(nèi)核數(shù)據(jù)就緒時會發(fā)送一個信號給用戶線程,用戶線程接收到信號之后,便在信號函數(shù)中調(diào)用IO 讀寫操作來進(jìn)行實(shí)際的IO 請求操作。

5、異步 IO 模型

異步IO 模型才是最理想的IO 模型,在異步IO 模型中,當(dāng)用戶線程發(fā)起read 操作之后,立刻就可以開始去做其它的事。

而另一方面,從內(nèi)核的角度,當(dāng)它受到一個asynchronous read 之后,它會立刻返回,說明read 請求已經(jīng)成功發(fā)起了,因此不會對用戶線程產(chǎn)生任何block。

然后,內(nèi)核會等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶線程,當(dāng)這一切都完成之后,內(nèi)核會給用戶線程發(fā)送一個信號,告訴它read 操作完成了。也就說用戶線程完全不需要實(shí)際的整個IO 操作是如何進(jìn)行的,只需要先發(fā)起一個請求,當(dāng)接收內(nèi)核返回的成功信號時表示IO 操作已經(jīng)完成,可以直接去使用數(shù)據(jù)了。

也就說在異步IO 模型中,IO 操作的兩個階段都不會阻塞用戶線程,這兩個階段都是由內(nèi)核自動完成,然后發(fā)送一個信號告知用戶線程操作已完成。用戶線程中不需要再次調(diào)用IO 函數(shù)進(jìn)行具體的讀寫。

這點(diǎn)是和信號驅(qū)動模型有所不同的,在信號驅(qū)動模型中,當(dāng)用戶線程接收到信號表示數(shù)據(jù)已經(jīng)就緒,然后需要用戶線程調(diào)用IO 函數(shù)進(jìn)行實(shí)際的讀寫操作;而在異步IO 模型中,收到信號表示IO 操作已經(jīng)完成,不需要再在用戶線程中調(diào)用IO 函數(shù)進(jìn)行實(shí)際的讀寫操作。

注意,異步IO 是需要操作系統(tǒng)的底層支持,在Java 7 中,提供了Asynchronous IO。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司的支持。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁標(biāo)題:常見JAVA中IO/NIO模型有哪些-創(chuàng)新互聯(lián)
分享URL:http://bm7419.com/article14/dsdhge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)外貿(mào)建站、用戶體驗(yàn)微信小程序網(wǎng)站設(shè)計公司、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)