立诚勿怠,格物致知
It's all about connecting the dots

Chrome浏览器:CPU、GPU、内存、多进程架构

一、计算机的核心是CPU和GPU

为了了解浏览器运行所在的环境,我们需要了解一些计算机的东西以及他们是做什么的。

首先是CPU(Central Processing Unit,中央处理单元)。你可以将CPU比做是计算机的大脑。每一颗CPU核,就像办公室里的一位白领,他可以一个接一个地处理很多不同的事情。

 

图1:CPU核们就像坐在桌前的工作人员,在处理派给他们的任务

然后是GPU(Graphics Processing Unit,图像处理单元)。GPU与CPU不同,GPU擅长同时跨多核处理简单任务。正如GPU的名字所示,它最初是用来处理图像的——在图像相关的话题中当我们提到GPU时一般总会提到让渲染更快、让交互更平滑。后来,随着GPU加速计算技术的发展,越来越多的计算任务可以单独在GPU上进行了。

 

图2:这些GPU核们手里都只有一个扳手,说明他们只干比较简单的活

当你打开计算机或手机里的一个应用时,正是CPU和GPU在控制着这个应用。通常,应用通过操作系统的某些机制运行在CPU和GPU之上。

 

图3:计算机的3层架构:最底部是机器硬件,中间是操作系统,最上面是应用

二、在进程和线程上执行程序

在了解浏览器架构前,我们还需要搞懂进程和线程。我们可以把一个应用的执行程序看做是一个进程,线程则存在于进程中并执行对应进程的部分程序。

当你打开一个应用,一个进程就被创建了。应用的程序可能会创建一个或多个线程来帮助其完成工作——当然也可以不创建线程。操作系统会给进程提供一块内存供其使用。应用的所有状态都保存在这块私有内存空间中。当你关闭应用时,进程也就不存在了,操作系统会释放这一块内存。

 

图4:如果把进程比做是一个有边界的盒子,那么进程就像是在其中游泳的鱼

一个进程可以让操作系统去开启另一个进程,以便执行不同的任务。当出现这种情况时,会给新进程分配一块与旧进程不同的内存。两个进程之间可以通过IPC(Inter Process Communication,进程间通信)技术进行通讯。许多应用都是这么设计的,这样当一个工作进程无响应之后可以将其重新启动,而不会导致同一应用的其他进程被停止。

图5:不同进程间通过IPC技术进行通信

三、浏览器架构

那么浏览器运行时,进程和线程是怎么样的情况呢?是一个进程+多个线程?还是多个进程通过IPC进行通信,然后有些进程里有一些线程?

 

图6:不同浏览器架构下的进程/线程关系图

需要注意的一点是,这些不同的浏览器架构都是实现细节。并不存在什么标准来规定浏览器厂商应该如何实现浏览器的架构。一个浏览器厂商的实现细节可以和另一个浏览器厂商的实现细节完全不同。

在这里,我们以Chrome浏览器最近的架构为例(见下图)。图中左上角是浏览器进程(Browser Process),它会和关注浏览器其他部分的进程进行协作。图中左下角是渲染器进程(Renderer Process),可以看到图中有好几个渲染器进程,实际上Chrome浏览器会尽可能为每个tab标签页创建一个渲染器进程,不过现在Chrome已经开始为每个站点(包括iframe里的)创建一个渲染器进程了。

 

图7:Chrome浏览器多进程架构示意图(渲染器进程那里显示了好几层是表示Chrome浏览器正在为多个tab运行多个渲染器进程)

四、哪个进程控制了什么

下面对各Chrome进程进行简单介绍:

  • 浏览器进程(Browser Process):控制浏览器的主界面,包括地址栏、书签、前进和后退按钮。它也会控制不可见的、web浏览器特有的比如网络请求、文件访问等。
  • 渲染器进程(Renderer Process):控制浏览器标签页(展示网站的地方)下的所有东西。
  • 插件进程(Plugin Process):控制网站用到的插件,比如Flash。
  • GPU进程(GPU Process):处理独立于其他进程的GPU任务。GPU会处理多个APP的请求,然后在同一个界面上进行绘制。

 

 

 

 

图8:不同进程在浏览器UI界面上的对应关系

实际上,还有些其他进程,比如扩展进程(Extension Process)和公共设施进程(Utility Process)。

五、Chrome中多进程架构的好处

我们说过,Chrome会使用多个渲染器进程。我们把场景简化一下,你可以认为每个浏览器tab都有一个与其对应的渲染器进程。这样,当你有3个tab标签页时,就会有3个互相独立的渲染器进程。如果其中一个tab标签页卡住没有响应了,你可以将其关掉重新打开——在这个过程中其他标签页一直都是可正常响应的。如果所有tab标签页都共用同一个渲染器进程,那么当其中一个tab标签页卡住没响应时,其他标签页也都会卡住无法响应了,这是很影响用户体验的。

 

图9:每个tab标签页对应一个渲染器进程的示意图

将浏览器的工作分给多个进程还有个好处,就是安全和沙箱化。操作系统提供了限制进程权限的方法,所以浏览器可以在某些特性上将某些进程沙箱化。举个例子,像渲染器进程这种有可能处理用户任意输入内容的进程,Chrome浏览器会限制其文件访问权限。

因为进程有其私有的内存空间,它们进程会包含一些公共设施的拷贝(比如Chrome浏览器的JavaScript引擎:V8)。这意味着和单进程多线程的架构比,这种多进程架构需要使用更多的内存,因为这些公共设施没法像单进程多线程架构里多线程之间那样共享。为了节省内存,Chrome浏览器会限制其所能开启的进程数。这个限制数量会依据设备的内存和CPU能力而变动。当Chrome达到这个限制数后,Chrome会开始将同网站的多个tab运行于一个进程中。

六、节省更多内存——Chrome中的服务化

浏览器进程(Browser Process)也采用了类似的方法。Chrome正在经历架构上的改动,以便将浏览器程序分成多个子程序,对应多个服务。这些服务可以被拆分到多个进程中,也可以合到一个进程中。

总体的思路是,当Chrome在性能强劲的硬件上运行时,它会倾向于将每个服务都拆到单独的进程中以便获取更好的稳定性;但是当Chrome在资源受限的设备上运行时,它会倾向于将这些服务整合到同一个进程中以便节省出更多的内存。在此之前,像Android平台,就是用类似的方法来整合多个进程以节省内存使用的。

图10:

参考资料

赞(0) 打赏
文章名称:《Chrome浏览器:CPU、GPU、内存、多进程架构》
文章链接:https://www.orzzone.com/chrome-cpu-gpu-memory-multi-process-architecture.html
商业联系:yakima.public@gmail.com

本站大部分文章为原创或编译而来,对于本站版权文章,未经许可不得用于商业目的,非商业性转载请以链接形式标注原文出处。
本站内容仅供个人学习交流,不做为任何投资、建议的参考依据,因此产生的问题需自行承担。

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力提供更多优质内容!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册