NIO模型
同步非阻塞
NIO有同步阻塞和同步非阻塞兩種模式,一般講的是同步非阻塞,服務器實現模式為一個請求一個線程,但客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
AIO模型
異步非阻塞
服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理,
注:AIO又稱為NIO2.0,在JDK7才開始支持。
為什么Netty使用NIO而不是AIO?
- Netty不看重Windows上的使用,在Linux系統上,AIO的底層實現仍使用EPOLL,沒有很好實現AIO,因此在性能上沒有明顯的優勢,而且被JDK封裝了一層不容易深度優化
- Netty整體架構是reactor模型, 而AIO是proactor模型, 混合在一起會非常混亂,把AIO也改造成reactor模型看起來是把epoll繞個彎又繞回來
- AIO還有個缺點是接收數據需要預先分配緩存, 而不是NIO那種需要接收時才需要分配緩存, 所以對連接數量非常大但流量小的情況, 內存浪費很多
- Linux上AIO不夠成熟,處理回調結果速度跟不到處理需求,比如外賣員太少,顧客太多,供不應求,造成處理速度有瓶頸(待驗證)
作者原話:
Not faster than NIO (epoll) on unix systems (which is true)
There is no daragram suppport
Unnecessary threading model (too much abstraction without usage)
不比nio塊在Unix系統上
不支持數據報
不必要的線程模型(太多沒什么用的抽象化)