瀏覽器的多進程


https://www.cnblogs.com/cangqinglang/p/8963557.html

 

瀏覽器中打開一個網頁相當於新起了一個進程(進程內都有自己的線程),當然,瀏覽器出於自己的優化,有時會將多個進程合並成同一個進程(比如打開多個空白頁)

瀏覽器多進程的優勢:

 

1.避免單個page crash影響整個瀏覽器

2.避免第三方插件crash影響整個瀏覽器

3.多進程充分利用多核優勢

4.方便使用沙盒模型隔離插件等進程,提高瀏覽器穩定性

 

瀏覽器的渲染進程是多線程的:頁面的渲染,JS的執行,事件的循環,都在這個進程內進行。

多線程有哪些:

1.GUI渲染線程

  • 負責渲染瀏覽器界面,解析HTML,CSS,構建DOM樹和RenderObject樹,布局和繪制等。
  • 當界面需要重繪(Repaint)或由於某種操作引發回流(reflow)時,該線程就會執行
  • 注意,GUI渲染線程與JS引擎線程是互斥的,當JS引擎執行時GUI線程會被掛起(相當於被凍結了),GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執行

 

2.JS引擎線程

  • 也稱為JS內核,負責處理Javascript腳本程序。(例如V8引擎)
  • JS引擎線程負責解析Javascript腳本,運行代碼。
  • JS引擎一直等待着任務隊列中任務的到來,然后加以處理,一個Tab頁(renderer進程)中無論什么時候都只有一個JS線程在運行JS程序
  • 同樣注意,GUI渲染線程與JS引擎線程是互斥的,所以如果JS執行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染加載阻塞。

 

3.事件觸發線程

  • 歸屬於瀏覽器而不是JS引擎,用來控制事件循環(可以理解,JS引擎自己都忙不過來,需要瀏覽器另開線程協助)
  • JS引擎執行代碼塊如setTimeOut時(也可來自瀏覽器內核的其他線程,如鼠標點擊、AJAX異步請求等),會將對應任務添加到事件線程中
  • 當對應的事件符合觸發條件被觸發時,該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理
  • 注意,由於JS的單線程關系,所以這些待處理隊列中的事件都得排隊等待JS引擎處理(當JS引擎空閑時才會去執行)

 

4.定時觸發線程

  • 傳說中的setInterval與setTimeout所在線程
  • 瀏覽器定時計數器並不是由JavaScript引擎計數的,(因為JavaScript引擎是單線程的, 如果處於阻塞線程狀態就會影響記計時的准確)
  • 因此通過單獨線程來計時並觸發定時(計時完畢后,添加到事件隊列中,等待JS引擎空閑后執行)
  • 注意,W3C在HTML標准中規定,規定要求setTimeout中低於4ms的時間間隔算為4ms。

 

5.異步http請求線程

  • XMLHttpRequest在連接后是通過瀏覽器新開一個線程請求
  • 將檢測到狀態變更時,如果設置有回調函數,異步線程就產生狀態變更事件,將這個回調再放入事件隊列中。再由JavaScript引擎執行。

 

HTML5 里面引入web worker,因為js是單線程處理

這樣理解下:

  • 創建Worker時,JS引擎向瀏覽器申請開一個子線程(子線程是瀏覽器開的,完全受主線程控制,而且不能操作DOM)
  • JS引擎線程與worker線程間通過特定的方式通信(postMessage API,需要通過序列化對象來與線程交互特定的數據)

所以,如果有非常耗時的工作,請單獨開一個Worker線程,這樣里面不管如何翻天覆地都不會影響JS引擎主線程,
只待計算出結果后,將結果通信給主線程即可,perfect!

而且注意下,JS引擎是單線程的,這一點的本質仍然未改變,Worker可以理解是瀏覽器給JS引擎開的外掛,專門用來解決那些大量計算問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM