java nio node_支撐Java NIO 與 NodeJS的底層技術

支撐Java NIO 與 NodeJS的底層技術

眾所周知在近幾個版本的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)

1. blocking I/O

如圖所示,這種IO模型的優點是編程簡單,也是OS最早支持的IO模型之一,缺點是系統調用阻塞用戶動態線程執行,從而造成CPU時間浪費,IO效率低。

1771164db64901c67a174d3fda13a5a8.png

2. nonblocking I/O

如圖所示,這種IO模型的一個改進是IO是非阻塞了,但是需要長輪詢,同樣浪費CPU時鍾周期。

ee2cf04e731ff0611981249c92d3c8d8.png

3. I/O multiplexing (select, poll and epoll)

如圖所示,這種IO模型是當今OS提供的最穩定的IO模型,大部分主流的應用都是基於此種IO模型構建的,比如NodeJS,但是這些平台往往在這種模型之上增加一層封裝來直接支持AIO。

35405b1700a99e8a35a403b85feb8d14.png

4. signal driven I/O (SIGIO)

如圖所示,資料記載這種IO模型由於對比模型3沒有性能優勢,同時由於系統支持不穩定,很少為設計者采用。

a5535d69f392f31e77ef97347bc5a302.png

5. asynchronous I/O (the POSIX aio_ functions)

如圖所示,此種IO模型是最完美的AIO,編程模型也最簡單,但是能夠完美支持者個模型的OS很少,網上資料顯示Linux正在做這方面的努力,一旦OS在這個方面上取得進展,編程框架,平台,編程模型可能還是需要有很大程度的簡化。

雖然這種模型很少有OS的支持,但是並不是說現在就沒有這種AIO模型,很多框架做了這方面的工作,在用戶態模擬了AIO,使用戶可以更多的關注業務邏輯代碼。

a61856b84b7f4fd6899cb30eb458eaa3.png

6. 同步異步,阻塞和非阻塞

同步和異步是針對應用程序和內核的交互而言的。一直等到數據讀完再返回的是同步,直接返回的是異步。阻塞和非阻塞是對進程、線程而言的,阻塞方式下讀取或者寫入線程一直等待,而非阻塞方式下,讀取或者寫入線程立即返回一個狀態值。

bb54d361c8e4fd5588280126c591d9c6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值