技术分享06-Chromium多进程模型
概述
相信你一定有这样的经历:打开很多个页面,不幸的是其中某个页面不响应了或者崩溃了,随之而来的是更不幸的事,所有页面都不响应或者都崩溃了。最让人崩溃的是其中一些页面还有未保存或者未发送的信息!但是,现在好了,现代浏览器很多都支持多进程模型,这个模型可以很好地避免上面的问题,虽然它很复杂而且也有自身的问题,例如更多的资源消耗,但是它的优势也是非常明显的。
Chromium被构建得像一个操作系统,使用多进程隔离每个网站和浏览器自身,以一种安全而鲁棒的方式运行这些程序即使崩溃也不会互相影响。用户也可以在Chromium的任务管理器里查看每个进程的资源使用情况。
多进程架构的好处
Chromium的多进程架构至少带来三点好处:
- 避免单个页面的不响应或者奔溃影响整个浏览器的稳定性;
- 当第三方插件奔溃时候不会影响页面或者浏览器的稳定性;
- 方便了安全模型的实施,也就是说沙箱模型是基于多进程架构的。
其实,这很大程度上也是WebKit2产生的原因。
WebKit:
**广义上来说,WebKit是一个开源的项目。该项目专注于网页内容的展示,开发出一流的网页渲染引擎。**该项目包含两个部分,第一是WebCore,其中包含了对HTML,CSS等很多W3C规范的实现;第二部分就是狭义上的WebKit,它主要是各个平台的的移植并提供相对应的Web接口,也就是WebView或者类似WebView,这些接口提供操作和显示网页的能力。目前使用WebKit的主流的浏览器或者WebView包括Chrome,Safari,QtWebKit,Android Browser以及众多的移动平台的浏览器。
WebKit2:
WebKit2相对于狭义上的WebKit而言,**它不是WebKit简单的第二个版本,它是一个新的API层,其最主要的变化在于将网页的渲染置于单独的进程,而接口层则在另外一个进程,它们之间通过IPC来通讯。**对于接口的调用者来说,中间的IPC和底下的实现是透明的,这样做的好处有很多,一个很明显的好处是,当网页的渲染出现问题时,不会阻碍Web接口的调用者进程,这会在很大程度上解决或者帮助解决浏览器或者这些调用者的稳定性和安全性等问题。
Chromium:
**Chromium是一个建立在WebKit之上的浏览器开源项目,由Google发起的。**该项目被创建以来发展迅速,很多先进的技术被采用,如跨进程模型,沙箱模型等等。同时,很多新的规范被支持,例如WebGL,Canvas2D,CSS3以及其他很多的HTML5特性,基本上每天你都可以看到它的变化,它的版本升级很快。在性能方面,其也备受称赞,包括快速启动,网页加载迅速等。
Chrome:
Chrome是Google公司的浏览器产品,它基于Chromium开源项目,**一般选择稳定的版本作为它的基础,它和Chromium的不同点在于Chromium是开源试验场,会尝试很多新的东西,当这些东西稳定之后,Chrome才会集成进来,这也就是说Chrome的版本会落后于Chromium。**另外一个就是,Chrome里面会加入一些私有的codec,这些仅在Chrome中才会出现。再次,Chrome还会整合Google的很多服务, 最后Chrome还会有自动更新的功能,这也是Chromium所没有的。
在每个多进程架构里,Chromium的渲染器进程运行在一个沙箱进程中,它对用户电脑只有有限的访问权限。这些进程对用户的文件系统,显示器,或者大部分其他的资源没有直接的接触。相反,他们只通过浏览器进程获得对允许的资源的访问,而浏览器进程可以在这种访问上附加安全策略。
沙盒模型:
一般而言,对于网络上的网页中的JavaScript代码和插件都是不受信的(除非是经过认证的网站),特别是一些故意设计侵入浏览器运行的主机代码更是非常危险,通过一些手段或者浏览器中的漏洞,这些代码可能获取了主机的管理权限,这对主机系统来说是非常危险的,所以保证网页本身之外,还需要保证浏览器和浏览器所在的系统不存在危险。
如果有一种机制,将网页的运行限制在一个特定的环境中,也就是一个沙箱中,使它只能访问有限的功能。那么,即使网页工作的渲染引擎被攻击,它也不能够获取渲染引擎工作的主机系统中的任何权限,这一思想就是沙箱模型。
“沙盒”技术与主动防御技术原理截然不同。主动防御是发现程序有可疑行为时立即拦截并终止运行。“沙盒”技术则是发现可疑行为后让程序继续运行,当发现的确是病毒时才会终止。“沙盒”技术的实践运用流程是:让疑似病毒文件的可疑行为在虚拟的“沙盒”里充分表演,“沙盒”会记下它的每一个动作;当疑似病毒充分暴露了其病毒属性后,“沙盒”就会执行“回滚”机制——将病毒的痕迹和动作抹去,恢复系统到正常状态。
简单来说就是,在一个装满了平整细沙的盒子里,我们可以尽情随意地在上面作画、涂写,无论画的好坏,最后轻轻一抹,沙盒又回到了原来的平整状态。沙盒的魅力就在于他允许你出错,还可以给你改正的机会。
Chromium 的进程模型
下图给出了缺省的Chromium浏览器的进程模型。方框代表进程,连接线代表IPC(InterProcess Communication 进程间通信)。
通常来讲,chromium浏览器包括以下主要进程类型:
-
Browser进程:浏览器的主进程,负责浏览器界面的显示,各个页面的管理,其他各种进程的管理;
-
Render进程:页面的渲染进程,负责页面的渲染工作,WebKit的工作主要在这个进程中完成;
-
NPAPI插件进程:每种类型的插件只会有一个进程,每个插件进程可以被多个Render进程共享;
-
GPU进程:最多只有一个,当且仅当GPU硬件加速打开的时候才会被创建,主要用于对3D加速调用的实现;
-
Pepper插件进程:同NPAPI插件进程,不同的是为Pepper插件而创建的进程。
Chromium浏览器的进程模型,包括以下特征:
-
Browser进程和页面是分开的,这保证了页面的奔溃不会导致浏览器主界面的奔溃;
-
每个页面是独立的进程,这保证了页面之间相互不影响;
-
插件进程也是独立的,插件的问题不会影响浏览器主界面和页面;
-
GPU硬件加速进程也是独立的。
因为这么多的进程,开发者通常需要知道进程列表中的进程类别,这很简单,可以通过进程的命令行参数"–type"来识别。
Chromium 支持的模型
Chromium支持四种不同的模型,它们影响浏览器分配页面给渲染进程的行为。
单网站实例单进程(默认)
默认情况下,Chromium为用户访问的每个网站实例创建一个渲染器进程。这保证了不同网站的网页独立渲染,让对同一个网站的不同访问相互独立。因此一个网站实例中的失败(比如,渲染器崩溃)或者重的资源使用不会影响浏览器的其他部分。
一个网站实例是一些相同网站的相连网页的集合。我们这样认为两个页面是相连的:如果他们可以在脚本代码中获取彼此的引用的话(比如:如果一个页面被另一个页面用Javascript在一个新窗口中打开)。因此,两个标签页可以在同一个渲染进程里展示页面,同时在给定的一个标签页中导航到网站外的一个网页,可能切换标签页的渲染进程。
优点
- 隔离不同网站的内容。这提供了网页内容的命运共享的一种有意义的形式,在这种形式中,网页间的失败不会相互影响。
- 隔离展示相同网站的独立标签页。在不同的标签页中独立访问同样的网站会创建不同的进程。这可以避免同个实例中的争夺与失败,使其不会影响其他实例。
缺点
- 更多的内存负载。在大多数工作负载下,这个模型会比下面的每个网站一个进程创建更多渲染器进程。这虽然能增加稳定性并且增加并发的机会,但它也增加了内存负载。
- 更复杂的实现。不像每个标签页一个进程或者单进程,这个模型需要复杂的逻辑以支持标签在网页间导航时的进程交换,以及代理一些允许的源之间的JavaScript行为,比如传递消息。
单网站单进程
Chromium也支持这样一种进程模式,隔离不同的网站,但将相同网站的所有实例组合到一块。这创建更少的渲染进程,用鲁棒性交换更少的内存占用。这个模型基于内容的源,而非标签页间的关系。
优点
- 隔离不同网站的内容。正如每个网站实例一个进程的模型那样,不同网站的页面不会共享命运(不会同生共死)。
- 更少的内存占用。这个模型比上一个模型和每个标签一个进程的模型可能创建更少的并行进程。这对于减少Chromium的内存足迹可能是需要的。
缺点
- 可能导致更大的渲染进程。像google.com这样的站点上有着大量的应用程序,它们可能在浏览器里被同时打开,并且全部在同一个进程里渲染。因此,这些应用程序中的资源争夺与失败会影响许多标签页,使得浏览器看起来不能更好地响应。
- 实现更加复杂。与每个网站实例一个进程的模型相似,这需要在导航中交换进程以及代理一些javascript操作的逻辑。
单标签页单进程
每个网站或每个网站实例一个进程都需要在创建渲染进程时考虑网站内容的源。Chromium也支持一种简单的模型,将一个渲染器进程分配给每组脚本相关的标签页。这个模型可以使用 --process-per-tab命令行开关来选中。
特别地,Chromium会把一些脚本相关联的标签页成为一个浏览实例,它也与HTML5范畴中的“一个浏览上下文”对应。这个集合由一个标签以及这个标签用javascript代码所打开的标签组合而成。这样的标签必须在同一个进程中渲染,以允许在这些标签页间执行javascript调用(大多数通常发生在同源页面之间)。
优点
- 容易理解。每个标签页分配有一个渲染进程。
缺点
- 导致不想要的页面之间的命运共享。如果用户在浏览实例中导航一个标签页到一个不同的网站中,新的页面会和其他在同一个浏览实例中的任何其他标签页共享命运。
- 在实践中并没有比单个网站实例单进程更简单。
单进程
最后,出于比较的目的,Chromium支持单进程模型。在这个模型中,浏览器和渲染引擎跑在同一个操作系统进程里。
单进程模型提供了一个衡量多进程架构带来的负荷的基线。这不是一个安全的架构,也不是一个鲁棒的架构,因为任何渲染器的崩溃会导致整个浏览器进程挂掉。它只是设计用于测试和开发目的,并且可能包含在其他架构中没有的bug。
参考资料
理解WebKit和Chromium: WebKit, WebKit2, Chromium和Chrome介绍 - CSDN