深刻了解現代瀏覽器之一 - 架構

在 Chorme Developer 上無心之中翻到了這個系列,做者描寫的很清楚,而且配圖十分的優秀,推薦閱讀(閱讀的時候須要注意這篇博客發佈的時候是 2018 年 9 月,有些東西可能對於如今來講有一些過期了)。這是這個系列博客的第一部分,主要是研究瀏覽器架構。CPU 和 GPU 在這裏就不談了,你能夠去 原文查看。

在進程和線程上執行程序

進程是邊框,線程做爲抽象魚在進程內部活動

在深刻瀏覽器以前,咱們須要掌握進程和線程的概念。一個進程能夠當作一個應用的執行程序,而線程是存在於進程內部來執行任意部分程序的。web

啓動應用時,將會建立一個進程。這個進程會建立一個或多個線程來幫助它進行工做,但這不是必須的。操做系統爲進程提供了一個內存塊,全部進程的狀態都保存在這個專用的內存空間中,當你關閉應用的時候,進程也會隨之消失,操做系統就會釋放內存。瀏覽器

一個進程可讓操做系統啓動另外一個進程來運行其餘任務。這樣操做系統會爲新的進程分配新的內存。若是這兩個進程須要對話,則能夠用 IPC (進程間通訊)來實現。許多程序被設計成多進程就是由於若是其中一個進程未響應的時候,它能夠進行重啓而不會影響到應用的其餘進程。安全

瀏覽器架構

瞭解了上面的知識,那咱們如何使用進程和線程來構建瀏覽器應用呢?它能夠是一個具備多線程的進程的架構,也能夠是多個進程經過 IPC 進行通訊的架構。網絡

不一樣的架構

須要注意的是不一樣的架構屬於實現細節,關於瀏覽器的構建並無一個標準,兩個瀏覽器可能使用的架構方式可能會不同。多線程

這個系列裏,會使用以下圖的 Chrome 最新架構方式。架構

Chrome 的多進程架構圖,渲染進程下的多個進程時表示 Chrome 爲每一個選項卡都建立了渲染進程

最上面是瀏覽器進程,負責協調調度其餘進程。對於渲染進程,會建立多個進程來分配給每個標籤頁。直到最近,Chrome 才儘量的爲每一個標籤頁分配一個進程。如今,Chrome 嘗試給每一個站點分配本身的進程,包括 iframe 的。ide

每一個進程控制什麼?

下面介紹了每一個進程以及它控制的地方:工具

進程 負責
Browser 負責處理屬於 Chrome 的部分,好比地址欄、書籤、前進後退按鈕等等,以及一些看不見的須要權限的部分,好比網絡請求、文件訪問
Renderer 負責處理標籤頁內的顯示工做
Plugin 負責處理網站用到的全部插件,好比 Flash
GPU 被分離出來獨立處理 GPU 任務,因爲 GPU 會處理來自不一樣應用的請求,繪製到同一個地方,因此將它單獨拆出來

不一樣的進程負責不一樣的地方

除了這些,還有其餘進程,好比擴展進程、實用程序進程。若是你想看看你的 Chrome 裏有多少進程,能夠點擊右上角選擇更多工具,而後選擇任務管理器,這時候你就可以看到當前運行的進程了。性能

多進程架構的好處

上面提到 Chrome 使用多個渲染進程。想象這麼一個場景,每一個標籤頁都有本身的進程。好比你打開了三個標籤頁,那麼每一個標籤頁都對應着一個進程,當其中一個不響應了,你能夠關閉它,其餘的標籤頁都是正常的。若是三個都在一個進程中,那一個不響應,三個都會掛掉。網站

把瀏覽器的工做分紅多個進程的另外一個好處就是安全性和沙箱。因爲操做系統提供了一種限制進程權限的方法,瀏覽器就能夠在某些進程上對這些功能進行限制。好比,Chrome 會限制能夠接收任意用戶輸入的渲染進程對任意文件的訪問。

因爲進程的內存是隔離的,因此這些進程都會保存一份基礎架構的副本,好比 V8 引擎。這意味着會浪費更多的內存,由於沒法共享它們。爲了節省內存,Chrome 對開啓的進程數作了限制,這個限制取決於你的電腦性能,當到達限制後,Chrome 會在一個進程內運行來自同一個網站的多個標籤頁。

節省更多內存 - Chrome Servicification

將相同的方法應用到瀏覽器上,Chrome 將瀏覽器的每一個部分做爲服務來運行,以即可以輕鬆的分解或者是合併。

一般的想法是,當 Chrome 運行在性能強悍的計算機上時,把服務拆分紅不一樣的進程,從而達到更高的穩定性,可是若是計算機的性能很差的時候,Chrome 會將服務合併成一個進程以節省內存佔用。

站點隔離

站點隔離是 Chrome 最近的一個功能,爲每個跨站的 iframe 單獨運行一個渲染進程。咱們剛剛一直討論的是爲每一個標籤頁啓動一個進程的模式,這個進程容許跨站 iframe 在渲染進程中執行並在不一樣站之間共享內存。在相同的進程上運行 a.comb.com 彷佛看起來是能夠的。可是同源策略是 Web 的核心安全策略,這樣能夠保證一個站點未經贊成就不能訪問其餘站點的數據。這樣一來繞過這個安全策略就是安全攻擊的主要目標。而進程隔離是分割站點最有效的辦法。隨着 Meltdown and Spectre 漏洞的公開,咱們更加須要使用進程來隔離站點了。自 Chrome 67 以來在桌面版默認啓用了站點隔離,選項卡中的每一個跨站 iframe 都會啓動一個單獨的渲染進程。

站點隔離

爲了啓用站點隔離,花費了多年時間去研究,它不像分配不一樣的渲染進程這麼簡單。它從根本上改變了 iframes 之間的對話方式。在運行着不一樣站點 iframe 的頁面上打開 DevTools 意味着,DevTools 必需要在後臺讓它看起來是無縫的。即使是運行 Ctrl + F 來進行搜索,也意味着要在不一樣的進程中進行全部,這就是瀏覽器工程師將站點隔離的發佈做爲重要里程碑的緣由。

PS: 上傳文章,發現有些動圖上傳失敗了,爲了更好的閱讀體驗,歡迎到公衆號查看文章,後續還會有接下來的三篇。

歡迎關注、轉發、分享支持我。

公衆號

相關文章
相關標籤/搜索