【Chromium中文文檔】進程模型

轉載請注明出處:
https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh/General_Architecture/Process_Models.html

全書地址
Chromium中文文檔 for https://www.chromium.org/developers/design-documents
持續更新ing,歡迎star
gitbook地址:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//
github地址: https://github.com/ahangchen/Chromium_doc_zh

這個文檔描述了Chromium支持的不同線程模型,包括它的渲染器進程,以及現有模型實現的問題。

概述

網頁內容已經發展到包含大量在瀏覽器內運行的活躍代碼的地步,使得許多網站更像應用程序而非文檔。這種變革改變了瀏覽器的角色,從一個簡單的文檔渲染器變成一個操作系統。Chromium構建得像一個操作系統那樣,使用多進程隔離每個網站和瀏覽器自身,以一種安全而魯棒的方式運行這些程序。這提高了魯棒性,因為每個進程運行在自己的地址空間里,由操作系統調度,即使崩潰也不會互相影響。用戶也可以在Chromium的任務管理器里查看每個進程的資源使用情況。

Web瀏覽器有許多方法可以分割成不同的操作系統進程,最佳的架構的選擇取決于許多因素,包括穩定性,資源使用,對實際情況的觀察。Chromium支持四種不同的進程模型,允許開發者實驗,也有最適合大部分用戶的默認模式。

支持的模型

Chromium支持四種不同的模型,它們影響瀏覽器分配頁面給渲染進程的行為。默認情況下,Chromium為用戶訪問的每個網站使用一個獨立的操作系統進程。然而,用戶可以在啟動Chromium時指定命令行選項,以選擇其他的架構:全網站單進程,每組相連標簽頁一個進程,或者每個東西都放在一個單獨的進程中。這些模型的區別在于他們是否影響內容的源,是否影響標簽頁間的關系,或者兩者都會影響。這個章節在更深的細節上討論每種模型,并在這個文檔的后面描述當前Chromium的實現的一些問題。

單網站實例單進程

默認情況下,Chromium為用戶訪問的每個網站實例創建一個渲染器進程。這保證了不同網站的網頁獨立渲染,讓對同一個網站的不同訪問相互獨立。因此一個網站實例中的失敗(比如,渲染器崩潰)或者重的資源使用不會影響瀏覽器的其他部分。這個模型基于內容的源和腳本會相互影響的標簽頁間的關系。因此,兩個標簽頁可以在同一個渲染進程里展示頁面,同時在給定的一個標簽頁中導航到網站外的一個網頁,可能切換標簽頁的渲染進程。(注意,Chromium當前的實現有一些重要的問題,會在下面的Caveat(警告)部分討論。)

具體說來,我們把一個注冊域名(例如:google.combbc.co.uk)加一個scheme(例如:https:// )定義為一個網站。這與同源策略定義相似,但它將子域名(比如:mail.google.comdocs.google.com)和端口(比如http://foo.com:8080 )合并到同一個網站中。允許網站的不同子域名或端口中的頁面通過Javascript訪問是有必要的,如果他們的document.domain變量相同的話,同源策略也會這樣允許。

一個網站實例是一些相同網站的相連網頁的集合。我們這樣認為兩個頁面是相連的:如果他們可以在腳本代碼中獲取彼此的引用的話(比如:如果一個頁面被另一個頁面用Javascript在一個新窗口中打開)。

優點

  • 隔離不同網站的內容。這提供了網頁內容的命運共享的一種有意義的形式,在這種形式中,網頁間的失敗不會相互影響。
  • 隔離展示相同網站的獨立標簽頁。在不同的標簽頁中獨立訪問同樣的網站會創建不同的進程。這可以避免同個實例中的爭奪與失敗,使其不會影響其他實例。

缺點

  • 更多的內存負載。在大多數工作負載下,這個模型會比下面的每個網站一個進程創建更多渲染器進程。這雖然能增加穩定性并且增加并發的機會,但它也增加了內存負載。
  • 更復雜的實現。不像每個標簽頁一個進程或者單進程,這個模型需要復雜的邏輯以支持標簽在網頁間導航時的進程交換,以及代理一些允許的源之間的JavaScript行為,比如傳遞消息。(關于這個話題的更多內容以及我們正在進行的對這種模型的完全支持的努力,查看下面的Caveats(警告)部分以及我們的站點隔離工程頁面。)

單網站單進程

Chromium也支持這樣一種進程模式,隔離不同的網站,但將相同網站的所有實例組合到一塊。為了使用這個模型,用戶需要在啟動Chromium時在終端指定 --process-per-site開關。這創建更少的渲染進程,用魯棒性交換更少的內存占用。這個模型基于內容的源,而非標簽頁間的關系。

優點

  • 隔離不同網站的內容。正如每個網站實例一個進程的模型那樣,不同網站的頁面不會共享命運(不會同生共死。。)。

  • 更少的內存占用。這個模型比上一個模型和每個標簽一個進程的模型可能創建更少的并行進程。這對于減少Chromium的內存足跡可能是需要的。

缺點

  • 可能導致更大的渲染進程。像google.com這樣的站點上有著大量的應用程序,它們可能在瀏覽器里被同時打開,并且全部在同一個進程里渲染。因此,這些應用程序中的資源爭奪與失敗會影響許多標簽頁,使得瀏覽器看起來不能更好地響應。不幸的是,在細粒度上而非通過注冊域名區分網站邊界,并且不影響向后兼容性是很困難的。
  • 實現更加復雜。與每個網站實例一個進程的模型相似,這需要在導航中交換進程以及代理一些javascript操作的邏輯。

單標簽頁單進程

每個網站或每個網站實例一個進程都需要在創建渲染進程時考慮網站內容的源。Chromium也支持一種簡單的模型,將一個渲染器進程分配給每組腳本相關的標簽頁。這個模型可以使用 --process-per-tab命令行開關來選中。

特別地,我們會把一些腳本相關聯的標簽頁成為一個瀏覽實例,它也與HTML5范疇中的“一個瀏覽上下文單元”對應。這個集合由一個標簽以及這個標簽用javascript代碼所打開的標簽組合而成。這樣的標簽必須在同一個進程中渲染,以允許在這些標簽頁間執行javascript調用(大多數通常發生在同源頁面之間)。

優點

  • 容易理解。每個標簽頁分配有一個渲染進程,并不會隨時間改變。

缺點

  • 導致我們不想要的頁面之間命運共享。如果用戶在瀏覽實例中導航一個標簽頁到一個不同的網站中,新的頁面會和其他在同一個瀏覽實例中的任何其他標簽頁共享命運。

某些情況下,盡管處于安全的需要,在這個模型中,Chromium仍然強制標簽頁中的進程交換已經沒有什么價值。例如,通常的網頁不允許與優先級高的網頁(比如設置,或者新標簽頁)共享進程。因此,這個模型在實踐中并沒有比單個網站實例單進程更簡單。

單進程

最后,出于比較的目的,Chromium支持單進程模型,通過--single-process命令行開關打開。在這個模型中,瀏覽器和渲染引擎跑在同一個操作系統進程里。

單進程模型提供了一個衡量多進程架構帶來的負荷的基線。這不是一個安全的架構,也不是一個魯棒的架構,因為任何渲染器的崩潰會導致整個瀏覽器進程掛掉。它只是設計用于測試和開發目的,并且可能包含在其他架構中沒有的bug。

沙箱與插件

在每個多進程架構里,Chromium的渲染器進程運行在一個沙箱進程中,它對用戶電腦只有有限的訪問權限。這些進程對用戶的文件系統,顯示器,或者大部分其他的資源沒有直接的接觸。相反,他們只通過瀏覽器進程獲得對允許的資源的訪問,而瀏覽器進程可以在這種訪問上附加安全策略。因此,Chromium的瀏覽器進程可以減輕一個被利用的渲染器引擎能做的事情。

瀏覽器插件,比如Flash和Silverlight,也在他們自己的進程中執行,并且有些插件,比如Flash運行在Chromium的沙箱中。在Chromium支持的每個多進程架構中,對每種活躍的插件都只有一個進程。因此,所有的Flash實例運行在同一個進程里,不論它們出現在哪個網站或標簽頁中。

警告

這個部分列出一些Chromium當前進程模型實現的警告,以及它們的意義。

  • 大多數始于渲染器的標簽頁中的導航還沒有列入進程交換中。如果用戶點擊一個鏈接,提交一個表單,或者被腳本重定向,,如果導航是跨站的話,Chromium不會試圖切換標簽頁中的渲染器進程。Chromium只會為始于瀏覽器的跨站導航交換進程,比如在地址欄輸入一個URL或者打開一個書簽。因此,不同網站的頁面可能會在同一個進程中渲染,甚至是在單網站實例單進程模型和單網站單進程模型中。這很可能在將來的Chromium版本中,作為網站隔離工程的一部分進行修改。

然而,網頁可以使用一種機制來讓一個鏈接指向一個不相關的頁面,這樣它們可以在不同的進程中安全地渲染。如果一個link有rel=noreferrer或target=blank這樣的屬性,那么Chromium會在另外的進程中渲染它。

  • 子頁面現在是與父頁面在相同進程中渲染的。雖然跨站點的子頁面沒有訪問它們的父頁面的腳本,而且它們可以在不同的進程中安全地渲染,但Chromium還沒有在獨立的進程中渲染它們。與上面的第一個警告相似,這意味著不同站點的頁面會在同樣的進程中渲染。這很可能在Chromium將來的版本中進行修改。

  • Chromium創建的渲染進程數目有上限。這避免瀏覽器占用用戶電腦的太多進程。這個限制與計算機的內存成比例,并且最多可以有80個進程。因為這樣的限制,一個渲染器可能被分配給多個站點。這種重用現在是隨機進行的,但將來的版本中,Chromium會做一個啟發式的策略,智能的把站點分配給渲染器進程。

實現記錄

Chromium中有兩個類代表了不同的進程模型實現的抽象需要:BrowsingInstance和SiteInstance。
BrowsingInstance類代表了一個瀏覽器中腳本相連的集合,在HTML5領域中也被稱為相關瀏覽上下文單元。在單標簽頁單進程模型中,我們為每個BrowsingInstance創建一個渲染器進程。

SiteInstance類代表了來自相同站點的相同頁面。它是BrowsingInstance內部頁面的一個子集,因為在BrowsingInstance內部,每個站點只有一個SiteInstance,所以它很重要。在單網站實例單進程模型中,我們為每個SiteInstance創建一個渲染器進程。為了實現單網站單進程,我們必須確保來自同一個站點的所有的SiteInstance歸入相同的進程中。

學術論文

現代瀏覽器架構中隔離Web程序

Charles Reis, Steven D. Gribble (both authors at UW + Google)

Eurosys 2009. Nuremberg, Germany, April 2009.

摘要

今天的許多網站包含大量客戶端代碼,因此,他們不再是簡單的文檔,而更多地表現出程序的特征。這給瀏覽器提出了魯棒性與性能的挑戰。為了給用戶提供一個魯棒而又快速響應的平臺,瀏覽器必須識別應用程序邊界,在他們之間提供隔離。

我們在這篇文章中提出三個點。第一,我們為web程序和程序實例提供抽象,并說明這些抽象描繪了瀏覽器組件是如何交互的,合適的程序邊界該如何識別出來;第二,我們識別回退可用性的代價,因為這約束了在不干擾已有網站的情況下,將網頁內容劃分為程序所能做到的程度;第三,我們展示了一個多進程瀏覽器架構,相互隔離這些web應用程序,提高容錯度,優化資源管理和性能。我們會討論這個架構在Google Chrome中是如何實現的,然后我們會提供一個量化的性能評估以檢查這種架構的好處與代價。

Chromium瀏覽器安全架構
Adam Barth, Collin Jackson, Charles Reis, and The Google Chrome Team

Stanford Technical Report, September 2008.

摘要

大多數當前網頁瀏覽器使用一個單片架構,將user和web合并到同一個保護域中。如果一個攻擊者在這樣的瀏覽器中利用了任意一個代碼執行漏洞,他們都可以盜取敏感文件或者安裝惡意軟件。在這篇文章里,我們會展示Chromium(Google Chrome是在這個開源軟件的基礎上構建的)的安全架構。Chromium有兩個處于不同保護域中的模塊:一個是瀏覽器內核,與操作系統交流,一個是渲染引擎,在沙箱中運行,有著有限的權限。這個架構能夠減輕高危攻擊,而且不犧牲已有網站的可用性。我們為每個瀏覽器調用定義了一個威脅模型,并評估這個架構能夠如何減少過去的漏洞。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容