Chromium多进程的原因:
1. 提高浏览器的健壮性:包括单个plugin,单个页面的崩溃导致整个浏览器的崩溃;
2. 提高浏览器的安全性:基于多进程的安全模型(sanbox模型),比如Render进程默认是基于Sandox模型的,限制了该进程除I/O之外的能力。
Chromium中的进程:
Browser进程:负责管理浏览器的界面,页面间的管理,其它进程的管理;
Render进程:负责页面的显示,页面的渲染过程,chromium中使用webkit的地方;
PPAPI插件进程:同NPAPI,都是插件模型,改善了NPAPI存在的可移植性(和浏览器所处的系统和使用的窗口管理系统密切相关)、性能(图形的绘制效率,基于多进程的保留模式进行内存共享来代替网页发送无效通知给插件的的模式)、安全性方面(通过把具有存取底层os的接口运行在sanbox模型下来保证安全)的缺项。PPAPI是一种对本地api的跨平台的C/C++语言的封装,目的在于提供一个介于插件和浏览器之间的抽象层,用来区分浏览器和系统级别的功能实现。
GPU进程:当用户启动硬件加速时会启动该进程,用于硬件加速;负责处理绘图请求并调用OPENGL进行绘制工作。
#if defined(ENABLE_PLUGINS)
{ switches::kPluginProcess, PluginMain },
{ switches::kWorkerProcess, WorkerMain },
{ switches::kPpapiPluginProcess, PpapiPluginMain },
{ switches::kPpapiBrokerProcess, PpapiBrokerMain },
#endif // ENABLE_PLUGINS
{ switches::kUtilityProcess, UtilityMain },
{ switches::kRendererProcess, RendererMain },
{ switches::kGpuProcess, GpuMain },
进程之间通过IPC进行通讯,render和browser进程可以和任何进程直接通讯。
chromium的多进程架构见下图
多进程加载网页资源架构,用来补充说明ResourceDispatcherHost和Channel的Filter模块
在chromium中,所有网络访问在Browser进程中进行,这样做的目的一是有利于全局控制,二是能在不同进程间保持cookie等的session状态。架构图如下所示。
chromium的多线程模型
由于每个进程会处理很多的事情,为了在当前进程中不阻塞别的任务和充分利用多核CPU的特性,我们需要根据不同进程的任务来给进程创建一些线程。
Browser进程中的主要线程:由于browser需要管理其它进程,需要负责用户的响应,资源的加载管理,打开和读取各种文件设备,数据库的操作,历史记录的操作等,我们这些项都创建了单独的线程去完成这些任务。