1. 程式人生 > >NIO、BIO、AIO區別

NIO、BIO、AIO區別

一、同步阻塞I/O(BIO):

同步阻塞I/O,伺服器實現模式為一個連線一個執行緒,即客戶端有連線請求時伺服器就需要啟動一個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,可以通過執行緒池機制來改善。BIO方式適用於連線數目比較小且固定的架構,這種方式對服務端資源要求比較高,併發侷限於應用中,在jdk1.4以前是唯一的io現在,但程式直觀簡單易理解

二、同步非阻塞I/O(NIO):

同步非阻塞I/O,伺服器實現模式為一個請求一個執行緒,即客戶端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有IO請求時才啟動一個執行緒進行處理。NIO方式適用於連線數目多且連線比較短(輕操作)的架構,比如聊天伺服器,併發侷限於應用中,程式設計比較複雜,jdk1,4開始支援

三、非同步非阻塞I/O(AIO):

非同步非阻塞I/O,伺服器實現模式為一個有效請求一個執行緒,客戶端的IO請求都是由作業系統先完成了再通知伺服器用其啟動執行緒進行處理。AIO方式適用於連線數目多且連線比較長(重操作)的架構,比如相簿伺服器,充分呼叫OS參與併發操作,程式設計比較複雜,jdk1.7開始支援。

四、IO與NIO區別:

  • IO面向流,NIO面向緩衝區
  • IO的各種流是阻塞的,NIO是非阻塞模式
  • Java NIO的選擇允許一個單獨的執行緒來監視多個輸入通道,可以註冊多個通道使用一個選擇器,然後使用一個單獨的執行緒來“選擇”通道:這些通道里已經有可以處理的輸入或選擇已準備寫入的通道。這種選擇機制,使得一個單獨的執行緒很容易來管理多個通道

五、同步與非同步的區別:

  • 同步:傳送一個請求,等待返回,再發送下一個請求,同步可以避免出現死鎖,髒讀的發生

  • 非同步:傳送一個請求,不等待返回,隨時可以再發送下一個請求,可以提高效率,保證併發

五、同步非同步關注點在於訊息通訊機制,

阻塞與非阻塞關注的是程式在等待呼叫結果時(訊息、返回值)的狀態:

  • 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
  • 非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒

六、不同層次:

  • CPU層次:作業系統進行IO或任務排程層次,現代作業系統通常使用非同步非阻塞方式進行IO(有少部分IO可能會使用同步非阻塞),即發出IO請求後,並不等待IO操作完成,而是繼續執行接下來的指令(非阻塞),IO操作和CPU指令互不干擾(非同步),最後通過中斷的方式通知IO操作的完成結果。

  • 執行緒層次:作業系統排程單元的層次,作業系統為了減輕程式設計師的思考負擔,將底層的非同步非阻塞的IO方式進行封裝,把相關係統呼叫(如read和write)以同步的方式展現出來,然而同步阻塞IO會使執行緒掛起,同步非阻塞IO會消耗CPU資源在輪詢上,3個解決方法;
    • 多執行緒(同步阻塞)
    • IO多路複用(select、poll、epoll)
    • 直接暴露出非同步的IO介面,kernel-aio和IOCP(非同步非阻塞)

七、Linux IO模型:

  • 阻塞/非阻塞:等待I/O完成的方式,阻塞要求使用者程式停止執行,直到IO完成,而非阻塞在IO完成之前還可以繼續執行
  • 同步/非同步:獲知IO完成的方式,同步需要時刻關心IO是否完成,非同步無需主動關心,在IO完成時它會收到通知

參考作者:Vechace