1. 程式人生 > >BIO、NIO、AIO及java中NIO 與netty的 IOCP區別聯絡

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在負責