支撐Java NIO 與 NodeJS的底層技術編程
衆所周知在近幾個版本的Java中增長了一些對Java NIO、NIO2的支持,與此同時NodeJS技術棧中最爲人稱道的優點之一就是其高性能IO,那麼咱們今天要討論的話題就是支撐這些技術的底層技術。框架
開始以前先要提出的一個問題是:異步
爲何NodeJS和Java NIO2沒有在更早的時間出現?async
答案:我的認爲是底層的支撐技術還不成熟。性能
那麼,底層技術指的是什麼呢?對的,我想不少人已經猜到,是操做系統技術。本文提出的兩個概念Java NIO2和NodeJS無一例外都是用戶態技術或者說是應用層技術,而這些應用層技術是運行於OS之上的,與此同時隨着操做系統的進步,能夠支撐的編程模型也更加的豐富。能夠這麼說,這兩項技術徹底是爲了應用操做系統進步帶來的紅利而進化出來的技術。通常來講最早享受這種紅利的技術必定是C\C++,由於OS的進步最新提供的大部分是系統調用,而C\C++是最方便應用這些系統調用的,可是同時也是最複雜的。其餘平臺爲了也得到一樣的性能,就必須不斷的進化,封裝,使用戶能夠用上這些紅利,一旦那個平臺停滯更新,也就是這個平臺沒落的時候了。對用戶來講封裝的越方便,對用戶來講就越是友好,可能使用的人就越多。雖然不少人能夠很快的寫出基於這些平臺的代碼,可是每每不得其精髓,由於本質上仍是不理解這些技術的動機和原理。下面咱們討論的這些技就是這兩項技術相關的底層技術。spa
無論哪種OS設計中,下面5種IO模型都是必不可少的。操作系統
1. blocking I/O
2. nonblocking I/O
3. I/O multiplexing (select, poll and epoll)
4. signal driven I/O (SIGIO)
5. asynchronous I/O (the POSIX aio_ functions)線程
1. blocking I/O設計
如圖所示,這種IO模型的優勢是編程簡單,也是OS最先支持的IO模型之一,缺點是系統調用阻塞用戶動態線程執行,從而形成CPU時間浪費,IO效率低。blog
2. nonblocking I/O
如圖所示,這種IO模型的一個改進是IO是非阻塞了,可是須要長輪詢,一樣浪費CPU時鐘週期。
3. I/O multiplexing (select, poll and epoll)
如圖所示,這種IO模型是當今OS提供的最穩定的IO模型,大部分主流的應用都是基於此種IO模型構建的,好比NodeJS,可是這些平臺每每在這種模型之上增長一層封裝來直接支持AIO。
4. signal driven I/O (SIGIO)
如圖所示,資料記載這種IO模型因爲對比模型3沒有性能優點,同時因爲系統支持不穩定,不多爲設計者採用。
5. asynchronous I/O (the POSIX aio_ functions)
如圖所示,此種IO模型是最完美的AIO,編程模型也最簡單,可是可以完美支持者個模型的OS不多,網上資料顯示Linux正在作這方面的努力,一旦OS在這個方面上取得進展,編程框架,平臺,編程模型可能仍是須要有很大程度的簡化。
雖然這種模型不多有OS的支持,可是並非說如今就沒有這種AIO模型,不少框架作了這方面的工做,在用戶態模擬了AIO,使用戶能夠更多的關注業務邏輯代碼。
6. 同步異步,阻塞和非阻塞
同步和異步是針對應用程序和內核的交互而言的。一直等到數據讀完再返回的是同步,直接返回的是異步。阻塞和非阻塞是對進程、線程而言的,阻塞方式下讀取或者寫入線程一直等待,而非阻塞方式下,讀取或者寫入線程當即返回一個狀態值。