Chrome设计文档-多进程架构
chromium multi-process architecture
本文档从high-level的角度描述Chromium的多进程架构。
问题
要构建一个决不崩溃或挂起的渲染引擎几乎是不可能的。同样的,要构建一个100%安全的渲染引擎也是不可能的。
从某些角度来看,当今的web浏览器有点类似于过去的单用户,多任务操作系统。正如一个异常的程序会导致整个系统down掉,一个异常的网页也会导致一个现代浏览器挂掉。
现代操作系统之所以更加健壮利益于它们把应用放到隔离的进程中。一个应用的崩溃不会影响其它的应用或者操作系统本身。任一用户对其它用户的数据操作都是严格受限的。
架构概述
我们针对浏览器的tab使用隔离的进程。这种方案可以保护应用本身完整,不受渲染引擎的bugs或小差错的影响。同时,我们也严格限制从渲染引擎到其它进程的访问。从某些方面来看,这给网页浏览带来了内存保护和访问控制的收益。而这两点均借鉴自操作系统。
我们把主进程称为“browser process(浏览进程)或browser”。该进程负责UI的运行和tab的管理工作,同时,也负责插件进程的管理工作。类似的,tab特定的进程被称为“render process”或者“renderer”。Renderers使用”WebKit”开源引擎解析并布局HTML文档。

管理渲染进程(Rendering process / Renderer)
每一个Renderer对应一个全局的RenderProcess对象。该对象管理Renderer与父进程Browser process间的通信,并维护全局状态。Browser则维护多个RenderProcessHost对象。每个RenderProcessHost对应一个Renderer。Browser负责策略浏览状态以及与Renderer的通信。Browser与Renderers间的通信由Chromium的IPC系统承担。
管理Views
每个Renderer有一个或多个RenderView对象。一个Renderer相当于一个tab。相应的,RenderProcessHost维护一个RenderViewHost。一个RenderViewHost对应于Renderer中的一个view。同一个Renderer中,为了区分不同的view,每个view会被分配一个ID。这些ID在同一个Renderer里是唯一的,但在browser里并不是。所以,要标识一个view,需要RenderProcessHost和一个view ID。
组件和接口
在Render进程里:
- RenderProcess负责处理与RenderProcessHost间的IPC。RenderProcessHost位于Browser中。每一个Render进程仅一个RenderProcess。所有的browser和renderer间的通信都是这样子的。
- RenderView对象与browser进程中的RenderViewHost通信(当然,是通过RenderProcess完成的)。RenderView代表一个网页上的内容或弹出窗口中的网页内容。
在Browser进程中:
- Browser对象代表一个顶层的browser窗口
- RenderProcessHost代表browser端的browser<->renderer ipc连接。在browser里,每一个render进程对应一个RenderProcessHost。
- RenderViewHost封装了与远端的RenderView间的通信流程。RenderWidgetHost处理输入和RenderWidget的绘制。
共享Renderer
通常,一个新窗口或新tab打开一个新的进程。浏览器会生成一个新进程,然后,指令它去创建一个单独的RenderView。
有时,tabs或windows间共享Renderer也是必须的或者非常有必要的。比如,一个web应用使用window.open打开一个同步模式的新窗口。这种情况下,当我们创建一个新窗口或tab时,我们需要复用原进程,即窗口打开者所在的进程。对于进程数过多的情况,我们也有相应的策略把新tab交给已存在的进程。这些策略参见Process Models。
崩溃探测或渲染异常
每一个到browser进程IPC链接会监控渲染进程(renderer)的句柄。如果这些句柄收到信号,那么渲染进程已经崩溃,tab页收到崩溃通知。从今开始,当Renderer崩溃时,我们会显示一个”sad tab“屏来通知用户。当前页面可以通过点击”preload“按钮重新加载。
Renderer沙盒化
假设WebKit在一个分离的进程中运行,我们有机会控制它对系统资源的访问。比如,我们可以限定renderer的网络操作只能通过其父进程完成。类似的,我们也可以严格限制它对文件系统的访问。
Plug-ins
NPAPI插件运行在自己的进程中,与renderers分离。详情参见Plugin Architecture。
Chrome设计文档-多进程架构的更多相关文章
- Chrome设计文档-多进程资源加载
原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个re ...
- 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素
朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...
- VM架构设计文档初稿v0.01
VM架构设计文档初稿v0.01 文档介绍 本文档是经过讨论,作为VM新架构设计开发中的重要依据.对该架构的整个系统的结构进行详实细致的描述.阐述框架结构,说明该架构所采取的设计策略和所有技术,并对相关 ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
- Msmq设计文档(赋源代码)
Msmq设计文档(赋源代码) Msmq设计文档 文件状态: [√] 草稿 [ ] 正式发布 [ ] 正在修改 文件标识: ECI-MSMQ v01 当前版本: 0.5 作 者: ...
- Atitit.atiagent agent分销系统 代理系统 设计文档
Atitit.atiagent agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...
- Net 通用权限管理系统源码 带数据库设计文档,部署说明文档
Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- Access数据库自动生成设计文档
在做Access数据库设计时,常常直接在access文件中建表,建字段,然后写设计文档时,又得重新再写一遍字段和表间关系.其实access数据库自己就支持自动生成数据库文档. 操作方法如下: 数据库工 ...
随机推荐
- Power Designer Repository 使用指南(一)
最近wait4friend在进行建模的时候,总是被问如果在Power Designer里面进行版本的控制.原始的方法是对PDM文件进行SVN管理,不过这个方法比较土,并且不方便版本直接图形的比较.其实 ...
- jQuery EasyUI combobox多选和赋值
定义select <select id="ID" name=empVO.acunid class="easyui-combobox" required=& ...
- 安装Eclipse Html Editor
最近在eclipse中开发android项目,用到了jquery mobile框架,则会涉及到新建html文件,发现eclipse不自带新建html文件的插件,必须得新建一个其他形式的文件,譬如xml ...
- C语言学习——C和Java语言不同点
Java中有boolean数据类型,”真“为true,”假“为false.而且在if()括号里只能放boolean类型的值. C的基本数据类型和Java的基本一致,但C多了指针类型.指针是C语言的重点 ...
- jQuery treeview的简单用法
最近的项目要用到treeview插件,刚好就自己整理一下这方面的资料. 1.文档树示例 最简单的一个例子就是文档树的实现.效果如下图所示. 在使用treeview之前,html文档中需要包含几个jqu ...
- 编写一个程序实现strcpy函数的功能
#include <stdio.h> #include <string.h> #define N 5 char *mycpy(char *s1, char *s2) { //数 ...
- sqlite3编译与查询
1.sqlite3 http://www.sqlite.org/ 下载 wget http://www.sqlite.org/2014/sqlite-amalgamation-3080403.zip ...
- .net mvc下的Areas和小写Url
首先是一个站点有前台后台两部分,这个要怎么来做.可以在mvc项目中添加区域(Areas)来实现,当添加一个名为Admin的区域时,项目下多了一个Areas/Admin目录,里边有Controllers ...
- AutoIt 函数学习之----WinWaitActive
WinWaitActive函数 暂停脚本的执行直至指定窗口被激活(成为活动状态)为止. WinWaitActive ( "窗口标题"[, "窗口文本"[, 超时 ...
- MySQL中用decimal的原因
原因:float保存的值有可能是这个值的近似值,而不是这个值的真实值.如 0.1在二进制中是没有办法保存真实值的. 下面是例子: 第一步:建表: create table t2(x float,y d ...