單進程瀏覽器
單進程瀏覽器是指瀏覽器所以模塊都運行再同一個進程里,這些模塊包含了網(wǎng)絡、插件采缚、JavaScript 運行環(huán)境、渲染引擎和頁面等挠他。
2007年之前扳抽,所有的瀏覽器都是單進程的,e.g. IE6殖侵。IE6時代贸呢,瀏覽器是單進程的,所有頁面也都是運行在一個主線程中的拢军,當時IE6就是這樣設(shè)計楞陷,而且此時的IE6是單標簽,也就是說一個頁面一個窗口茉唉。頁面的所有的功能模塊都運行在同一個進程里固蛾,這個模塊包括但不限于:網(wǎng)絡、渲染引擎度陆、JavaScript運行環(huán)境艾凯、第三方插件等。
單進程的瀏覽器存在的問題:
- 不穩(wěn)定:早期的瀏覽器都是通過插件來實現(xiàn)視頻懂傀、游戲等功能趾诗,插件、渲染引擎等都運行在瀏覽器進程之中鸿竖,一個意外崩潰就會導致整個瀏覽器的奔潰沧竟。
- 不流暢:因為所有頁面的功能模塊都運行在同一個線程之中,因此同一時刻只有一個模塊可以執(zhí)行缚忧,這就很有可能出現(xiàn)一個模塊發(fā)生阻塞的時候而導致其他模塊無法運行的情況悟泵。
- 不安全:不安全主要是處于兩個方面的,一個是插件一個是頁面腳本闪水。頁面中運行的插件可以讀取電腦的資源糕非,執(zhí)行一些命令。而頁面腳本則可以通過瀏覽器漏洞來獲取系統(tǒng)權(quán)限球榆,從而應發(fā)一系列安全問題朽肥。
多進程瀏覽器
背景:國產(chǎn)瀏覽器都采用多標簽的形式,其中的一個標簽頁面的卡頓都會影響到整個瀏覽器持钉。
因為卡頓衡招,國內(nèi)瀏覽器就開始嘗試支持頁面多線程,也就是讓部分頁面運行在單獨的線程之中每强,意味著每個線程擁有單獨的JavaScript執(zhí)行環(huán)境始腾,和Cookie環(huán)境。
問題就來了:比如A站點頁面登陸一個網(wǎng)站空执,保存了一些Cookie數(shù)據(jù)到磁盤上浪箭,再在當前線程環(huán)境中保存部分Session數(shù)據(jù),由于Session是不需要保存到硬盤上的辨绊,所以Session只會保存在當前的線程環(huán)境中奶栖。這時候再打開另外一個A站點的頁面,假設(shè)這個頁面在另外一個線程中里面门坷,那么它首先讀取硬盤上的Cookie信息宣鄙,但是,由于Session信息是保存在另外一個線程里面的拜鹤,無法直接讀取框冀,這樣就要實現(xiàn)一個Session同步的問題。
后來敏簿,Session問題解決了明也,但是假死的問題依然有,因為進程內(nèi)使用了一個窗口惯裕,這個窗口是依附到瀏覽器主窗口之上的温数,所以他們公用一套消息循環(huán)機制,如果一個窗口卡死了蜻势,整個瀏覽器也會卡死撑刺。
國產(chǎn)瀏覽器又出了一招,就是把頁面做成一個單獨的彈窗握玛,如果這個頁面卡死了够傍,就把這個彈窗給隱藏掉甫菠。
!C嵬汀寂诱!為什么Chrome中的一個頁面假死不會影響到主窗口呢?
這是因為chrome輸出實際上是圖片安聘,然后瀏覽器端把圖片貼到自己的窗口上去痰洒,在Chrome的渲染進程內(nèi),并沒有一個渲染窗口浴韭,輸出的只是圖片丘喻,如果卡住了,頂多圖片不更新了念颈。
隨著 Chrome 瀏覽器的發(fā)布泉粉,瀏覽器架構(gòu)終于來到了多進程的時代。
其中 Chrome 瀏覽器的進程架構(gòu)如下:
Chrome架構(gòu)包括:1 個瀏覽器(Browser)主進程榴芳、1 個 GPU 進程搀继、1 個網(wǎng)絡進程、多個渲染進程和多個插件進程翠语。作用如下:
Browser進程(瀏覽器進程):瀏覽器的主進程叽躯。主要有以下幾個作用:負責瀏覽器頁面的顯示與頁面交互;負責個頁面的管理(創(chuàng)建和銷毀其他進程)肌括;將 Renderer 進程得到的內(nèi)存中的 Bitmap 点骑,繪制到用戶頁面上;網(wǎng)絡資源的管理谍夭,下載等黑滴。
第三方插件進程:主要負責插件的運行,每種類型的插件都對應著一個進程紧索,只有當使用該插件時才會創(chuàng)建該進程袁辈,這樣就做到了隔離插件的效果,保證插件的崩潰不會影響到瀏覽器以及頁面珠漂。
GPU進程:為了實現(xiàn) 3D CSS 的效果晚缩,GPU進程成為了瀏覽器的普遍需求,因此Chrome瀏覽器也在其多進程的架構(gòu)上引入了GPU進程媳危。
瀏覽器渲染進程荞彼,也就是瀏覽器內(nèi)核,Renderer進程待笑,內(nèi)部是多線程的:默認每個Tab頁面都是一個進程鸣皂,互相不影響。主要作用是頁面渲染,腳本執(zhí)行寞缝,事件處理等癌压。
網(wǎng)絡進程:主要負責頁面的網(wǎng)絡資源的加載,之前是作為一個模塊運行在瀏覽器進程中的荆陆,最近幾年才獨立出來措拇,作為一個單獨的進程存在。
PS:圖解Chrome架構(gòu)
PS:Chrome底層原理
單進程瀏覽器遺留問題的解決:
- 不穩(wěn)定:由于進程是相互隔離的慎宾,所以當一個頁面或者插件崩潰 時,影響到的僅僅是當前的頁面進程或者插件進程浅悉,并不會影響到瀏覽器和其他頁面趟据,這就完美地解決了頁面或者插件的崩潰會導致整個瀏覽器崩潰。
- 不流暢:在多進程的架構(gòu)下术健,JavaScript 只是運行在自己的渲染進程中的汹碱,因此即使 JavaScript 代碼阻塞了渲染進程,受到影響的也只是當前所渲染的頁面荞估,腳本運行也是同樣的道理咳促。而對于常常引發(fā)性能問題的內(nèi)存泄漏,在這種架構(gòu)下勘伺,關(guān)閉一個頁面跪腹,會將整個渲染進程給關(guān)閉,這時候操作系統(tǒng)就會回收這個進程所占用的內(nèi)存飞醉,也就會不會存在內(nèi)存泄漏的問題了冲茸。
- 不安全:多進程架構(gòu)的可以使用安全沙箱,你可以把沙箱看成是操作系統(tǒng)給進程上了一把鎖缅帘,沙箱里面的程序可以運行轴术, 但是不能在你的硬盤上寫入任何數(shù)據(jù),也不能在敏感位置讀取任何數(shù)據(jù)(文檔钦无、桌面)逗栽。沙箱里面,即使在渲染進程或者插件進程里面執(zhí)行了惡意程序失暂,惡意程序也無法突破沙箱去獲取系統(tǒng)權(quán)限彼宠。
多進程的瀏覽器存在著一些問題:
資源占用更多了
更為復雜的體系結(jié)構(gòu)
SOA架構(gòu)
服務化:在2016年Chrome官方團隊使用面向服務的架構(gòu)的思想設(shè)計了新的Chrome架構(gòu),也就是說Chrome整體架構(gòu)會朝向現(xiàn)代操作系統(tǒng)所采用的面向服務的架構(gòu)方向發(fā)展弟塞,原來的各種模塊都會被重構(gòu)成獨立的服務兵志,每個服務都可以在獨立的進程中運行,訪問服務必須使用定義好的接口宣肚,通過IPC來通信 想罕,從而構(gòu)建一個更內(nèi)聚、松耦合、易于維護和擴展的系統(tǒng)按价,更好實現(xiàn)chrome簡單穩(wěn)定惭适,高速安全的目標 。
Chrome最終要把UI楼镐、數(shù)據(jù)庫癞志、文件、設(shè)備框产、網(wǎng)絡等模塊重構(gòu)為基礎(chǔ)服務凄杯,類似操作系統(tǒng)底層服務。
彈性架構(gòu):將瀏覽器程序的每個部分秉宿,作為一項服務運行戒突,然后根據(jù)情況而定,來將其拆分為不同的流程或匯總為同一個流程描睦,是個資源的動態(tài)調(diào)配整合膊存。
e.g. 若瀏覽器在高性能電腦上運行時,可能會將每個服務拆分為不同的進程忱叭,從而提供更高的穩(wěn)定性隔崎。但如果不具備此條件,設(shè)備資源受到約束韵丑,多個服務就可能會被整合到一個進程當中爵卒,從而節(jié)省內(nèi)存占用。
總結(jié):
PS:單進程與多進程優(yōu)缺點
問題小結(jié)
為什么單進程瀏覽器當時沒有采用安全沙箱撵彻?
因為一個進程使用了安全沙箱后技潘,該進程的系統(tǒng)權(quán)限受限,在單進程瀏覽器中千康,這將會影響主進程的權(quán)限享幽。
打開Chrome瀏覽器一個Tab頁面,至少會出現(xiàn)幾個進程拾弃?
根據(jù)目前的Chrome架構(gòu):1 個瀏覽器(Browser)主進程值桩、1 個 GPU 進程、1 個網(wǎng)絡(NetWork)進程豪椿、多個渲染進程和多個插件進程奔坟;
1. 頁面中有iframe的話,跨站點 iframe 在單個渲染器進程中運行(站點隔離)搭盾,并在不同站點之間共享內(nèi)存空間咳秉。
image.png2. 有插件的話,插件也會開啟進程
3. 多個頁面屬于同一站點鸯隅,并且從a打開b頁面澜建,會共用一個渲染進程
4. 裝了擴展的話向挖,擴展也會占用進程
這些進程都可以通過Chrome任務管理器來查看
多進程架構(gòu),還是會碰到單頁面卡死的最終崩潰導致所有頁面崩潰的情況炕舵?
Chrome的默認策略是何之,每個標簽對應一個渲染進程。但是如果從一個頁面打開了新頁面咽筋,而新頁面和當前頁面屬于同一站點時溶推,那么新頁面會復用父頁面的渲染進程。那么同一個站點的其中一個頁面崩潰了奸攻,那么其他頁面也會跟著一起崩潰蒜危。