瀏覽器渲染進程多線程

以前有關瀏覽器渲染進程和線程這一塊,糾結了好久,由於我徹底搞不懂什麼是線程和進程,若是你和我同樣,也是以前沒有了解過,或者不是很清楚什麼是線程,什麼是進程,建議先看瀏覽器多進程架構,搞清楚了線程和進程後,看這篇文章可能會事半功倍。javascript

GUI渲染線程java

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

當界面須要重繪(Repaint)或因爲某種操做致使重排(Reflow)時,該線程就會執行瀏覽器

GUI渲染線程和JS引擎線程是互斥的,當js引擎執行時GUI線程會被掛起(至關於凍結),GUI更新會被保存在一個隊列中等到js引擎空閒時當即執行架構

JS引擎線程異步

也稱之爲js內核,負責處理javascript腳本程序(V8引擎)函數

JS引擎線程負責解析javascript腳本,運行代碼佈局

JS引擎一直在等待着任務的到來,而後加以處理,一個renderer進程中不管如何都只有一個js線程在運行js程序post

因爲GUI渲染線程和JS引擎線程是互斥的,因此若是JS執行時間若是過長,這樣就會形成頁面渲染不連貫,致使頁面渲染加載阻塞線程

事件觸發線程

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

當js引擎執行代碼,如setTimeout時(也能夠是來自瀏覽器內核的其餘線程,如鼠標點擊,ajax請求等),會將對應的任務添加到事件線程當中

當對應的事件符合觸發條件被觸發時,事件線程會把事件添加到待處理事件隊列的隊尾,等待js引擎的處理

因爲js的單線程關係,因此這些待處理隊列中的事件都得排隊等待js引擎處理(當js引擎空閒時纔會去執行)

定時器觸發器線程

setInterval和setTimeout所在的線程

瀏覽器定時計數器並非由js引擎計數的(由於js是單線程的,若是處於阻塞狀態就會影響計數的準確性)

單獨的線程來計時並觸發定時(計時完畢後,添加到事件隊列中,等待js引擎空閒後執行)

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

異步http請求線程

在XMLHttpRequest在鏈接後經過瀏覽器開一個線程請求

將檢測到狀態變動時,若是有設置有回調函數,異步線程就產生狀態變動事件,將這個回調再放入事件隊列中,再有js引擎執行

這裏說的是主流的瀏覽器渲染進程的主要幾個線程,但不囊括全部,若是遇到相應的問題,歡迎評論。

相關文章
相關標籤/搜索