淺述瀏覽器多進程發展歷程

一、瀏覽器的多進程概括
要想搞明白什麼是瀏覽器的多進程,首先得知道什麼是進程。按照維基百科的說法:

進程是計算機中已運行程序的實體。進程是線程的容器,進程本身不運行。程序本身只是指令的集合,進程纔是程序(指令)的真正運行。每個程序可以有多個進程,每個進程都有自己的資源。
簡單來講,進程就是CPU資源分配的最小單位,而線程則是CPU調度的最小單位。那什麼又是單線程和多線程呢,我們來看一小段代碼:

var a = 1 + 10086
var b = 100 * 2
var c = (20 + 1) * 2
var d = 100/10
var e = a + b + c + d
console.log(e)
譬如上面的代碼,如果是在單線程的運行環境比如JavaScript,就會需要將上面的計算一個個的去執行完成,然後得出運行結果,也就需要進行六步才能將e打印出來,但如果是在多線程的運行環境中則只需要使用四個線程來同時計算上面的四個運算,待上面的四個運算全部完成後再把他們相加,然後再打印出來。因此使用多線程的並行運算可以大大的提高程序的性能以及效率。
但雖然多線程可以有效的提高程序的運行效率,但它是不能單獨存在的,它需要進程的啓動與管理。簡單來說,進程與線程之間會存在以下四種關係:

進程中的任意一線程執行出錯,都會導致整個進程的崩潰。很常見就是JavaScript出現的執行線程出錯時會導致整個頁面進程的崩潰,而導致頁面白屏。
線程之間共享同進程中的數據。
當一個進程關閉之後,操作系統會回收進程所佔用的內存。
進程之間的內容會相互隔離。每個進程都只能訪問自己訪問的數據,這可以有效的避免一個進程的崩潰而影響到其他的進程。如果進程之間有進行數據通信的需要,這時候就需要進程通信(IPC)機制了。

二、瀏覽器進程發展過程
現在我們都知道瀏覽器都是多進程的,但其實回顧歷史發展的歷程,瀏覽器也經歷了一個由單進程到多進程的發展歷程。現在就讓我們來理一理瀏覽器單線程到多線程的發展歷程。

2.1 青銅時代—單進程的瀏覽器
2007年之前,所有的瀏覽器都是單進程的,其中的典型代表就是IE6了。在ID6的時代,頁面還是單標籤的,一個頁面一個窗口,一個窗口一個主線程。因此顧名思義,單進程的瀏覽器就是指打開一個瀏覽器,其中包含一個頁面,而這個頁面的所有的功能模塊都運行在同一個進程裏,這個模塊包括但不限於:網絡、渲染引擎、JavaScript運行環境、第三方插件等。具體架構如下圖所示:
[圖片上傳失敗…(image-c661e1-1574774887028)]
基於這種情況,單進程的瀏覽器就存在以下一些問題:

  1. 不穩定
    早期的瀏覽器都是通過各式各樣的插件來實現諸如視頻、遊戲等功能的,而插件本身又很不靠譜,由於插件運行在瀏覽器進程之中,因此一個插件的意外崩潰就會導致整個瀏覽器的奔潰。同樣的,渲染引擎也是這個道理,往往一個JavaScript的bu就可能導致整個頁面崩潰。

  1. 不流暢
    因爲所有頁面的JavaScript線程、渲染模塊、以及第三方插件都運行在同一個線程之中,因此同一時刻只有一個模塊可以執行,這就很有可能出現一個模塊發生阻塞的時候而導致其他模塊無法運行的情況。此外當時國產的瀏覽器其實都是基於IE6來進行二次開發的,因此這些國產瀏覽器雖然基於自身需要,都採用的多標籤頁的形式,但這些多標籤頁其實也是跑在同一個線程裏的,這就會導致其中一個標籤頁的卡頓會影響到整個瀏覽器。

  1. 不安全
    不安全主要是處於兩個方面的,一個是插件一個是頁面腳本。頁面中運行的插件可以讀取電腦的資源,執行一些命令。而頁面腳本則可以通過瀏覽器漏洞來獲取系統權限,從而應發一系列安全問題

2.2 白銀時代—多進程瀏覽器時代
終於隨着 Chrome 瀏覽器的發佈,瀏覽器架構終於來到了多進程的時代。其中 Chrome 瀏覽器的進程架構如下:
[圖片上傳失敗…(image-b1bc99-1574774887028)]
其主要作用如下:

Browser進程(瀏覽器進程):這是瀏覽器的主進程。有且只有一個,它主要有以下幾個作用:
負責瀏覽器頁面的顯示與頁面交互
負責個頁面的管理。創建和銷燬其他進程
將 Renderer 進程得到的內存中的 Bitmap ,繪製到用戶頁面上。
網絡資源的管理,下載等。
第三方插件進程:主要負責插件的運行,每種類型的插件都對應着一個進程,只有當使用該插件時纔會創建該進程,這樣就做到了隔離插件的效果,保證插件的崩潰不會影響到瀏覽器以及頁面。
GPU進程:最多一個,用於3D繪製。這個進程在最初是沒有的。但爲了實現 3D CSS 的效果,GPU進程成爲了瀏覽器的普遍需求,因此Chrome瀏覽器也在其多進程的架構上引入了GPU進程。
瀏覽器渲染進程,也就是瀏覽器內核,Renderer進程,內部是多線程的:默認每個Tab頁面都是一個進程,互相不影響。主要作用是頁面渲染,腳本執行,事件處理等。
網絡進程:主要負責頁面的網絡資源的加載,之前是作爲一個模塊運行在瀏覽器進程中的,最近幾年才獨立出來,作爲一個單獨的進程存在。

然後基於以上的架構,我們來看看他們是如何解決單進程瀏覽器所存在的問題的:

  1. 解決不穩定
    首先瀏覽器渲染進程本省就是分離開來的,每個Tab也面都是一個單獨的進程,互不影響。其次將第三方插件進程也單獨拎了出來,這樣就算一個頁面的插件出現可問題,也不會影響到這個頁面的渲染進程,也就不會對瀏覽器造成影響了。

  1. 解決不流暢
    在多進程的架構下,JavaScript 只是運行在自己的渲染進程中的,因此即使 JavaScript 代碼阻塞了渲染進程,受到影響的也只是當前所渲染的頁面。腳本運行也是同樣的道理。而對於常常引發性能問題的內存泄漏,在這種架構下,關閉一個頁面,會將整個渲染進程給關閉,這時候操作系統就會回收這個進程所佔用的內存,也就會不會存在內存泄漏的問題了。

  1. 解決不安全
    採用多金策的架構的一個好處就是可以使用安全沙盒,沙盒通常嚴格控制其中的程序所能訪問的資源,比如,沙盒可以提供用後即回收的磁盤及內存空間。在沙盒中,網絡訪問、對真實系統的訪問、對輸入設備的讀取通常被禁止或是嚴格限制。而charome瀏覽器就將插件進程以及渲染進程所在了沙盒之中,這樣即使插件進程以及渲染進程有惡意程序在執行,也無法突破沙盒去獲取系統權限,對我們的電腦造成影響。
    雖然現在的多進程的瀏覽器看起來很美好,解決了原先單進程瀏覽器所存在的諸多的問題,但同樣不可避免的存在着一些問題:

資源佔用更多了
更爲複雜的體系結構

2.3 黃金時代—SOA架構
爲了解決現在瀏覽器所存在的資源佔用高,體系更爲複雜的問題,2016年 Chrome 團隊就開始使用 “面向服務的架構”(SOA)的思想來設計新的 Chrome 架構。
那什麼是SOA呢,簡單來說SOA就是一種組件模型,他將應用程序的不同功能單元通過這些服務之間所定義好的接口或者契約聯繫起來。接口採用中立的方式來進行定義,獨立於硬件平臺、操作系統以及編程語言。這使得構建各種各樣的系統中的服務都可以以一種統一和通用的方式來進行交互。
也就是說, Chrome要做的就是將UI進程、設備、文件、Audio等等模塊都編程基礎服務,每個服務都可以在獨立的進程中運行,而訪問這些服務也必須使用定義好的接口,並通過IPC來進行通信。從而構建一個更內聚、松耦合、更易維護和擴展的系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章