在使用瀏覽器時偶然發(fā)現(xiàn)雖然僅僅打開一個標(biāo)簽頁,但是在任務(wù)管理器內(nèi)發(fā)現(xiàn)有多個瀏覽器進程在運行,占用了不小的內(nèi)存,當(dāng)時很納悶:為什么一個瀏覽器卻需要多個進程呢?不經(jīng)意間在網(wǎng)上發(fā)現(xiàn)這篇文章,以Google chrome瀏覽器為例,講解了使用多進程構(gòu)架的瀏覽器。翻譯給大家,希望對有英語閱讀困難的同學(xué)有所幫助,第一次翻譯技術(shù)文章,好多術(shù)語不明白啥意思,也沒有搜到都是憑理解翻譯的。如cross-site frame,如果有錯誤請不吝指正。
原文地址:
http://blog.chromium.org/2008/09/multi-process-architecture.html
瀏覽器的多進程構(gòu)架
跟現(xiàn)在的很多瀏覽器不一樣,谷歌chrome瀏覽器使用多個進程來隔離不同的網(wǎng)頁和你的計算機。在這篇博客中我將會解釋為什么在現(xiàn)在的網(wǎng)絡(luò)條件下使用多進程架構(gòu)是一個巨大的進步。我還會討論瀏覽器的不同部分分別屬于什么進程以及在什么情況下google chrome為創(chuàng)建一個新的進程。
1:為什么在一個瀏覽器中使用多個進程。
在瀏覽器剛被設(shè)計出來的時候,那時的網(wǎng)頁非常的簡單,幾乎沒有動態(tài)的代碼。這對僅使用一個進程渲染所有要訪問的網(wǎng)頁卻仍然保持非常低的資源占有率是行得通的。
然而在今天我們看到大量網(wǎng)頁轉(zhuǎn)而使用動態(tài)網(wǎng)頁,從含有大量javascript和flash的網(wǎng)頁到像完全成熟的網(wǎng)絡(luò)應(yīng)用如GMail。這些應(yīng)用的很大一部分是在瀏覽器中運行的,就像運行在操作系統(tǒng)之上的應(yīng)用程序一樣。跟操作系統(tǒng)一樣,瀏覽器必須讓這些應(yīng)用互相分離。
除此之外,瀏覽器中負責(zé)渲染HTML,JavaScript和CSS的部分日益的復(fù)雜。在這些渲染引擎在演化的過程中會頻繁的出現(xiàn)bug,有些bug會導(dǎo)致渲染引擎崩潰。不僅如此,渲染引擎會經(jīng)常性的在網(wǎng)絡(luò)上遇到不可信、甚至是惡意的代碼,它們會利用這些漏洞在你的電腦上安裝惡意的軟件。
在當(dāng)今世界,把所有東西都放進一個進程的瀏覽器面臨在健壯性,響應(yīng)速度,安全性方面的挑戰(zhàn)。如果瀏覽器中的一個網(wǎng)絡(luò)應(yīng)用崩潰的話,這回波及括所有被打開的應(yīng)用在內(nèi)的任何其他應(yīng)用。單線程的網(wǎng)絡(luò)應(yīng)用不得不經(jīng)常相互競爭以獲得的cpu時間,這有時會導(dǎo)致整個瀏覽器無法響應(yīng)。安全性也同樣不容小覷,因為僅僅一個頁面就可以利用渲染引擎的某個漏洞獲得對整臺計算機的控制權(quán)。
然而,并不是非這樣做不可。網(wǎng)絡(luò)應(yīng)用在設(shè)計的時候就是在瀏覽器中相互獨立且并行的運行。它們不需要對磁盤和設(shè)備的訪問權(quán)。這些被應(yīng)用在網(wǎng)絡(luò)上的安全策略保證了這些,使讓你在訪問大部分的頁面時并不需要擔(dān)心數(shù)據(jù)和計算機的安全性。這意味著可以讓瀏覽器中的應(yīng)用在不破壞彼此的情況下完全相互隔離。對于瀏覽器中的插件如flash也是一樣的,它們與瀏覽器松散的耦合在一起且相互隔離,這沒有任何問題。
Google Chrome充分利用了這種特性,它將插件或是網(wǎng)絡(luò)應(yīng)用放在與瀏覽器本身不同的進程中。在一個渲染引擎中的崩潰并不會影響瀏覽器本身或是其他網(wǎng)絡(luò)應(yīng)用。這意味著操作系統(tǒng)可以并發(fā)的運行網(wǎng)絡(luò)應(yīng)用來提高響應(yīng)速度,如果一個特定的網(wǎng)絡(luò)應(yīng)用程序或是插件停止響應(yīng)時瀏覽器本身并不會被死鎖。這也意味著我們可以在一個嚴格意義上的沙箱內(nèi)運行渲染引擎進程,幫助減少發(fā)生錯誤時造成的損失。
有趣的是,使用多進程意味著Google Chrome可以有自己的任務(wù)管理器,你可以通過右擊瀏覽器標(biāo)題欄打開。這個任務(wù)管理器可以讓你跟蹤每個網(wǎng)絡(luò)應(yīng)用和插件的資源使用率,而不是針對整個瀏覽器。
它也可以讓你在不需要重啟瀏覽器的情況下終止任何停止響應(yīng)網(wǎng)絡(luò)應(yīng)用或插件。
針對以上原因,Google Chrome瀏覽器的多進程構(gòu)架與單進程瀏覽器相比有更強的健壯性,更快的響應(yīng)速度,同時更安全。
2:每個進程內(nèi)都有什么。
Google Chrome創(chuàng)建三種不同類型的進程:瀏覽器進程,渲染器進程,插件進程。
瀏覽器進程:瀏覽器進程只有一個,用于管理標(biāo)簽頁、窗口和瀏覽器本身。這個進程同時負責(zé)處理所有跟磁盤、網(wǎng)絡(luò)、用戶輸入和顯示的交互,然而它不分析和渲染任何網(wǎng)頁內(nèi)容。
渲染器進程:渲染器進程會創(chuàng)建多個進程,每個都負責(zé)渲染網(wǎng)頁。渲染器進程中包含用于操作HTML,JavaScript,CSS,圖片和其他內(nèi)容的復(fù)雜的邏輯。我們使用了也同樣被Apple Safari瀏覽器使用的開源的WebKit渲染引擎實現(xiàn)以上功能。每個渲染器進程都運行在沙箱內(nèi),這意味著它對磁盤、網(wǎng)絡(luò)和顯示器沒有直接的訪問權(quán)限。所有跟網(wǎng)絡(luò)應(yīng)用的交互,包括用戶輸入事件和屏幕繪制都必須通過瀏覽器進程。這可以讓瀏覽器進程監(jiān)視渲染器的可疑行為,一旦發(fā)現(xiàn)其從事破壞活動就將其終止。
插件進程:瀏覽器進程同樣為處于使用狀態(tài)的每種類型的插件創(chuàng)建一個進程,如:Flash、Quicktime或Adobe reader。這些進程僅僅包含插件本身以及和瀏覽器進程、渲染器進程交互的膠水代碼。
3:在什么情況下瀏覽器會創(chuàng)建進程。
一旦Google Chrome創(chuàng)建了一個瀏覽器進程,它一般會為你所訪問的每個站點創(chuàng)建一個渲染器進程。這種做法旨在將不同站點的不同網(wǎng)頁相互隔離。
你可以這樣認為:瀏覽器對每個標(biāo)簽頁面使用不同的進程,但是允許兩個相關(guān)的且屬于同一站點的網(wǎng)頁共享同一個渲染器進程。例如,如果打開另一個也使用JavaScript的標(biāo)簽頁,或者你打開了屬于同一個站點的新標(biāo)簽頁,這些標(biāo)簽頁將會共享一個渲染器進程。這可以讓這些標(biāo)簽頁中的頁面通過JavaScript通信,共享緩存對象。相反,如果你在標(biāo)簽頁的地址欄里輸入一個不同站點的URL,這個標(biāo)簽頁會被交換到一個新的渲染器進程。
跟已存在的頁面保持兼容對我們來講非常重要?;诖?,我們將每個站點定義一個像google.com或bbc.co.uk注冊的域名,這意味著我們可以認為像mail.google.com和maps.google.com一樣的子域名是屬于同一個站點。這很有必要,因為存在屬于不同子域名的標(biāo)簽頁面通過Javascript相互通信的情況,因此我們讓它們使用同一個渲染器進程。
然而,對這種基本的方法要有以下注意事項。如果創(chuàng)建太多的進程,電腦的性能會降低,因此我們限定了創(chuàng)建渲染進程的最大數(shù)量(大多數(shù)情況下是20)。當(dāng)達到這個限制時我們會為新標(biāo)簽頁頁面重用已經(jīng)存在的渲染器進程。因此,同一個渲染器進程可以被用于多個站點。我們不把跨站點的訪問放在原來的進程,同時也不將所有類型的交叉站點導(dǎo)航都交換到新的渲染器進程。目前,我們僅僅將瀏覽器進程本身的導(dǎo)航交換到新的標(biāo)簽頁進程。盡管有這么多告誡,在平常使用時google chrome還是會將不同站點相互隔離。
對于每一種類型的插件,當(dāng)你第一次訪問一個使用該插件的網(wǎng)頁時,google chrome會創(chuàng)建一個插件進程。只有當(dāng)所有使用該插件的所有網(wǎng)頁都被關(guān)閉之后,該進程才會被撤銷。
隨著我們對創(chuàng)建和交換渲染器進程策略的進一步細化,我們會發(fā)布更多的博客。同時我們希望在你使用Google chrome時會體驗到多進程構(gòu)建帶來的諸多好處。
本文由Charlie Reis發(fā)表
ithzhang翻譯
轉(zhuǎn)載請注明出處,謝謝!!