1. 程式人生 > >基礎 | BIO、NIO與AIO

基礎 | 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操作)?

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

特殊說明:

以上兩個題的參考答案僅供大家參考,與「BIO、NIO和AIO」部分的參考答案類似,只是個人覺得後者更有助於理解。另外,IO操作部分涉及的內容真的很多,此次僅為概述性總結,後續有機會重點展開。


推薦閱讀


歡迎關注

Java名企面試吧,隔天10點24分,我們不見不散!

丙子先生的宗旨是,每兩天以短篇幅講高頻面試題,不增加太多負擔,但需要持之以恆。

能力有限,歡迎指教!