BIO與NIO模型

不畏浮云遮望眼,只緣身在此山中

最近再看dubbo源碼,然后看到通信模塊的netty,卡住了,感覺netty源碼似懂非懂,有些原理根本不知道為什么是這樣,特別是netty中使用到的通信模型,更是云里霧里,所以還是決定從Java中IO開始重新入手,逐漸深入,今天就來(lái)記錄下BIO與NIO模型,主要是看了視頻后的觀后感,視頻地址文末會(huì)分享出來(lái),講的比較好,文章寫的比較簡(jiǎn)單入門,所以要深入,需要自己去研究源碼,當(dāng)然后面自己有更深的心得,也會(huì)分享出來(lái)。如有文中有書寫或其他問題,請(qǐng)留言指導(dǎo)修正,互相交流,共同進(jìn)步,本人QQ:417213902。

主要從以下幾個(gè)方面入手:

  • 1、提出一個(gè)疑問:您能描述下一個(gè)http請(qǐng)求嗎?
  • 2、通過在tomcat中的使用,對(duì)BIO與NIO模型比較
  • 3、BIO與NIO應(yīng)用場(chǎng)景

一、提出疑問

這個(gè)一般大中型公司面試最喜歡的一到題目:
您能描述下一個(gè)http請(qǐng)求嗎?
解答如下,主要從下面兩個(gè)方面闡述

  • 網(wǎng)絡(luò)層,數(shù)據(jù)傳輸層面
     網(wǎng)絡(luò)傳輸:TCP、UDP
     通信模型:BIO、NIO、AIO

  • 應(yīng)用層,數(shù)據(jù)處理層面
     應(yīng)用協(xié)議:http、rmi 、webservice、redis、jms
     序列化協(xié)議:json、
     業(yè)務(wù)處理:servlet
    從上面可知道,BIO、NIO或者是AIO 是作用于網(wǎng)絡(luò)層的通信模型


    image.png

二、BIO與NIO的比較

1、實(shí)踐測(cè)試
由于時(shí)間問題,比較流程大概描述下,后面直接給出結(jié)論,有興趣的小伙伴可以自己去嘗試下。
在tomcat7下分別配置指定AIO和NIO模型, 模擬做http請(qǐng)求,查看在設(shè)定相同的最大請(qǐng)求數(shù)下,隨著請(qǐng)求數(shù)增多,BIO和NIO不同模型下線程數(shù)變化情況。tomcat7 默認(rèn)情況下就是使用BIO模型,配置是在 server.xml里


image.png

表示采用BIO


image.png

表示采用NIO
測(cè)試結(jié)果 :
BIO :隨著請(qǐng)求數(shù)增多,線程數(shù)也會(huì)增多
NIO :  隨著請(qǐng)求數(shù)增多,線程數(shù)不會(huì)增多

2、理論說(shuō)明

  • (1) BIO : 同步阻塞式模型,在tomcat中它的原理是從客戶端到服務(wù)端在建立連接、寫入、讀取等都是一個(gè)線程處理,所以它是穩(wěn)定的、安全的。它也是實(shí)現(xiàn)中java中的serverSocket,調(diào)用accept方法,這個(gè)accept在有請(qǐng)求時(shí)返回一個(gè)socket,沒有請(qǐng)求時(shí),就阻塞著,但是這里的阻塞并不是導(dǎo)致它就是阻塞模型的原來(lái),其真正原因是網(wǎng)絡(luò)傳輸、業(yè)務(wù)處理等阻塞,阻塞的時(shí)間取決于對(duì)方I/O線程的處理速度和網(wǎng)絡(luò)I/O的傳輸速度。


    image.png

在以BIO模型實(shí)現(xiàn)的tomcat中,線程有,

  • Acceptor線程 : 不斷調(diào)用 Accept()方法
  • Exec線程 : 執(zhí)行調(diào)用業(yè)務(wù)

當(dāng)然以上問題,在tomcat中針對(duì)使用BIO問題,也做了相應(yīng)的優(yōu)化,比如使用線程池,實(shí)現(xiàn)異步阻塞式模型,

image.png
  • (2) NIO:同步非阻塞式模型,在tomcat7后開始支持NIO模型,tomcat8已經(jīng)開始支持AIO模型了。NIO中之所以能夠支持?jǐn)?shù)萬(wàn)級(jí)別的高并發(fā),其主要原因是它有通道的多路復(fù)用的實(shí)現(xiàn),叫Selector,在nio.channels包下,它負(fù)責(zé)輪詢請(qǐng)求狀態(tài),并封裝在SelectionKey中,通知其他線程去執(zhí)行。

在以NIO模型實(shí)現(xiàn)的tomcat中,線程有,

  • ClientPoller 線程:多路復(fù)用器(Selector),輪詢監(jiān)聽四類事件(Connect、Accept、Read、Write),會(huì)通知exec線程 。 tomcat 中默認(rèn)是兩個(gè)線程,可配置
  • Acceptor線程 : 不斷調(diào)用 Accept()方法
  • Exec線程 : 執(zhí)行調(diào)用業(yè)務(wù)


    image.png

NIO,默認(rèn)也是支持阻塞式 ,configureBlocking(false) 設(shè)置成非阻塞的

三、應(yīng)用場(chǎng)景

  • BIO : 適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對(duì)服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡(jiǎn)單易理解,tomcat7之前支持的通信模型
  • NIO:適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開始支持,tomcat7開始支持的通信模型

2017-12-03 23:18:00

?著作權(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)容

  • 午加餐:紅薯晚水果:草莓、橘子 參考目標(biāo): 1份豆2份肉3份“新鮮”水果4份谷物/薯5份蔬菜,深綠色葉菜最好6杯水...
    靜趣_兒童心理師閱讀 245評(píng)論 0 0
  • 日精進(jìn):敬畏—進(jìn)入—體驗(yàn)—交給—持續(xù) 1,缺啥補(bǔ)啥,怕啥練啥; 2,切為我所用,所用為團(tuán)隊(duì)家; 3,我想變,我要...
    隆非凡閱讀 173評(píng)論 0 0
  • 都說(shuō)射手座一直在喜歡不喜歡自己的人,我很同意這一點(diǎn)了,剛和五年的同學(xué)說(shuō)完,我大一的時(shí)候他復(fù)習(xí)高四,他高考完我喜歡他...
    更年期是病閱讀 208評(píng)論 0 0
  • 俞鑫磊在房間里打了個(gè)電話給黑鬼說(shuō)道:“你那邊怎么樣?我這邊的準(zhǔn)備工作都OK了!” “你放心,我這邊已經(jīng)可以開始計(jì)劃...
    e80e73364a65閱讀 208評(píng)論 0 1
  • Solr是什么? Solr 是Apache下的一個(gè)頂級(jí)開源項(xiàng)目,采用Java開發(fā),它是基于Lucene的全文搜索服...
    FTOLsXD閱讀 798評(píng)論 0 4

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