不急不徐,持之以恒。

          http://blog.gopersist.com/

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            24 隨筆 :: 0 文章 :: 52 評論 :: 0 Trackbacks

          Linux操作系統的I/O模型

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

          我對上圖的理解有幾點:

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

          Node.js中的異步I/O

          因為內核中的異步I/O有缺陷,現實中的異步I/O通常由用戶態的線程池模擬完成,如下圖:

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

          Node.js中的異步I/O調用

          Node.js通過事件循環的模式運行,在每一個循環的過程中,通過詢問一個或多個觀察者來判斷是否有事件要處理,而觀察者可以有文件I/O觀察者、網絡I/O觀察者等。

          Node.js中異步I/O調用的大致流程如下:

          • 發起I/O調用
            1. 用戶通過Javascript代碼調用Node核心模塊,將參數和回調函數傳入到核心模塊;
            2. Node核心模塊會將傳入的參數和回調函數封裝成一個請求對象;
            3. 將這個請求對象推入到I/O線程池等待執行;
            4. Javascript發起的異步調用結束,Javascript線程繼續執行后續操作。
          • 執行回調
            1. I/O操作完成后,會將結果儲存到請求對象的result屬性上,并發出操作完成的通知;
            2. 每次事件循環時會檢查是否有完成的I/O操作,如果有就將請求對象加入到I/O觀察者隊列中,之后當做事件處理;

          • 處理I/O觀察者事件時,會取出之前封裝在請求對象中的回調函數,執行這個回調函數,并將result當參數,以完成Javascript回調的目的。

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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 静乐县| 湘乡市| 高尔夫| 九台市| 日喀则市| 普定县| 大厂| 清原| 伊宁市| 千阳县| 成武县| 洞头县| 民勤县| 泉州市| 图们市| 柯坪县| 屏南县| 长武县| 长岭县| 囊谦县| 扎兰屯市| 和田县| 灯塔市| 桐庐县| 建始县| 仁化县| 乌什县| 游戏| 柳河县| 蛟河市| 余干县| 招远市| 临澧县| 通州区| 涞水县| 双峰县| 台前县| 武夷山市| 东海县| 永修县| 台中县|