- 《深淺》第3章 異步I/O - node.js是如何實現異步i/o的
- Udemy 《Learn and Understand NodeJS Learn and Understand NodeJS》 Section 2&3
V8引擎
首先,學習node.js必定要了解V8引擎,他是一個能夠把js直接編譯成(處理器能夠識別的)機器碼的東西。javascript
再詳細點,V8是一個
- 開源的
- 用C++寫的
- 根據ECMA標準實現JavaScript
- 能夠把JavaScript編譯成處理器能夠識別的機器碼
- 能夠獨立運行
- 也能夠嵌入其餘C++應用
的JavaScript引擎。
Node.js與V8引擎
普通青年使用V8:運行V8, JavaScript -> V8 —compile—> Machine Code
文藝青年則有這樣一個大膽的想法:
那些普通的js方法太沒意思了,能力優先。若是我能夠寫一些C++代碼,當作Add-on加到V8上,這樣V8就有能力識別具備更多的Javascript命令了,就更強大了。好比說file相關的東西,原本js不能作,如今我用c++在底部實現好,而後告訴V8,當用戶在js中寫道file.open(xxx)的時候,就來用c++執行file open的功能,這樣你的js(二b)就是有處理文件能力的js(牛b)了。
文藝青年的想法其實就是咱們的Node.js:一個把V8引擎嵌進去的C++應用,這個C++應用實現了超級多的customized新功能,這些功能使得這個應用(Node.js)很是的適合服務器開發。
服務器開發都須要什麼新功能呢 === Node.js實現的新功能都包括哪些方面呢:
- 管理可複用代碼
- 處理文件
- 處理數據庫
- 互聯網通訊
- 接受request,發送respond
- 處理須要必定時間才能完成的工做
Node.js架構
- 第一層是C++ core,就是那些新加的customized功能 (其餘講解中,還會提到好比event loop,libuv等,這些以後說)。
- 第二層是JS core,這一層用js實現,基於/調用C++ core,讓用戶能夠更好的使用那些C++功能,同時也實現了許多經常使用的功能。
在node.js源碼中,C++ core是在src文件夾內。JS core是在lib文件夾內。因而可知兩者的層級關係。
Node.js 異步I/O
Node.js如何實現異步 I/O, 從JS到OS到底發生了哪些步驟(這個是udemy+《深淺》的合體版總結)java
- 你寫的js代碼調用了node.js的JS core (好比 fs相關功能:github.com/nodejs/node…),而且你設定了一個回調函數
- JS core部分調用了C++ core (fs.js 調用的其中一個.cc: github.com/nodejs/node…)
- C++ core調用libuv
- C++ core調用libuv的方法來封裝請求對象(異步I/O過程當中重要的中間產物,中間指的是從js到os之間),其中包含了異步I/O中最重要的東西之一:回調函數。
- libuv把封裝好的請求對象發到OS
- 發到OS中的線程池(thread pool)等待被執行
- 線程池中某一線程將發來的請求對象中包含的I/O操做進行執行,結果存在該請求對象的req->result屬性中。而後提交完成狀態,也就是相似通知說"我完成了!」,以後把線程歸還給線程池
- 處於完成狀態的請求對象,被觀察者(圖中的兩個小人兒,不一樣類型的事件有不一樣的觀察者)在事件循環(Event Loop:大while循環,每一個循環叫一個tick)中提出來(經過libuv中方法來檢查是否有執行完的請求),而後放到隊列(Completed Events Queue)中
- 事件循環從觀察者的隊列中取出處於完成狀態請求對象
- 取出其中包含的I/O操做執行結果以及回調函數,發到V8中執行。到這就達到了調用#1中設定的回調函數的目的。
注:
b. #1-#9 與 #10 是同時在工做的,I/O事件一個一個執行,而後最後發送到V8引擎中一個一個(由於JS是同步的)的執行回調函數
c. 因爲b,整個Node.js有了異步I/O的能力
d. 事件驅動(event driven)、非阻塞(non-blocking)I/O的特色也就能夠解釋了。事件驅動就是指的#7-#10,事件被完成觸發了以後各個步驟,直到最後執行回調函數。非阻塞I/O就是整個#1-#10這個過程,咱們在V8中執行的JavaScript代碼並不會由於事件的執行而中止,#1-#9和#10同時工做,一個執行I/O事件,一個獲得通知執行回調函數。
e. 從d的解釋中,能夠更好的理解上一篇文章中最後那段說Node.js是單線程/多線程。
下次寫事件(Event)和事件發射器(Event Emitter)相關的東西。歡迎你們交流,指正~