BIO、NIO、AIO及java中NIO 與netty的 IOCP區別聯絡
還沒有找到答案嗎?
那我說一下吧
iocp和poll/epoll這些是作業系統層面的東西
iocp是win,poll(linux和unix)
後者在linux上可以改成epoll,在mac或bsd上可以改成kqueue,效能更佳,使用netty的native transport特性,在vert.x最新版本中亦支援這兩種優化,很爽的
nio是java或者說jvm層面的東西,說白了就是基於iocp&poll的一個統一的java介面
netty是jvm之上框架層面的東西,說白了就是一個基於nio的框架
可以看到三個層次,後者基於前者
作業系統是啥?windows,macosx,linux(其實這個是kernal,你懂的,不懂百度下就有)
jvm是虛擬機器,是我們經常需要安裝的這麼一個東西,這個虛擬機器以及開發工具(jdk)
定義了一個nio的api,封裝了作業系統的這些網路介面,java是跨平臺的嘛
所以在我們使用java的這些api的過程中,不需要去區分是哪個作業系統
最終暴露給java使用者的,是一個統一的api,這個api就是nio
除了nio以外,還有aio以及bio,bio就是阻塞api,nio和nio2(aio)都是非阻塞api
阻塞非阻塞解釋下去會有很大一段,這個寫不完,有空在說了
那nio封裝了作業系統的網路介面之後呢
還是不太好用,所以有一個叫做trustin lee的韓國人說,既然這麼不好用,我來搞一搞
於是他封裝出了一個高效能的網路庫,這就是netty,netty本質上是在nio之上做了又一層的封裝
因為nio的api用起來不是那麼容易,相比之下netty更簡單點
據說初衷是對於tomcat的api效率不滿意,於是自己搞了一個
然後netty只負責處理網路io部分,後來又有一個人叫做tim fox
他到了red hat之後遇到了trustin lee,於是在trustin的指導下,他跟norman等人
將他在vmware時候製作的node.x(基於node.js原理)結合actor model等製作出了vert.x
這就是vert.x的由來,現在netty主要是在apple工作的norman主要維護
trustin已經不怎麼貢獻了,忙於他們韓國社交公司line的事業中去了
tim也已經從vert.x的位置上退下來,上個月剛進facebook倫敦
所以這三個東西其實是三個不同層次的東西
os(iocp&poll)->nio(jvm)->netty(lib)
後者依賴前者,加上vert.x就是
os(iocp&poll)->nio(jvm)->netty->vert.x
如果考慮netty的native transport的優化的話
os(iocp&poll/epoll&poll/kqueue)->nio(jvm)->netty->vert.x
這個僅僅是網路io,如果是硬碟io的話,vert.x會直接使用aio,而不是nio
網路io主要是netty在負責