Chromium與CEF的多程序模型及相關引數

NO IMAGE

CEF基於Chromium,也是多程序模型。關於程序模型,參考這裡:https://www.chromium.org/developers/design-documents/process-models。我還看到一篇韓國人寫的renderer process的文章,也很不錯,在這裡:http://chromium-kr.blogspot.com/2012/06/about-renderer-process.html

CEF的程序模型,這裡也有一部分描述:https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage。CEF3預設使用multiple processess,CEF1預設支援較為穩定的的單程序模型。

Chromium的程序分為好幾類(content/public/common/content_switches.cc中有程序引數定義,content/app/content_main_runner.cc中對不同程序做了分支處理):

  • browser(沒有type引數時預設為browser程序)
  • renderer(kRendererProcess)
  • plugin(kPluginProcess)
  • ppapi-broker(kPpapiBrokerProcess)
  • ppapi(kPpapiPluginProcess)
  • sandbox-ipc(kSandboxIPCProcess)
  • utility(kUtilityProcess)
  • zygote(kZygoteProcess,linux)
  • gpu-process(kGpuProcess)

這篇文章會提到browser、ppapi、renderer、gpu,其它的我也沒研究,不知道幹嘛的……

CEF支援很多命令列引數(switches)。下面這些原始檔的註釋裡對它支援的switches做了定義:

  • tests/cefclient/common/client_switches.cc
  • base/base_switches.cc
  • cef/libcef/common/cef_switches.cc
  • chrome/common/chrome_switches.cc (not all apply)
  • content/public/common/content_switches.cc

大多數的Chromium swithes也適用於CEF,可以參考這裡:http://peter.sh/experiments/chromium-command-line-switches/。當然你也可以參考這裡:http://www.chromium.org/developers/how-tos/run-chromium-with-flags

程序模型開關引數

好啦,下面重點來說程序模型相關的幾個引數中與PPAPI相關的開關(拗口死了,我大部分解釋是由http://peter.sh/experiments/chromium-command-line-switches/的英文而來)。

  • –ppapi-in-process

在程序內執行ppapi外掛,加上這個引數執行CEF,ppapi外掛和browser還是不在一個程序……而是和renderer process在一起了……

  • –ppapi-out-of-process

指定這個引數時,ppapi外掛會在一個單獨的ppapi process中執行,程序啟動時的命令列引數中有“–type=ppapi”。

這是預設行為。

  • –process-per-site

為每個站點分配程序,一個站點的多個頁面會在同一個renderer程序內處理。(比如同一域名下的不同頁面就會被認為是同一站點)

Chrome的預設行為就是這樣。

  • –process-per-tab

每個tab相關的頁面分配一個renderer程序。一個tab可能會有多個頁面,比如JS或頁面事件導致的頁面跳轉。

  • –site-per-process

強制給一個site分配一個死忠的process,這個process就非這個site不嫁了,嫁了就從一而終。詳情可以看看這裡:http://www.chromium.org/developers/design-documents/site-isolation

  • –force-in-process

在多程序模式下,指定某些apps在主程序中執行,它的值可能是以逗號分隔的列表,比如:

--force-in-process=mojo:native_viewport_service,mojo:network_service 
  • –single-process

單程序模式執行CEF,開啟這個開關後,browser、renderer、gpu-process等程序合併在一個程序裡,但ppapi會單獨跑一個程序。

  • –renderer-process-limit

限制renderer程序數量。Chromium預設是根據系統配置(主要是記憶體)來計算renderer程序的最大值。

組合使用程序模型開關

我想使用單程序的CEF(CEF1是單程序模型),又想用Chromium的新特性,所以還是得用CEF3。可有人說CEF3的多程序模型不穩定,參見這裡的討論:http://www.magpcss.org/ceforum/viewtopic.php?f=7&t=13427。還有這裡:http://magpcss.org/ceforum/viewtopic.php?f=6&t=3427。後來發現Chromium也是這麼說的,見這裡:https://www.chromium.org/developers/design-documents/process-models

不過如果你真的想用,還是可以通過switches來控制。

  • ppapi、renderer、browser三者合一

要達到三者合一,傳遞下面的引數給CEF:

--single-process --ppapi-in-process
  • renderer、browser合一,ppapi外掛單獨執行在ppapi程序

傳遞下面的引數:

--single-process --ppapi-out-of-process

其他參考文章: