BIO、NIO、AIO疑點解析

假設有這麼一個場景,有一排水壺(客戶)在燒水。 java

AIO的作法是,每一個水壺上裝一個開關,當水開了之後會提醒對應的線程去處理。
NIO的作法是,叫一個線程不停的循環觀察每個水壺,根據每一個水壺當前的狀態去處理。
BIO的作法是,叫一個線程停留在一個水壺那,直到這個水壺燒開,纔去處理下一個水壺。react

java.NIO包裏包括三個基本的組件緩存

l buffer:由於NIO是基於緩衝的,因此buffer是最底層的必要類,這也是IO和NIO的根本不一樣,雖然stream等有buffer開頭的擴展類,但只是流的包裝類,仍是從流讀到緩衝區,而NIO倒是直接讀到buffer中進行操做。網絡

由於讀取的都是字節,因此在操做文字時,要用charset類進行編解碼操做。架構

2 channel:相似於IO的stream,可是不一樣的是除了FileChannel,其餘的channel都能以非阻塞狀態運行。FileChannel執行的是文件的操做,能夠直接DMA操做內存而不依賴於CPU。其餘好比socketchannel就能夠在數據準備好時才進行調用。IO分爲磁盤IO和網絡IO,因此一般意義上的NIO是指網絡IO,即除FileChnnel以外的channel均可以非阻塞socket

3 selector:用於分發請求到不一樣的channel,這樣才能確保channel不處於阻塞狀態就能夠收發消息性能

AIO:
爲何netty不使用AIO,而使用NIO優化

  1. Netty不看重Windows上的使用,在Linux系統上,AIO的底層實現仍使用EPOLL,沒有很好實現AIO,所以在性能上沒有明顯的優點,並且被JDK封裝了一層不容易深度優化。
  2. Netty總體架構是reactor模型, 而AIO是proactor模型, 混合在一塊兒會很是混亂,把AIO也改形成reactor模型看起來是把epoll繞個彎又繞回來。
  3. AIO還有個缺點是接收數據須要預先分配緩存, 而不是NIO那種須要接收時才須要分配緩存, 因此對鏈接數量很是大但流量小的狀況, 內存浪費不少。
  4. Linux上AIO不夠成熟,處理回調結果速度跟不上處理需求.
相關文章
相關標籤/搜索