天天看點

Chrome核心解析 -- 背景篇:Chromium的多程序多線程構架

轉載請注明出處:http://blog.csdn.net/yunchao_he/article/details/41695497

Chromium采用多程序構架,以Desktop Chromium為例,它包括一個Browser Process(也稱為UI Process), 一個或多個Render Process(也稱為Web Process), 零個或一個GPU Process, 以及一個或多個NPAPI Plugin Process, 一個或多個Pepper Plugin Process. 

也就是說,當你用Chrome浏覽器打開多個網站(比如同時打開網易,人人網,bbs,淘寶),且每個網站可能對應多個tab(比如網易打開了一則頭條,一則财經新聞,一則體育新聞,而淘寶則打開多個購物視窗買衣服,進而進行對比),這時系統對應着一個Browser程序,以及(預設情況下)多個Render程序,可能還有一個GPU程序,以及數量不等的plugin程序。這可以通過相應的工具檢視,比如Windows下的任務管理器。

而各程序可能包含多個線程,比如Browser 程序包括主線程,compositor線程,I/O線程,一個或多個資源下載下傳線程,檔案操作線程,等等衆多線程。其中主線程負責發起網絡請求,調用Render程序開始解析HTML和執行JS,接收并響應使用者操作(比如使用者拖動滾動條)等等。compositor線程負責将網頁内容和浏覽器的視窗部件進行合成,進而形成最終要顯示的像素。

Render程序則包括主線程,compositor線程,raster線程等。其中,主線程負責執行Javascript, 解析HTML/CSS, 完成繪制或者發起raster線程進行繪制,發起compositor線程等。compositor線程負責将網頁的各個Layer進行合成。而raster線程負責完成某個layer或者某些塊(tile)的繪制。

多程序構架的好處是顯而易見的,一方面各程序、各線程協同工作可充分利用多核特性,以提高運作效率或響應速度。另一方面,程序分離可最大限度防止因通路某個網站而崩潰導緻整個浏覽器崩潰。這樣,使用者在其它網站上編輯而未送出的檔案或其它操作不會是以丢失。

另外,Render程序的多少,可以在啟動Chrome時進行配置,相關的指令行參數有--process-per-site-instance, --process-per-site, --process-per-tab, --single-process等等。通過這些參數,可以讓同一個域名的多個tab共享同一個render程序(比如上文提到的打開網易的多條新聞,或多個淘寶購物視窗),或者每個tab都單獨占用一個render 程序,或者所有域名均共享一個render程序。

各程序間采用Chromium IPC通信機制,具體可參考http://www.chromium.org/developers/design-documents/inter-process-communication。關于Chrome的多程序構架,可參考http://www.chromium.org/developers/design-documents/multi-process-architecture。而如何通過指令行參數設定render程序的共享行為,可參考http://www.chromium.org/developers/design-documents/process-models