關於node.js的一些簡單理解

1、Node.js的總體感知

Node.js是JavaScript的一個服務端運行環境。使得JS能夠像PHP、Python等語言同樣能夠進行服務端程序開發。
傳統JS中的DOM和BOM被剔除,首先它遵循EMCAScript標準實現核心JavaScript,在此基礎上,又實現了諸如模塊、包、文件系統、網絡通訊和操做系統API等新的功能。node

圖片描述

Node內部採用Google Chrome的V8引擎,做爲JavaScript語言的解釋器,在該引擎當中執行ES代碼,另外Node平臺還提供了一些組件,經過自行開發的Libuv庫,用於調度操做系統資源。服務器

2、Node.js在Web當中的做用

一、 作動態網站

圖片描述

二、分發數據請求,渲染HTML頁面

圖片描述

3、Node.js的核心特性(事件驅動和非阻塞)

首先先了解一下進程和線程的概念。
進程:操做系統爲應用程序分配資源的一個單位。用來給應用程序提供一個運行環境。
線程:用來執行應用程序中的代碼,一個進程內部,能夠有不少線程。但在一個線程內部,同時只能作一件事。
某個應用程序啓動以後會默認建立一個主線程,用於執行咱們的代碼。但用戶的代碼當中一般會有一下耗費時間的阻塞代碼,對於Java、.Net、PHP這種一個進程當中能夠有多個線程的應用程序,在執行代碼的過程中,會開闢多個線程去分別執行那些主線程當中會發生阻塞的代碼。網絡

多線程存在的問題:多線程

  1. 建立線程耗費資源
  2. 線程數量有限
  3. 線程之間共享某些數據,同步某個狀態都很麻煩
  4. CPU在不一樣線程之間轉換很是耗時

但對於Node來講,因爲Node採用Chrome V8引擎處理JavaScript腳本,而V8最大的特色是單線程運行。即Node內部只容許有一個線程,故爲了提升代碼的執行效率,避免代碼阻塞的狀況的出現。Node當中採用大量的異步操做。即Node當中全部會發生代碼阻塞的操做都是異步的。併發

3.一、Node當中的事件驅動模型

圖片描述

在Node的內部有一個事件隊列,事件隊列由一對一對的鍵值對構成,即事件:對應的回調函數的形式。Node的主線程在執行用戶的代碼的過程當中,先執行那些非阻塞的代碼,當執行到相似於文件操做或網絡操做之類的阻塞代碼,則會根據其任務代碼出現的順序,將其放入事件隊列當中,與該任務相關的代碼放在該任務的回調函數當中。異步

即Node主線程在執行程序的過程,會直接執行那些非阻塞的代碼,但若是在執行的過程當中,遇到阻塞型的代碼,主線程的處理僅僅爲將該事件函數及其對應的回調函數放進事件隊列當中,暫不執行。等主線程把程序當中那些非阻塞的代碼所有執行完了以後,再按照從上到下的順序,從事件隊列當中來取事件任務來執行。函數

當Node執行事件隊列當中的任務時,先執行阻塞事件,而後再開始執行該事件對應的回調函數,在執行其回調的函數的過程中,一樣也是先執行那些非阻塞的代碼,對於遇到回調函數當中的阻塞事件時,一樣暫不執行,將該事件及其對應的回調函數,插入事件隊列的尾部。oop

3.二、Node內部的線程池模型

圖片描述

Node內部有一個事件循環(Event Loop)來依次從事件隊列(Event Queue)當中取事件來執行,對於事件隊列的一個鍵值對來講,從開始執行該阻塞事件,到開始執行該事件對應的回調函數的過程中,可能會設計文件或網絡操做,可能會阻塞很長時間,但實際上代碼不會卡死在這裏。由於這裏的阻塞操做不是由node主線程來作的,而是交給另外一個線程來完成的。
在node底層維護了一個線程池,該線程池內部又維護了不少的線程,當Event Loop在依次執行事件隊列當中的事件時,若遇到阻塞操做,就交給線程池當中的線程來作,這對於主線程沒有任何影響,主線程仍然繼續沿着Event Loop往下走,接着去處理事件隊列當中的下一個事件。性能

不必定是等事件隊列當中的上一個事件的回調函數執行完成以後,纔開始執行下一個事件。網站

當線程池當中的線程執行完了交給它的任務以後,它會通知正處於Event Loop當中的主線程,讓其來執行對應的回調函數。而後該線程得以釋放,返回到線程池當中。

在Node內部其實是多線程的,對於相似於文件操做之類的阻塞操做,讓另外一個線程去耗費這個時間,而主線程在一直不停的工做。通常咱們說node是單線程的,是由於對於外界變成的API來講,全部的任務都是由一個線程來完成,只有內部的一些阻塞操做才交給內部的線程池來完成。

Node將全部的阻塞操做交給內部實現的線程池,而Node主線程自己則負責不停的往返調度。非阻塞最大的性能優點就是,能充分利用單核CPU的優點,若是讓單核CPU不斷地在多個線程之間切換,會形成很大的性能損耗。Node採用基於事件驅動的異步I/O模型,極大地提升了HTTP服務器的併發性能。

相關文章
相關標籤/搜索