netty

BIO/NIO/AIO/NETTYhtml

摘自:芋道源碼 :精盡 Netty編程


同步與阻塞

同步/異步:針對的被調用者的狀態。也就是fun函數。(也就是上面的燒水壺)數組

同步是指fun若是沒有結果就不會返回,除非有結果了。
異步是指fun在被調用以後就當即返回了。返回結果以後再通知調用者(能夠用信號、回調之類的實現)。
服務器

阻塞/非阻塞:主要是針對調用者的,是指程序在等待結果時的狀態。(也就是上面的老張在等水開時的狀態)
阻塞是指調用線程會被掛起,不作什麼別的事情。在獲得結果以後纔會返回。
非阻塞是指不能當即獲得結果,當前線程不會被掛起,還能夠作別的事情。

摘自:阻塞非阻塞和同步異步的區別網絡


一、BIO

BIO ,全稱 Block-IO ,是一種 阻塞 + 同步 的通訊模式。 是一個比較傳統的通訊方式,模式簡單,使用方便。但併發處理能力低,通訊耗時,依賴網速

原理併發

  • 服務器經過一個 Acceptor 線程,負責監聽客戶端請求和爲每一個客戶端建立一個新的線程進行鏈路處理。典型的一請求一應答模式
  • 若客戶端數量增多,頻繁地建立和銷燬線程會給服務器打開很大的壓力。後改良爲用線程池的方式代替新增線程,被稱爲僞異步 IO 。

小結異步

BIO 模型中,經過 Socket 和 ServerSocket 實現套接字通道的通訊。阻塞,同步,創建鏈接耗時。函數

二、NIO 

NIO ,全稱 New IO ,也叫 Non-Block IO ,是一種 非阻塞 + 同步的通訊模式。

原理oop

NIO 相對於 BIO 來講一大進步。客戶端和服務器之間經過 Channel 通訊。NIO 能夠在 Channel 進行讀寫操做。這些 Channel 都會被註冊在 Selector 多路複用器上。Selector 經過一個線程不停的輪詢這些 Channel 。找出已經準備就緒的 Channel 執行 IO 操做。

NIO 經過一個線程輪詢,實現千萬個客戶端的請求,這就是非阻塞 NIO 的特色。spa

  • 緩衝區 Buffer :它是 NIO 與 BIO 的一個重要區別。
BIO 是將數據直接寫入或讀取到流 Stream 對象中。
NIO 的數據操做都是在 Buffer 中進行的。Buffer 其實是一個數組。Buffer 最多見的類型是ByteBuffer,另外還有 CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
  • 通道 Channel :和流 Stream 不一樣,通道是雙向的。NIO能夠經過 Channel 進行數據的讀、寫和同時讀寫操做。
通道分爲兩大類:一類是網絡讀寫(SelectableChannel),一類是用於文件操做(FileChannel)。咱們使用的是前者 SocketChannel 和 ServerSocketChannel ,都是SelectableChannel 的子類。
  • 多路複用器 Selector :NIO 編程的基礎。多路複用器提供選擇已經就緒的任務的能力:就是 Selector 會不斷地輪詢註冊在其上的通道(Channel),若是某個通道處於就緒狀態,會被 Selector 輪詢出來,而後經過 SelectionKey 能夠取得就緒的Channel集合,從而進行後續的 IO 操做。
服務器端只要提供一個線程負責 Selector 的輪詢,就能夠接入成千上萬個客戶端,這就是 JDK NIO 庫的巨大進步。

小結

NIO 模型中經過 SocketChannel 和 ServerSocketChannel 實現套接字通道的通訊。非阻塞,同步,避免爲每一個 TCP 鏈接建立一個線程。

三、AIO 

AIO ,全稱 Asynchronous IO ,也叫 NIO 2 ,是一種 非阻塞 + 異步 的通訊模式。在 NIO 的基礎上,引入了新的異步通道的概念,並提供了異步文件通道和異步套接字通道的實現。

原理

  • AIO 並無採用 NIO 的多路複用器,而是使用異步通道的概念。其 read,write 方法的返回類型,都是 Future 對象。而 Future 模型是異步的,其核心思想是:去主函數等待時間

小結

AIO 模型中經過 AsynchronousSocketChannel 和 AsynchronousServerSocketChannel 實現套接字通道的通訊。非阻塞,異步。

四、BIO、NIO 區別

  • 線程模型不一樣
    • BIO:一個鏈接一個線程,客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理。因此,線程開銷大。可改良爲用線程池的方式代替新建立線程,被稱爲僞異步 IO 
    • NIO:一個請求一個線程,但客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有新的 I/O 請求時,才啓動一個線程進行處理。可改良爲一個線程處理多個請求,基於 多 Reactor 模型
  • BIO 是面向流( Stream )的,而 NIO 是面向緩衝區( Buffer )的。
  • BIO 的各類操做是阻塞的,而 NIO 的各類操做是非阻塞的。
  • BIO 的 Socket 是單向的,而 NIO 的 Channel 是雙向的。


理解 BIO、NIO、AIO 的流程,能夠在理解下圖:

相關文章
相關標籤/搜索