Java面试基础篇——第九篇:BIO,NIO,AIO的区别
2019獨角獸企業重金招聘Python工程師標準>>>
現在IO模型主要分三類:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO()。 先來看看BIO。
1. BIO
服務端接受到請求后,要指派或新建一個線程去處理客戶端的IO請求,直到收到斷開連接的指令。這么做的弊端是什么呢?當服務端收到大量來自客戶端的IO請求時,需要新建大量線程來處理請求,服務器資源很可能被耗盡,高并發情況下,導致大量連接被掛起,服務器資源嚴重不足。因為BIO是同步阻塞模型,所以針對每個socket連接,服務器都要新建線程,哪怕是使用了線程池,也會造成因為線程上下文切換而造成大量開銷。
NIO
NIO是非阻塞IO,使用Reactor模型。Reactor模型中,NIO只有acceptor的服務線程是堵塞進行的,其它讀寫線程是通過注冊事件的方式,有讀寫事件激活時才調用線程資源去執行,不會一直堵塞等著讀寫操作。Reactor的瓶頸主要是在acceptor的執行,所有的讀寫事件都是在acceptor分發。
AIO
與NIO不同,AIO需要一個連接注冊讀寫事件和回調方法,當進行讀寫操作時,只須直接調用API的read或write方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序。總結:用戶發起IO操作立即返回,等IO操作完成后,應用程序會得到IO操作完成的通知,此時用戶進程只需要對通知進行處理,不需要進行實際的IO操作,因為實際操作已經由操作系統完成了。
BIO、NIO、AIO適用場景分析:
BIO方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
NIO方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,并發局限于應用中,編程比較復雜,JDK1.4開始支持。
AIO方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與并發操作,編程比較復雜,JDK7開始支持。
轉載于:https://my.oschina.net/liululee/blog/1861201
總結
以上是生活随笔為你收集整理的Java面试基础篇——第九篇:BIO,NIO,AIO的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于写完轮子一部分:tcp代理 了,记录
- 下一篇: 仓储层当前有接口 IRepository