NIO模型
同步非阻塞
NIO有同步阻塞和同步非阻塞兩種模式,一般講的是同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請(qǐng)求一個(gè)線程,但客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。
AIO模型
異步非阻塞
服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請(qǐng)求一個(gè)線程,客戶端的I/O請(qǐng)求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線程進(jìn)行處理,
注:AIO又稱為NIO2.0,在JDK7才開(kāi)始支持。
為什么Netty使用NIO而不是AIO?
- Netty不看重Windows上的使用,在Linux系統(tǒng)上,AIO的底層實(shí)現(xiàn)仍使用EPOLL,沒(méi)有很好實(shí)現(xiàn)AIO,因此在性能上沒(méi)有明顯的優(yōu)勢(shì),而且被JDK封裝了一層不容易深度優(yōu)化
- Netty整體架構(gòu)是reactor模型, 而AIO是proactor模型, 混合在一起會(huì)非?;靵y,把AIO也改造成reactor模型看起來(lái)是把epoll繞個(gè)彎又繞回來(lái)
- AIO還有個(gè)缺點(diǎn)是接收數(shù)據(jù)需要預(yù)先分配緩存, 而不是NIO那種需要接收時(shí)才需要分配緩存, 所以對(duì)連接數(shù)量非常大但流量小的情況, 內(nèi)存浪費(fèi)很多
- Linux上AIO不夠成熟,處理回調(diào)結(jié)果速度跟不到處理需求,比如外賣員太少,顧客太多,供不應(yīng)求,造成處理速度有瓶頸(待驗(yàn)證)
作者原話:
Not faster than NIO (epoll) on unix systems (which is true)
There is no daragram suppport
Unnecessary threading model (too much abstraction without usage)
其他:
Netty背后的事件驅(qū)動(dòng)機(jī)制
技術(shù)討論 & 疑問(wèn)建議 & 個(gè)人博客
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協(xié)議,轉(zhuǎn)載請(qǐng)注明出處!