瀏覽器渲染程式多執行緒

熱情的劉大爺發表於2018-11-16

之前有關瀏覽器渲染程式和執行緒這一塊,糾結了很久,因為我完全搞不懂什麼是執行緒和程式,如果你和我一樣,也是之前沒有了解過,或者不是很清楚什麼是執行緒,什麼是程式,建議先看瀏覽器多程式架構,搞清楚了執行緒和程式後,看這篇文章可能會事半功倍。

GUI渲染執行緒

負責渲染瀏覽器介面,解析HTML、CSS、構建DOM樹和RenderObject樹,佈局和繪製等

當介面需要重繪(Repaint)或由於某種操作導致重排(Reflow)時,該執行緒就會執行

GUI渲染執行緒和JS引擎執行緒是互斥的,當js引擎執行時GUI執行緒會被掛起(相當於凍結),GUI更新會被儲存在一個佇列中等到js引擎空閒時立即執行

JS引擎執行緒

也稱之為js核心,負責處理javascript指令碼程式(V8引擎)

JS引擎執行緒負責解析javascript指令碼,執行程式碼

JS引擎一直在等待著任務的到來,然後加以處理,一個renderer程式中無論如何都只有一個js執行緒在執行js程式

由於GUI渲染執行緒和JS引擎執行緒是互斥的,所以如果JS執行時間如果過長,這樣就會造成頁面渲染不連貫,導致頁面渲染載入阻塞

事件觸發執行緒

歸屬於瀏覽器而不是js引擎,用來控制事件迴圈

當js引擎執行程式碼,如setTimeout時(也可以是來自瀏覽器核心的其他執行緒,如滑鼠點選,ajax請求等),會將對應的任務新增到事件執行緒當中

當對應的事件符合觸發條件被觸發時,事件執行緒會把事件新增到待處理事件佇列的隊尾,等待js引擎的處理

由於js的單執行緒關係,所以這些待處理佇列中的事件都得排隊等待js引擎處理(當js引擎空閒時才會去執行)

定時器觸發器執行緒

setInterval和setTimeout所在的執行緒

瀏覽器定時計數器並不是由js引擎計數的(因為js是單執行緒的,如果處於阻塞狀態就會影響計數的準確性)

單獨的執行緒來計時並觸發定時(計時完畢後,新增到事件佇列中,等待js引擎空閒後執行)

W3C在HTML標準中規定,規定要求setTimeout中低於4ms的時間間隔算為4ms

非同步http請求執行緒

在XMLHttpRequest在連線後通過瀏覽器開一個執行緒請求

將檢測到狀態變更時,如果有設定有回撥函式,非同步執行緒就產生狀態變更事件,將這個回撥再放入事件佇列中,再有js引擎執行

這裡說的是主流的瀏覽器渲染程式的主要幾個執行緒,但不囊括所有,如果遇到相應的問題,歡迎評論。

相關文章