1. 基本概念
- BIO:一個(gè)連接一個(gè)線(xiàn)程,客戶(hù)端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線(xiàn)程進(jìn)行處理。線(xiàn)程開(kāi)銷(xiāo)大。
- 偽異步 IO:將請(qǐng)求連接放入線(xiàn)程池,一對(duì)多,但線(xiàn)程還是很寶貴的資源。
- NIO:一個(gè)請(qǐng)求一個(gè)線(xiàn)程,但客戶(hù)端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢(xún)到連接有 I/O 請(qǐng)求時(shí)才啟動(dòng)一個(gè)線(xiàn)程進(jìn)行處理。
- AIO:一個(gè)有效請(qǐng)求一個(gè)線(xiàn)程,客戶(hù)端的 I/O 請(qǐng)求都是由 OS 先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線(xiàn)程進(jìn)行處理。
2. 常規(guī)區(qū)別
- BIO是面向流的,NIO是面向緩沖區(qū)的;
- BIO的各種流是阻塞的。
- 而 NIO是非阻塞的;
- BIO的Stream是單向的,而NIO的channel是雙向的。
NIO的特點(diǎn):事件驅(qū)動(dòng)模型、單線(xiàn)程處理多任務(wù)、非阻塞I/O,I/O讀寫(xiě)不再阻塞,而是返回0、基于block的傳輸比基于流的傳輸更高效、更高級(jí)的IO函數(shù)zero-copy、IO多路復(fù)用大大提高了Java網(wǎng)絡(luò)應(yīng)用的可伸縮性和實(shí)用性。
基于Reactor線(xiàn)程模型。 在 Reactor模式中,事件分發(fā)器等待某個(gè)事件或者可應(yīng)用或個(gè)操作的狀態(tài)發(fā)生,事件分發(fā)器就把這個(gè)事件傳給事先注冊(cè)的事件處理函數(shù)或者回調(diào)函數(shù),由后者來(lái)做實(shí)際的讀寫(xiě)操作。
如在 Reactor中實(shí)現(xiàn)讀:注冊(cè)讀就緒事件和相應(yīng)的事件處理器、事件分發(fā)器等待事件、事件到來(lái),激活分發(fā)器,分發(fā)器調(diào)用事件對(duì)應(yīng)的處理器、事件處理器完成實(shí)際的讀操作,處理讀到的數(shù)據(jù),注冊(cè)新的事件,然后返還控制權(quán)。