一、BIO(Blocking I/O)
BIO,同步阻塞IO模型,應(yīng)用程序發(fā)起系統(tǒng)調(diào)用后會一直等待數(shù)據(jù)的請求,直至內(nèi)核從磁盤獲取到數(shù)據(jù)并拷貝到用戶空間;
在一般的場景中,多線程模型下的BIO是成本較低、收益較高的方式。但是,如果在高并發(fā)的場景下,過多的創(chuàng)建線程,會嚴(yán)重占據(jù)系統(tǒng)資源,降低系統(tǒng)對外界響應(yīng)效率。即使使用線程池,只能一定程度上緩解了頻繁調(diào)用IO接口帶來的資源占用。
二、NIO(Non-Blocking/New I/O)
NIO,JAVA中與JDK1.4引入該IO模型,但不要簡單的理解為同步非阻塞,JAVA中的NIO實(shí)際上可以看作IO多路復(fù)用模型,下面簡單介紹下這兩種I/O模型。
2.1 同步非阻塞模型
應(yīng)用程序向內(nèi)核發(fā)起請求后,即使kernel沒有從磁盤中取到數(shù)據(jù),也會返回一個(gè)結(jié)果給用戶,用戶判斷結(jié)果正確性,如果不是需要的數(shù)據(jù),則后續(xù)繼續(xù)發(fā)起請求,即輪詢請求,直至kernel取到數(shù)據(jù)并返回。
采用輪詢方式,會導(dǎo)致系統(tǒng)上下文切換開銷很大,會大幅度推高CPU占用率。
2.2 IO多路復(fù)用模型
Java 中的 NIO ,有一個(gè)非常重要的選擇器 ( Selector ) 的概念,也可以被稱為 多路復(fù)用器。通過它,只需要一個(gè)線程便可以管理多個(gè)客戶端連接。當(dāng)客戶端數(shù)據(jù)到了之后,才會為其服務(wù)。線程首先發(fā)起 select 調(diào)用,詢問內(nèi)核數(shù)據(jù)是否準(zhǔn)備就緒,等內(nèi)核把數(shù)據(jù)準(zhǔn)備好了,用戶線程再發(fā)起 read 調(diào)用。
IO 多路復(fù)用模型,通過減少無效的系統(tǒng)調(diào)用,減少了對 CPU 資源的消耗,解決了同步阻塞I/O和同步非阻塞I/O的問題,是一種非常高效的I/O模型。
三、AIO(Asynchronous I/O)
AIO,異步IO模型,也叫NIO2,JAVA7中引入,異步 IO 是基于事件和回調(diào)機(jī)制實(shí)現(xiàn)的,也就是應(yīng)用操作之后會直接返回,不會堵塞在那里,當(dāng)后臺處理完成,操作系統(tǒng)會通知相應(yīng)的線程進(jìn)行后續(xù)的操作。
四、幾種常見IO模型的對比
文章來源:http://www.zghlxwxcb.cn/news/detail-712158.html
圖片來自【美團(tuán)技術(shù)團(tuán)隊(duì)】https://tech.meituan.com/2016/11/04/nio.html ,其中也詳細(xì)闡述了NIO模型,可前往學(xué)習(xí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-712158.html
到了這里,關(guān)于JAVA中三種I/O框架——BIO、NIO、AIO的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!