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。


  1. 同步,就是我調用一個功能,該功能沒有結束前,我死等結果。
  2. 異步,就是我調用一個功能,不需要知道該功能結果,該功能有結果后通知我(回調通知)。
  3. 阻塞,就是調用我(函數),我(函數)沒有接收完數據或者沒有得到結果之前,我不會返回。
  4. 非阻塞,就是調用我(函數),我(函數)立即返回,通過select通知調用者

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和異步文件傳輸,功能非常強大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM