原文地址:http://www.chromium.org/developers/design-documents/multi-process-architecture
瀏覽器引擎不可能絕對穩定,也不可能絕對安全。
某種程度上,當前的Web瀏覽器類似於之前單用戶、多任務協同工作的操作系統。
2、結構概述
爲了減少瀏覽器內核的bug,我們將不同的Tab頁用不同的進程隔離起來。進程間的訪問受限,對系統其他部分的訪問也受限。這使得web瀏覽器獲得了類似內存保護和訪問控制給操作系統帶來的好處。
我們將UI和管理Tab頁、插件進程的主進程稱爲browser進程或者browser。同樣的,一個特定tab頁對應的進程被稱爲render進程或者renderers。這些renderers使用WebKit開源佈局引擎來解釋和佈局HTML。
4、管理視圖
RenderProcess
管理,對應着tab頁裏的內容。RenderProcessHost
爲每一個View維護一個RenderViewHost。用ID號來標識同一個Render裏不同的View。ID值在一個Render裏是不同的,但不保證在Browser裏不同,所以要需要一個RenderProcessHost和一個ViewID才能定位到一個View。Browser和特定tab頁裏的特定view通過這些RenderProcessHost對象來通信,它們知道怎樣從RenderProcessHost發送消息到 RenderProcess並最終作用於RenderView
。
5、組件和接口
- RenderProcess(Render端)維持着與RenderProcessHost(Browser端)間IPC通信。每個render進程只有一個RenderProcess對象,這就是browser和所有的renderers間通信的方式。
- Renderview(Render端)通過RenderProcess(Render端)以及WebKit嵌入層和RenderViewHost (Browser端)通信。Renderview對象代表一個tab頁的內容或者一個彈出窗口。
- Browser對象代表一個最高級別的的瀏覽器窗口。
- RenderProcessHost(Browser端)對象代表一個 Browser和Renderer間的IPC連接。每個render進程對應browser進程裏的一個RenderProcessHost。
- RenderViewHost(Browser端)對象將同遠端Renderview(Render端)的通信封裝進內部,RenderWidgetHost(Browser端)對象控制着RenderWidget(Render端)的輸入和繪製。
6、共享render進程
RenderView
(Render端)。
7、探測未正常運行的Renderers
8、將renderer放入沙盒
Renderers在不同的線程中運行,自然而然將隱藏的tab頁置爲低優先級。通常,Windows操作系統將進程內存放入“可用內存”池來減少內存佔用。在內存吃緊的情況下,WIndows會將低優先級的內存置換到硬盤,確保用戶可見的程序交互更順暢。我們可以將這種規則應用到隱藏的tab頁中。如果必要,當一個render進程沒有高級別tab頁的時候,可以暗示操作系統將render的工作集內存置換到硬盤裏。我們逐漸的釋放這些內存,因爲工作集內存的釋放幫隨着切換tab頁性能變差的後遺症。這意味着,用戶切回剛用過的標籤頁比切回很久沒有使用的標籤頁工作集內存準備好的機率更高。如果用戶有足夠的內存跑起來所有的程序,將不會進行內存置換。
Windows只在必要的時候這麼做,所以內存足夠的時候將不會有性能憂慮。