BIO、NIO、AIO的區別

收破爛的小熊貓~發表於2021-01-04

BIO、NIO、AIO

最近打算學習一下netty框架,netty是一款用於高效開發網路應用的NIO網路架構。在學習它之前,我覺得有必要對java IO程式設計知識進行一定的瞭解。

在講 BIO,NIO,AIO 之前先來回顧一下這樣幾個概念:同步與非同步,阻塞與非阻塞。

同步與非同步

同步: 同步就是發起一個呼叫後,被呼叫者未處理完請求之前,呼叫不返回。

非同步: 非同步就是發起一個呼叫後,立刻得到被呼叫者的回應表示已接收到請求,但是被呼叫者並沒有返回結果,此時我們可以處理其他的請求,被呼叫者通常依靠事件,回撥等機制來通知呼叫者其返回結果。

同步和非同步的區別最大在於非同步的話呼叫者不需要等待處理結果,被呼叫者會通過回撥等機制來通知呼叫者其返回結果。

阻塞和非阻塞

阻塞: 阻塞就是發起一個請求,呼叫者一直等待請求結果返回,也就是當前執行緒會被掛起,無法從事其他任務,只有當條件就緒才能繼續。

非阻塞: 非阻塞就是發起一個請求,呼叫者不用一直等著結果返回,可以先去幹其他事情。

那麼同步阻塞、同步非阻塞和非同步非阻塞又代表什麼意思呢?

舉個生活中簡單的例子,你媽媽讓你燒水,小時候你比較笨啊,在哪裡傻等著水開(同步阻塞)。等你稍微再長大一點,你知道每次燒水的空隙可以去幹點其他事,然後只需要時不時來看看水開了沒有(同步非阻塞)。後來,你們家用上了水開了會發出聲音的壺,這樣你就只需要聽到響聲後就知道水開了,在這期間你可以隨便幹自己的事情,你需要去倒水了(非同步非阻塞)

Java BIO

BIO稱為同步並阻塞是傳統阻塞IO模型。主要表現形式為服務端對客戶端發起的請求,一個請求就開啟一個執行緒做處理。如果這個連線不做任何事情會造成不必要的執行緒開銷
在這裡插入圖片描述

Java NIO

NIO 稱為同步非阻塞,伺服器實現模式為一個執行緒處理多個請求(連線),即客戶端傳送的連線請求都會注 冊到多路複用器上,多路複用器輪詢到連線有 I/O 請求就進行處理 .
在這裡插入圖片描述

Java AIO

AIO,非同步非阻塞IO模型也稱為NIO2.0,伺服器實現模式為一個有效請求一個執行緒,客戶端較多的IO請求都是有求都是由OS(作業系統)先完成了再通知伺服器應用去啟動執行緒進行處理。

主要區別

1.BIO 方式適用於連線數目比較小且固定的架構,這種方式對伺服器資源要求比較高,併發侷限於應用中,JDK1.4以前的唯一選擇,但程式簡單易理解。

2.NIO 方式適用於連線數目多且連線比較短(輕操作)的架構,比如聊天伺服器,彈幕系統,伺服器間通訊等。 程式設計比較複雜,JDK1.4 開始支援。

3.AIO 方式使用於連線數目多且連線比較長(重操作)的架構,比如相簿伺服器,充分呼叫 OS 參與併發操作, 程式設計比較複雜,JDK7 開始支援。

參考部落格:Java面試常考的 BIO,NIO,AIO 總結

相關文章