五、BIO、NIO、AIO面試題

一.什么是同步?什么是異步?

二.什么是阻塞?什么是非阻塞?

三.什么是阻塞IO?什么是非阻塞IO?

四.什么是同步IO?什么是異步IO?

五.五種IO模型

六.兩種高性能IO設(shè)計(jì)模式(Reactor和Proactor)

七. java中的BIO、NIO、AIO分別是什么?

  • BIO
    • 同步并阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開銷,當(dāng)然可以使用線程池機(jī)制改善
    • BIO方式適用于連接數(shù)比較小且固定的架構(gòu),這種對(duì)服務(wù)器資源要求較高,JDK1.4以前的唯一選擇,但程序直觀易懂。
  • NIO
    • 同步非阻塞,服務(wù)器實(shí)現(xiàn)為一個(gè)請(qǐng)求一個(gè)線程,即客戶端連接的請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到連接有IO請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。
    • NIO適用于連接數(shù)目多且比較短的架構(gòu),比如聊天服務(wù)器,編程復(fù)雜,JDK1.4才開始支持
  • AIO
    • 異步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請(qǐng)求一個(gè)線程,客戶端的IO請(qǐng)求都是由OS(內(nèi)核)先完成在通知到服務(wù)器應(yīng)用去啟動(dòng)線程進(jìn)行處理
    • AIO方式適用于連接數(shù)多且連接比較長(zhǎng)的架構(gòu),比如相冊(cè)服務(wù)器,充分調(diào)用OS(內(nèi)核)來參與并發(fā)操作,編程復(fù)雜,JDK7才開始支持

八、NIO的了解
將多個(gè)IO的阻塞復(fù)用到同一個(gè)select的阻塞上,從而使得系統(tǒng)在單線程的情況下處理多個(gè)客戶端請(qǐng)求。

NIO三個(gè)核心對(duì)象:通道(Channel)、緩沖區(qū)(Buffer)和選擇器(Selector)

具體說就是Selector會(huì)不斷輪詢注冊(cè)在其上的Channel,如果某個(gè)Channel上有新的TCP連接,讀或者寫事件,這個(gè)Channel就處于就緒狀態(tài),會(huì)被Selector輪詢出來,然后通過SelectorKey可以獲取就緒Channel的集合,進(jìn)行后續(xù)I/O操作。

NIO單線程輪詢事件,找到可以進(jìn)行讀寫的網(wǎng)絡(luò)描述符進(jìn)行讀寫。除了事件的輪詢是阻塞的(沒有可干的事情必須要阻塞),剩余的I/O操作都是純CPU操作,沒有必要開啟多線程。并且由于線程的節(jié)約,連接數(shù)大的時(shí)候因?yàn)榫€程切換帶來的問題也隨之解決,進(jìn)而為處理海量連接提供了可能。

單線程處理I/O的效率確實(shí)非常高,沒有線程切換,只是拼命的讀、寫、選擇事件。但現(xiàn)在的服務(wù)器,一般都是多核處理器,如果能夠利用多核心進(jìn)行I/O,無疑對(duì)效率會(huì)有更大的提高。

九、Java Reactor模式 異步非阻塞IO

下圖是Reactor的多線程模型

image

其特點(diǎn)如下:

(1)有專門一個(gè)NIO線程-Acceptor線程用于監(jiān)聽服務(wù)端,接收客戶端的TCP連接請(qǐng)求

(2)網(wǎng)絡(luò)IO操作-讀、寫等由一個(gè)NIO線程池負(fù)責(zé),線程池可以采用標(biāo)準(zhǔn)的JDK線程池實(shí)現(xiàn),它包含一個(gè)任務(wù)隊(duì)列和N個(gè)可用的線程,由這些NIO線程負(fù)責(zé)消息的讀取、解碼、編碼和發(fā)送。

(3)一個(gè)NIO線程可以同時(shí)處理N條鏈路,但是一個(gè)鏈路只對(duì)應(yīng)一個(gè)NIO線程,防止發(fā)生并發(fā)操作問題。

下圖是主從Reactor的多線程模型。

image

由于單獨(dú)一個(gè)Acceptor線程可能會(huì)存在性能不中的問題,所以需要主從Reactor模型。

服務(wù)端用于接收客戶端的不再是一個(gè)單獨(dú)的NIO線程,而是一個(gè)獨(dú)立的NIO線程池。

十、參考資源:

  1. https://segmentfault.com/a/1190000014932357?utm_source=tag-newest
    2.https://mp.weixin.qq.com/s__biz=MzU4NDQ4MzU5OA==&mid=2247483985&idx=1&sn=38531c2cee7b87f125df7aef41637014&chksm=fd985430caefdd26b0506aa84fc26251877eccba24fac73169a4d6bd1eb5e3fbdf3c3b940261#rd
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容