V8引擎詳解(八)——消息隊列

前言

本文是V8引擎詳解系列的第八篇,重點內容是關於V8引擎的消息隊列,會經過單線程的特色入手來學習,逐步其消息隊列的運行機制。
文末會有已經完成的系列文章的連接,本系列文章還在不斷更新歡迎持續關注。javascript

單線程

爲何是單線程

因爲javascript最初做爲瀏覽器腳本語言,主要用來與用戶互動、操做dom等,若是有多個線程同時操做一個DOM的狀況,會致使很是難以處理,因此javascript只能設計成單線程。前端

不過現代計算機基本都是多核CPU的,純粹的單線程會致使一些性能得不到釋放,因此新的 HTML5 標準中提出了 web worker概念,容許用戶額外開啓線程,不過 worker 線程是徹底受主線程控制(大部分狀況處理一些計算邏輯),且沒有操做DOM的權限,本質上javascript仍是單線程。java

異步任務

javascript只有一個主線程用來執行任務,可是同一時間只能執行一個任務也就是函數,普通的函數會造成一個任務隊列排隊執行,可是有些任務會很是耗時且不可控(網絡請求、事件監聽)等,若是讓這些任務也和普通任務同樣排隊執行,那麼執行效率低不說還會致使頁面的卡死。
因而就有了異步任務,而 V8 引擎 經過消息隊列事件循環 系統讓異步任務執行且不用排隊等待執行完畢。web

消息隊列

消息隊列是 V8引擎 除了主線程任務外,額外維護的一個隊列,主要存放要執行的任務(函數)。徹底符合隊列 先進先出 的特色,從隊列的頭部取出任務,從隊列的尾部添加任務。面試

瀏覽器自己須要異步的場景很是多,而每一種異步操做的機制也各不相同, 消息隊列能夠和多種異步場景產生交互。ajax

  • 輸入事件相關的異步交互(好比onClick)由引擎的 DOM Binding 模塊處理,相應的事件觸發時,會將對應的回調函數添加到消息隊列中。
  • ajax請求相關的異步交互 由引擎的network模塊處理,在網絡請求完成返回以後,會將對應的回調函數添加到消息隊列中。
  • 定時器相關的異步交互 會引擎的 timer 模塊處理,當時間到達的時候,會將回調函數添加到任務隊列中。(定時器調度策略比較複雜,會有專門的調度策略在合適的時間添加對應的回調任務)

以及一些其餘的模塊會將異步操做放置到消息隊列中,在引擎主線程的任務都執行完成後再執行消息隊列中被推送的任務。
具體以下圖:vim

(圖片來源: 《Help, I'm stuck in an event-loop》

那麼消息隊列會在何時執行呢?
每次執行棧中的代碼就是一個宏任務(task),而消息隊列中的任務會按順序放到下一次的宏任務(task)中,每一個宏任務(task)在執行時,V8 都會從新建立棧,而後隨着宏任務(task)中函數調用,棧也隨之變化,最終,當該宏任務(task)執行結束時,整個棧又會被清空,接着主線程繼續執行下一個宏任務(task)promise

而瀏覽器會在一個 宏任務(task) 執行結束後,在下一個 task 執行開始前,對頁面進行從新渲染如圖:瀏覽器

因爲主線程執行消息隊列中宏任務的時間顆粒度太粗了(主要中間有一次渲染過程),沒法勝任一些對精度和實時性要求較高的場景,因此又引入了promise 機制也就是微任務如圖:緩存

(本篇的重點不在於宏任務和微任務因此簡單帶過,可是我想表達的是,如今前端面試大機率都會問到宏任務和微任務,不少人都只會回答到宏任務和微任務的執行順序,可是若是你回答出中間還有一個頁面渲染的過程,纔算真正瞭解)

事件循環

若是你能理解上文的消息隊列機制,那麼事件循環就很好理解了,本質上就是

  • 主線程運行產生了執行棧,在調用執行棧的過程當中調用了一些異步函數。
  • 當知足異步函數的觸發條件時,會將對應的回調函數推送到消息隊列中。
  • 當主棧中的代碼執行完畢時,會觸發一次頁面渲染,而後建立新的主棧。
  • 將消息隊列中的回調函數推送到主棧。而後順序執行主棧的任務。
  • 反覆循環執行上述過程就是時間循環。

總結

本文主要了解了關於V8引擎的消息隊列的運行機制,也簡單的瞭解了一下爲何js使用單線程機制,以及簡單說了一下宏任務和微任務(網上相關的好文章很是多,因此本文就不重複贅述,只是簡單的點了一下容易被忽略的點)。若是有什麼錯誤,請在評論中和做者一塊兒討論,若是您以爲本文對您有幫助請幫忙點個贊,感激涕零。

參考文章

vimeo.com/96425312 time.geekbang.org/column/arti…

系列文章

V8引擎詳解(一)——概述
V8引擎詳解(二)——AST
V8引擎詳解(三)——從字節碼看V8的演變
V8引擎詳解(四)——字節碼是如何執行的
V8引擎詳解(五)——內聯緩存
V8引擎詳解(六)——內存結構
V8引擎詳解(七)——垃圾回收機制
V8引擎詳解(八)——消息隊列
V8引擎詳解(九)——協程&生成器函數

相關文章
相關標籤/搜索