眾所周知在近幾個版本的Java中增加了一些對Java NIO、NIO2的支持,同時NodeJS技術棧中最為人稱道的優勢之一就是其高性能IO,那麼我們今天要討論的議題就是支撐這些技術的底層技術。
開始之前先要提出的一個問題是:
為什麼NodeJS和Java NIO2沒有在更早的時間出現?
答案:個人認為是底層的支撐技術還不成熟。
那麼,底層技術指的是什麼呢?對的,我想很多人已經猜到,是作業系統技術。本文提出的兩個概念Java NIO2和NodeJS無一例外都是用戶態技術或者說是應用層技術,而這些應用層技術是運行於OS之上的,同時隨著作業系統的進步,可以支撐的程式模型也更加的豐富。可以這麼說,這兩項技術完全是為了應用作業系統進步帶來的紅利而進化出來的技術。一般來說最先享受這種紅利的技術一定是C\C++,因為OS的進步最新提供的大部分是系統調用,而C\C++是最方便應用這些系統調用的,但同時也是最複雜的。其他平台為了也獲得同樣的效能,就必須不斷的進化,封裝,使用戶可以用上這些紅利,一旦那個平台停滯更新,也就是這個平台沒落的時候了。對使用者來說封裝的越方便,對使用者來說就越友好,可能使用的人就越多。雖然很多人可以很快的寫出基於這些平台的程式碼,但往往不得其精髓,因為本質上還是不理解這些技術的動機和原理。下面我們討論的這些技就是這兩項技術相關的底層技術。
不管哪一種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)
#如圖所示,這種IO模型的優點是程式設計簡單,也是OS最早支持的IO模型之一,缺點是系統呼叫阻塞使用者動態執行緒執行,造成CPU時間浪費,IO效率低。
#如圖所示,這種IO模型的一個改進是IO是非阻塞了,但是需要長輪詢,同樣浪費CPU時鐘週期。
如圖所示,這種IO模型是當今OS提供的最穩定的IO模型,大部分主流的應用都是基於此種IO模型建構的,例如NodeJS,但是這些平台往往在這種模型之上增加一層封裝來直接支援AIO。
如圖所示,資料記載這種IO模型由於對比模型3沒有效能優勢,同時由於系統支援不穩定,很少被設計者採用。
如圖所示,此種IO模型是最完美的AIO,程式設計模型也最簡單,但是能夠完美支持者個模型的OS很少,網上資料顯示Linux正在做這方面的努力,一旦OS在這個方面上取得進展,編程框架 ,平台,程式設計模型可能還是需要有很大程度的簡化。
雖然這種模型很少有OS的支持,但並不是說現在就沒有這種AIO模型,很多框架做了這方面的工作,在用戶態模擬了AIO,使用戶可以更多的關注業務邏輯程式碼。
#同步和非同步是針對應用程式和核心的互動而言的。一直等到資料讀完後再回傳的是同步,直接回傳的是非同步。阻塞和非阻塞是對行程、執行緒而言的,阻塞方式下讀取或寫入執行緒一直等待,而非阻塞方式下,讀取或寫入執行緒立即傳回一個狀態值。
#以上是支撐Java的NIO與NodeJS的底層技術圖文解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!