Chrome多进程架构

Chrome多进程架构

不同的浏览器使用不同的架构,下面主要以Chrome为例,介绍浏览器的多进程架构。在Chrome中,主要的进程有4个:

进程 负责的工作
Browser 负责浏览器的“Chrome”部分,包括导航栏,书签,前进和后退按钮。同时这个进程还会控制那些我们看不见的部分,包括网络请求的发送以及文件的读写。
Renderer 负责tab内和网页展示相关的所有工作。
Plugin 控制网页使用的所有插件,例如flash插件。
GPU 负责独立于其它进程的GPU任务。它之所以被独立为一个进程是因为它要处理来自于不同tab的渲染请求并把它在同一个界面上画出来。

Chrome 多进程间构成

首先,当我们是要浏览一个网页,我们会在浏览器的地址栏里输入URL,这个时候Browser Process会向这个URL发送请求,获取这个URLHTML内容,然后将HTML交给Renderer ProcessRenderer Process解析HTML内容,解析遇到需要请求网络的资源又返回来交给Browser Process进行加载,同时通知Browser Process,需要Plugin Process加载插件资源,执行插件代码。解析完成后,Renderer Process计算得到图像帧,并将这些图像帧交给GPU ProcessGPU Process将其转化为图像显示屏幕。

Chrome 多进程间通信

除了上面列出来的进程,Chrome还有很多其他进程在工作,例如扩展进程(Extension Process)和工具进程(utility process。如果你想看一下你的Chrome浏览器现在有多少个进程在跑可以点击浏览器右上角的更多按钮,选择更多工具和任务管理器。

多进程架构的好处

当今Web应用中,HTML,JavaScriptCSS日益复杂,这些跑在渲染引擎的代码,频繁的出现BUG,而有些BUG会直接导致渲染引擎崩溃,多进程架构使得每一个渲染引擎运行在各自的进程中,相互之间不受影响,也就是说,当其中一个页面崩溃挂掉之后,其他页面还可以正常的运行不收影响。

各进程间独立

更高的安全性和沙盒性(sanboxing。渲染引擎会经常性的在网络上遇到不可信、甚至是恶意的代码,它们会利用这些漏洞在你的电脑上安装恶意的软件,针对这一问题,浏览器对不同进程限制了不同的权限,并为其提供沙盒运行环境,使其更安全更可靠

更高的响应速度。在单进程的架构中,各个任务相互竞争抢夺CPU资源,使得浏览器响应速度变慢,而多进程架构正好规避了这一缺点。

浏览器的进程模式与网站隔离(Site Isolation)

为了节省内存,Chrome提供了四种进程模式(Process Models,不同的进程模式会对tab进程做不同的处理。

  • Process-per-site-instance(default) -同一个site-instance使用一个进程
  • Process-per-site -同一个site使用一个进程
  • Process-per-tab -每个tab使用一个进程
  • Single process -所有tab共用一个进程

这里需要给出sitesite-instance的定义:

  • site指的是相同的registered domain name(如:google.com,bbc.co.uk)scheme (如:https://)。比如a.baidu.comb.baidu.com就可以理解为同一个site(注意这里要和Same-origin policy区分开来,同源策略还涉及到子域名和端口

  • site-instance指的是一组connected pages from the same site,这里connected的定义是can obtain references to each other in script code怎么理解这段话呢。满足下面两中情况并且打开的新页面和旧页面属于上面定义的同一个site,就属于同一个site-instance

    • 用户通过<a target="_blank">这种方式点击打开的新页面
    • JS代码打开的新页面(比如window.open)

首先是Single process,顾名思义,单进程模式,所有tab都会使用同一个进程。接下来是Process-per-tab,也是顾名思义,每打开一个tab,会新建一个进程。而对于Process-per-site,当你打开a.baidu.com页面,在打开b.baidu.com的页面,这两个页面的tab使用的是共一个进程,因为这两个页面的site相同,而如此一来,如果其中一个tab崩溃了,而另一个tab也会崩溃。

Process-per-site-instance是最重要的,因为这个是Chrome默认使用的模式,也就是几乎所有的用户都在用的模式。当你打开一个tab访问a.baidu.com,然后再打开一个tab访问b.baidu.com,这两个tab会使用两个进程。而如果你在a.baidu.com中,通过JS代码打开了b.baidu.com页面,这两个tab会使用同一个进程。

Process-per-site-instance兼容了性能与易用性,是一个比较中庸通用的模式。相较于Process-per-tab,能够少开很多进程,就意味着更少的内存占用;相较于Process-per-site,能够更好的隔离相同域名下毫无关联的tab,更加安全。

下一页