Nodejs從小工到專家系列(一)

前言

從小工到專家系列爲從頭開始學習Nodejs,但它並非教程,我會整理一些應該特別注意或深刻理解的知識點,固然也會涉及經常使用的庫,好比Express,mongoose,bluebird..網絡

Nodejs特色:

單線程

優勢:架構

  • 沒有死鎖存在併發

  • 沒有線程上下文交換所產生的性能開銷異步

缺點:mongoose

  • 沒法利用多核函數

  • 錯誤會引發整個應用退出,健壯性不高性能

  • 大量計算佔用CPU致使沒法繼續調用異步I/O學習

解決方案:操作系統

  • 引入child_process,大量計算時能夠將計算分發到子進程,緩解壓力線程

  • 進程之間經過事件消息傳遞結果

跨平臺

兼容Windows和*nix.在操做系統與Node上層模塊之間構建一層平臺層架構,即libuv

效率高

  • V8引擎

V8是谷歌開發的,目前公認最快的 Javascript 解析引擎,libuv 是一個開源的、爲 Node 定製而生的跨平臺的異步 IO 庫。

高性能

採用事件循環,而不是爲每一個鏈接分配一個線程

應用場景

  • 對實時和併發有很高要求的,好比遊戲,聊天等等

非阻塞I/O

操做系統內核對於I/O只有兩種方式:阻塞與非阻塞.在調用阻塞IO時,應用程序須要等待I/O完成才能返回結果.

阻塞I/O形成CPU等待I/O,浪費等待時間,CPU的處理能力不能獲得充分利用.爲了提升性能,內核提供了非阻塞I/O.非阻塞I/O會在調用後當即返回.

上面的當即如何理解呢?

由於阻塞I/O完成了整個獲取數據的過程,而非阻塞I/O則不帶數據直接返回,要獲取數據,還須要經過文件描述符再次讀取.

  • 文件描述符相似於應用程序與系統內核之間的憑證.若是應用程序須要進行I/O調用,須要先打開文件描述符,而後在根據文件描述符去實現數據的讀寫

但非阻塞I/O存在些問題,它當即返回的並非業務層指望的數據,而僅僅是當前調用的狀態.爲了獲取完整的數據,應用程序須要重複調用I/O操做來確認是否完成.這種重複調用判斷操做是否完成的技術叫作輪詢

異步I/O

事件循環

在進程啓動時,Node會建立一個相似與while(true)的循環,它的做用就是產看是否有事件待處理,若是有就取出並處理,直到沒有就退出進程.

觀察者

如何知道是否有事件待處理呢,就引入了觀察者.再Node中觀察者包括文件I/O觀察者和網絡觀察者等.至關於一個探哨的.

請求對象

當咱們要從本身寫的js到系統進行調用,會經歷一個過程js->Node核心模塊->C++內建模塊->libuv->系統,那麼傳遞參數信息就會利用一個請求對象,包括回調函數也在裏面.

請求對象是很是重要的中間產物,全部的狀態都保存再這個對象中,包括送入線程池等待執行及I/O操做完畢後的回調處理.

執行回調

組裝好請求對象,送入I/O線程池等待執行,實際上完成了異步I/O的第一部分,回調通知是第二部分.I/O觀察者回調函數的行爲就是取出處理後返回的結果,以此達到調用JavaScript中傳入的回調函數的目的.

相關文章
相關標籤/搜索