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设计文档-多进程架构的更多相关文章

  1. Chrome设计文档-多进程资源加载

    原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个re ...

  2. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  3. VM架构设计文档初稿v0.01

    VM架构设计文档初稿v0.01 文档介绍 本文档是经过讨论,作为VM新架构设计开发中的重要依据.对该架构的整个系统的结构进行详实细致的描述.阐述框架结构,说明该架构所采取的设计策略和所有技术,并对相关 ...

  4. DDD领域驱动设计 - 设计文档模板

    设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...

  5. Msmq设计文档(赋源代码)

    Msmq设计文档(赋源代码)   Msmq设计文档     文件状态: [√] 草稿 [  ] 正式发布 [  ] 正在修改 文件标识: ECI-MSMQ v01 当前版本: 0.5 作    者: ...

  6. Atitit.atiagent  agent分销系统 代理系统 设计文档

    Atitit.atiagent  agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...

  7. Net 通用权限管理系统源码 带数据库设计文档,部署说明文档

    Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389

  8. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  9. Access数据库自动生成设计文档

    在做Access数据库设计时,常常直接在access文件中建表,建字段,然后写设计文档时,又得重新再写一遍字段和表间关系.其实access数据库自己就支持自动生成数据库文档. 操作方法如下: 数据库工 ...

随机推荐

  1. 新浪云-PHP实现上传原图,缩略图

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...

  2. Linux学习之sed命令详解

    概述 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区 ...

  3. JavaWeb核心编程之(三.4)Servlet Context 配置

    ServletContextServlet引擎为每个Web应用程序都创建一个对应的ServletContext对象, ServletContext对象被包含在ServletConfig对象中, 调用S ...

  4. javascript学习笔记(2)

    <html> <head><title>Throwing die</title><script>    var canv_width  = ...

  5. SQL Server一些重要视图 1

    第一个: sys.indexs 每个堆与索引在它上有一行. 第二个: sys.partitions每个堆与索引的每一个分区返回一行.每一张表最多可以有1000个区. 第三个: sys. allocat ...

  6. Eclipse Rcp

    http://blog.csdn.net/soszou/article/details/7996748

  7. 一个Windows C++的线程类实现

    Thread.h [cpp] view plaincopy #ifndef __THREAD_H__ #define __THREAD_H__ #include <string> #inc ...

  8. [置顶] Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏的时候的切换与显示

    这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去 ...

  9. keep健身计划

    下一个月计划 1keep二周计划 2百度第一期学完 3百度前端技术学院提升

  10. python <tab>自动补全

    1.获取python目录[我使用的是64位ubuntu系统] [~$]python Python 2.7.3 (default, Apr 10 2013, 06:20:15) [GCC 4.6.3] ...