BIO、NIO、AIO有什么區別?


  • BIO:線程發起 IO 請求,不管內核是否准備好 IO 操作,從發起請求起,線程一直阻塞,直到操作完成。
  • NIO:線程發起 IO 請求,立即返回;內核在做好 IO 操作的准備之后,通過調用注冊的回調函數通知線程做 IO 操作,線程開始阻塞,直到操作完成。
  • AIO:線程發起 IO 請求,立即返回;內存做好 IO 操作的准備之后,做 IO 操作,直到操作完成或者失敗,通過調用注冊的回調函數通知線程做 IO 操作完成或者失敗。

 

  • BIO 是一個連接一個線程。
  • NIO 是一個請求一個線程。
  • AIO 是一個有效請求一個線程。

 

  • BIO:同步並阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
  • NIO:同步非阻塞,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
  • AIO:異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的 IO 請求都是由 OS 先完成了再通知服務器應用去啟動線程進行處理。

 

適用場景分析

  • BIO 方式適用於連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,並發局限於應用中,JDK1.4 以前的唯一選擇,但程序直觀簡單易理解。
  • NIO 方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,並發局限於應用中,編程比較復雜,JDK1.4 開始支持。
  • AIO 方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與並發操作,編程比較復雜,JDK7開始支持。


內容摘自:https://blog.csdn.net/u013068377/article/details/70312551
結合代碼可參考:https://www.cnblogs.com/barrywxx/p/8430790.html

 

  

來一道刷了進BAT的面試題?


免責聲明!

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



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