BIO、NIO、AIO的區(qū)別和原理

一、IO模型的知識
JAVA BIO:同步并阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程并處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的開銷,當(dāng)然可以通過線程池機(jī)制改善
JAVA NIO:同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請求一個(gè)線程,即客戶端發(fā)送的連接請求都會(huì)注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有IO請求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理
JAVA AIO(NIO2):異步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請求一個(gè)線程,客戶端的I/O請求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線程進(jìn)行處理;
2.使用場景
BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開始支持。
AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu),比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開始支持。
3.BIO 同步并阻塞
tomcat采用的傳統(tǒng)的BIO(同步阻塞IO模型)+線程池模式,對于十萬甚至百萬連接的時(shí)候,傳統(tǒng)BIO模型是無能為力的:
①線程的創(chuàng)建和銷毀成本很高,在linux中,線程本質(zhì)就是一個(gè)進(jìn)程,創(chuàng)建銷毀都是重量級的系統(tǒng)函數(shù)
②線程本身占用較大的內(nèi)存,像java的線程棧一般至少分配512K-1M的空間,如果系統(tǒng)線程過高,內(nèi)存占用是個(gè)問題
③線程的切換成本高,操作系統(tǒng)發(fā)生線程切換的時(shí)候,需要保留線程的上下文,然后執(zhí)行系統(tǒng)調(diào)用,如果線程數(shù)過高可能執(zhí)行線程切換的時(shí)間甚至大于線程執(zhí)行的時(shí)間,這時(shí)候帶來的表現(xiàn)是系統(tǒng)load偏高,CPUsy使用率很高
④容易造成鋸齒狀的系統(tǒng)負(fù)載。系統(tǒng)負(fù)載是用活動(dòng)線程數(shù)或CPU核心數(shù),一旦線程數(shù)量高但外部網(wǎng)絡(luò)環(huán)境不是很穩(wěn)定,就很容易造成大量請求的結(jié)果同時(shí)返回,激活大量阻塞線程從而使系統(tǒng)負(fù)載壓力過大。

4.NIO同步非阻塞
NIO基于Reactor,當(dāng)socket有流可讀或可寫入socket,操作系統(tǒng)會(huì)相應(yīng)的通知引用程序進(jìn)行處理,應(yīng)用再將流讀取到緩沖區(qū)或?qū)懭氩僮飨到y(tǒng)。也就是,不是一個(gè)鏈接就要對應(yīng)一個(gè)處理線程,而是一個(gè)有效請求對應(yīng)一個(gè)線程,當(dāng)連接沒有數(shù)據(jù)時(shí),是沒有工作線程來處理的
Reactor模型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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