一.什么是同步?什么是異步?
二.什么是阻塞?什么是非阻塞?
三.什么是阻塞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的多線程模型

其特點(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的多線程模型。

由于單獨(dú)一個(gè)Acceptor線程可能會(huì)存在性能不中的問題,所以需要主從Reactor模型。
服務(wù)端用于接收客戶端的不再是一個(gè)單獨(dú)的NIO線程,而是一個(gè)獨(dú)立的NIO線程池。
十、參考資源: