<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    不急不徐,持之以恒。

    http://blog.gopersist.com/

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      24 隨筆 :: 0 文章 :: 52 評(píng)論 :: 0 Trackbacks

    Linux操作系統(tǒng)的I/O模型

    JAVA的NIO引入了異步I/O,而Node.js宣稱的就是異步編程,I/O自然是異步的。其實(shí)操作系統(tǒng)在很早就引入了異步I/O的概念,如下圖(摘自Unix網(wǎng)絡(luò)編程中的圖片):

    我對(duì)上圖的理解有幾點(diǎn):

    1. 從IO設(shè)備讀取數(shù)據(jù)到用戶內(nèi)存的整個(gè)過程都是由系統(tǒng)內(nèi)核來完成;
    2. 數(shù)據(jù)總是先被拷貝到內(nèi)核緩沖區(qū),再由內(nèi)核緩沖區(qū)拷貝到用戶內(nèi)存;
    3. 除了異步I/O,其余4種I/O模型其實(shí)都是阻塞的,至少在數(shù)據(jù)從內(nèi)核拷貝到用戶內(nèi)存時(shí)是阻塞的;
    4. 雖然異步I/O看上去是理想解決方案,但實(shí)現(xiàn)上現(xiàn)在用得最多的應(yīng)該是多路I/O復(fù)用,有select、poll、epoll的實(shí)現(xiàn),性能最好的是epoll;
    5. 異步I/O現(xiàn)在被認(rèn)為有缺陷,僅支持O_DIRECT而無法支持系統(tǒng)緩存。

    Node.js中的異步I/O

    因?yàn)閮?nèi)核中的異步I/O有缺陷,現(xiàn)實(shí)中的異步I/O通常由用戶態(tài)的線程池模擬完成,如下圖:

    Node.js中原本使用了libeio異步I/O庫,在v0.9.3后改為自己實(shí)現(xiàn)的線程池來完成異步I/O。所以在Node.js中,除了用戶的Javascript代碼是單線程外,所有I/O都是多線程并行執(zhí)行的。

    Node.js中的異步I/O調(diào)用

    Node.js通過事件循環(huán)的模式運(yùn)行,在每一個(gè)循環(huán)的過程中,通過詢問一個(gè)或多個(gè)觀察者來判斷是否有事件要處理,而觀察者可以有文件I/O觀察者、網(wǎng)絡(luò)I/O觀察者等。

    Node.js中異步I/O調(diào)用的大致流程如下:

    • 發(fā)起I/O調(diào)用
      1. 用戶通過Javascript代碼調(diào)用Node核心模塊,將參數(shù)和回調(diào)函數(shù)傳入到核心模塊;
      2. Node核心模塊會(huì)將傳入的參數(shù)和回調(diào)函數(shù)封裝成一個(gè)請(qǐng)求對(duì)象;
      3. 將這個(gè)請(qǐng)求對(duì)象推入到I/O線程池等待執(zhí)行;
      4. Javascript發(fā)起的異步調(diào)用結(jié)束,Javascript線程繼續(xù)執(zhí)行后續(xù)操作。
    • 執(zhí)行回調(diào)
      1. I/O操作完成后,會(huì)將結(jié)果儲(chǔ)存到請(qǐng)求對(duì)象的result屬性上,并發(fā)出操作完成的通知;
      2. 每次事件循環(huán)時(shí)會(huì)檢查是否有完成的I/O操作,如果有就將請(qǐng)求對(duì)象加入到I/O觀察者隊(duì)列中,之后當(dāng)做事件處理;

    • 處理I/O觀察者事件時(shí),會(huì)取出之前封裝在請(qǐng)求對(duì)象中的回調(diào)函數(shù),執(zhí)行這個(gè)回調(diào)函數(shù),并將result當(dāng)參數(shù),以完成Javascript回調(diào)的目的。

      微信訂閱號(hào):
      源文地址:
      http://blog.gopersist.com/2015/03/09/aio/
    posted on 2015-04-13 21:42 老林 閱讀(3985) 評(píng)論(0)  編輯  收藏 所屬分類: LinuxNode.js

    只有注冊用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品无码亚洲精品2021| 日本一区二区在线免费观看| 国产免费av一区二区三区| 日韩在线观看免费| 9i9精品国产免费久久| 亚洲天堂男人天堂| 日韩精品免费电影| 91嫩草私人成人亚洲影院| 好男人视频社区精品免费| 久久av免费天堂小草播放| 久久久久se色偷偷亚洲精品av| 免费一区二区三区| 国产自偷亚洲精品页65页| 亚洲精品GV天堂无码男同| 成年女性特黄午夜视频免费看| 亚洲粉嫩美白在线| 亚洲色成人WWW永久网站| 两个人看的www免费高清 | 国产亚洲精品不卡在线| 黄色网址在线免费观看| 亚洲酒色1314狠狠做| 亚洲爽爽一区二区三区| 美女无遮挡拍拍拍免费视频| 亚洲卡一卡二卡乱码新区| 亚洲精品制服丝袜四区| 国产一区二区三区免费观看在线| 亚洲国产V高清在线观看| 57pao一国产成永久免费| 伊人久久国产免费观看视频| 亚洲资源最新版在线观看| 久久香蕉国产线看观看亚洲片| 91在线视频免费观看| 国产精品亚洲av色欲三区| 亚洲图片中文字幕| 国产小视频在线观看免费| 午夜免费国产体验区免费的| 亚洲精品美女网站| 亚洲精品无码久久毛片波多野吉衣 | 亚洲AV日韩AV永久无码绿巨人| 黄色网址大全免费| 国产成人精品日本亚洲网址|