基礎 | BIO、NIO與AIO

Java中的IO部分比較複雜,具體可參看書籍《Java NIO》和《Netty權威指南》。在此,僅對BIO、NIO和AIO進行概述性梳理,未涉及到具體實現細節,後續有空將深入展開。

同步IO和異步IO
參考答案:

IO操作主要分爲兩個步驟,即發起IO請求和實際IO操作,同步IO與異步IO的區別就在於第二個步驟是否阻塞。

若實際IO操作阻塞請求進程,即請求進程需要等待或者輪詢查看IO操作是否就緒,則爲同步IO。

若實際IO操作並不阻塞請求進程,而是由操作系統來進行實際IO操作並將結果返回,則爲異步IO。

阻塞IO和非阻塞IO
參考答案:

IO操作主要分爲兩個步驟,即發起IO請求和實際IO操作,阻塞IO與非阻塞IO的區別就在於第一個步驟是否阻塞。

若發起IO請求後請求線程一直等待實際IO操作完成,則爲阻塞IO。

若發起IO請求後請求線程返回而不會一直等待,即爲非阻塞IO。

BIO、NIO和AIO
參考答案:

BIO表示同步阻塞式IO,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器端就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。

NIO表示同步非阻塞IO,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有I/O請求時才啓動一個線程進行處理。

AIO表示異步非阻塞IO,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由操作系統先完成IO操作後再通知服務器應用來啓動線程進行處理。

應用場景:

BIO適用於連接數目比較小且固定的架構,該方式對服務器資源要求比較高,JDK 1.4以前的唯一選擇。
NIO適用於連接數目多且連接比較短(輕操作)的架構,如聊天服務器,編程複雜,JDK 1.4開始支持,如在Netty框架中使用。
AIO適用於連接數目多且連接比較長(重操作)的架構,如相冊服務器,充分調用操作系統參與併發操作,編程複雜,JDK 1.7開始支持。
備註:在大多數場景下,不建議直接使用JDK的NIO類庫(門檻很高),除非精通NIO編程或者有特殊的需求。在絕大多數的業務場景中,可以使用NIO框架Netty來進行NIO編程,其既可以作爲客戶端也可以作爲服務端,且支持UDP和異步文件傳輸,功能非常強大。

擴展面試題
問:談一談對同步IO和與異步IO的理解?

同步是指用戶進程觸發IO操作並等待或輪詢查看IO操作是否就緒。
異步是指用戶進程觸發IO操作後便開始做其他事情,當IO操作完成時用戶進程會得到相應的通知。
問:談一談對阻塞與非阻塞的理解(針對IO操作)?

在阻塞狀態下,如果沒有東西可讀或不可寫,讀寫函數將進入等待狀態,直到有東西可讀或可寫再返回。
非阻塞狀態下,如果沒有東西可讀或不可寫,讀寫函數馬上返回,而並不會等待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章