Java面试基础篇——第九篇:BIO,NIO,AIO的区别
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
現(xiàn)在IO模型主要分三類:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO()。 先來看看BIO。
1. BIO
服務(wù)端接受到請求后,要指派或新建一個線程去處理客戶端的IO請求,直到收到斷開連接的指令。這么做的弊端是什么呢?當(dāng)服務(wù)端收到大量來自客戶端的IO請求時,需要新建大量線程來處理請求,服務(wù)器資源很可能被耗盡,高并發(fā)情況下,導(dǎo)致大量連接被掛起,服務(wù)器資源嚴(yán)重不足。因為BIO是同步阻塞模型,所以針對每個socket連接,服務(wù)器都要新建線程,哪怕是使用了線程池,也會造成因為線程上下文切換而造成大量開銷。
NIO
NIO是非阻塞IO,使用Reactor模型。Reactor模型中,NIO只有acceptor的服務(wù)線程是堵塞進(jìn)行的,其它讀寫線程是通過注冊事件的方式,有讀寫事件激活時才調(diào)用線程資源去執(zhí)行,不會一直堵塞等著讀寫操作。Reactor的瓶頸主要是在acceptor的執(zhí)行,所有的讀寫事件都是在acceptor分發(fā)。
AIO
與NIO不同,AIO需要一個連接注冊讀寫事件和回調(diào)方法,當(dāng)進(jìn)行讀寫操作時,只須直接調(diào)用API的read或write方法即可。這兩種方法均為異步的,對于讀操作而言,當(dāng)有流可讀取時,操作系統(tǒng)會將可讀的流傳入read方法的緩沖區(qū),并通知應(yīng)用程序;對于寫操作而言,當(dāng)操作系統(tǒng)將write方法傳遞的流寫入完畢時,操作系統(tǒng)主動通知應(yīng)用程序。總結(jié):用戶發(fā)起IO操作立即返回,等IO操作完成后,應(yīng)用程序會得到IO操作完成的通知,此時用戶進(jìn)程只需要對通知進(jìn)行處理,不需要進(jìn)行實際的IO操作,因為實際操作已經(jīng)由操作系統(tǒng)完成了。
BIO、NIO、AIO適用場景分析:
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開始支持。
轉(zhuǎn)載于:https://my.oschina.net/liululee/blog/1861201
總結(jié)
以上是生活随笔為你收集整理的Java面试基础篇——第九篇:BIO,NIO,AIO的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于写完轮子一部分:tcp代理 了,记录
- 下一篇: 仓储层当前有接口 IRepository