原文链接:https://developers.google.com/web/updates/2018/09/inside-browser-part1
GPU,CPU,内存和多进程架构
这个博客系列有4个部分,我们将一探 Chrome 浏览器内部,从高级架构到引擎渲染细节。如果你曾经好奇过你的代码是如何变成一个有功能的网站,或者你不确定为什么一个指定的技术是可以提升性能的,那么这个系列很适合你。
这本系列的第一部分中,我们将介绍核心计算术语和 Chrome 多进程架构。
如果你熟悉 idea 的 CPU/GPU 和多进程架构,你可以跳过前面这部分,到浏览器架构开始。
计算机的核心是 CPU 和 GPU
(关于二者的区别看知乎的讨论)
为了了解浏览器运行环境,我们需要了解一些计算机部件以及他们做了些什么。
CPU
CPU 是 Central Processing Unit 三个单词的首字母。CPU 可以看做是你计算机的大脑。一个 CPU 核心,如图中所示,这里你可以看做是一个办公室中的职员,许多不同的任务进来会被一个接着一个进行处理。
(4 个 CPU 核心像办公室职员一样在办公桌上处理每个进来的任务)
GPU
Graphics Processing Unit,GPU 是计算机的另一部分。和 CPU 不同,GPU 擅长处理简单的任务,但是同一时间可以同时处理多个。和它的名字一样,最早是用来处理图像的。这就是为什么在图像环境中使用 GPU 快速渲染和流畅互动管理在一起。最近几年随着 GPU 计算的加速,在 GPU 上计算有着越来越多的可能。
当你在你的电脑或者手机上运行一个应用时,CPU 和 GPU 会启动该应用。通常,应用程序使用操作系统提供的机制在 CPU 和 GPU 上运行。
(计算机三层架构,硬件层在底部,操作系统在中间,应用在最上层)
在进程和线程上执行程序
(进程像一个边框,线程像鱼在进程中游来游去)
在深入浏览器架构之前要掌握的另一个概念是进程和线程。一个进程可以看做是执行应用的程序,线程存在于进程内部,并执行进程程序中任何的程序。
当你启动一个应用,就会创建一个进程。这个进程可能会创建线程来帮助它执行一些任务,这是可选的。操作系统会给这个进程分配一个私有的内存空间,该内存槽存储这所有应用的工作状态。当你关闭这个应用,进程会离开同时操作系统也会释放这部分内存。
一个进程可以要求操作系统启动另一个进程来执行不同的任务。当发生这种情况时,会为这个新的进程分配一部分内存空间。如果两个进程需要通信他们可以通过 Inter Process Communication(IPC)来实现。大多数应用都是这样设计通过这种方法,如果一个工作进程没有响应,可以重启它,而不需要停止其它正在运行的进程。
(进程通过 IPC 进行通信)
浏览器架构
那么是如何使用进程和线程构建一个 web 浏览器的呢?当然,这可以试一个进程和多个不同线程,或者是多个不同进程和一些线程通过 IPC 进行通信。
(不同浏览器架构中的进程/线程)
这里需要注意重要的一点是不同的架构实现细节,这没有一个规范标准来确定如何构建一个 web 浏览器,一个浏览器的实现和其它的可能不相同。
在这个系列博客中,使用 Chrome 最新描述的架构,如下图:
(Chrome 多进程架构,每个 tab 都运行着多个渲染进程)
顶部是浏览器进程,它负责应用程序的其它部分之间的协调。对于渲染进程,创建多个进程分配给每个 tab。直到最近,Chrome 给每个 tab 一个进程,现在它尝试给每一个网站分配一个进程,包括 iframe(查看网站隔离)
进程控制了什么
下面这个表格介绍了每个 Chrome 进程 及其控制的内容:
进程 | 描述 |
---|---|
Browser | 控制“Chrome”中的应用包括地址栏,书签,前进回退按钮,也会处理无法显示,web 浏览器权限,网络请求,文件访问 |
Renderer | 控制每个网站 tab 的显示 |
Plugin | 控制网站插件的使用,例如 flash 插件 |
GPU | 单独处理每个进程的 GPU 任务。由于GPU处理来自多个应用程序的请求并将它们绘制在同一表面上,因此将其分为不同的过程。 |
(浏览器UI不同部分的各自进程)
还有更多的流程,例如扩展进程和实用程序进程。如果要查看Chrome中正在运行多少个进程,请单击右上角的选项菜单图标 ,选择更多工具,然后选择任务管理器。这将打开一个窗口,其中列出了当前正在运行的进程以及它们正在使用多少 CPU 和内存。
Chrome 多进程架构的好处
之前,我提到Chrome使用多个渲染器进程。在最简单的情况下,您可以想象每个tab都有其自己的渲染器进程。假设您打开了3个标签,每个标签都由一个独立的渲染器进程运行。如果一个tab变得无响应,则可以关闭无响应的选项卡并继续运行,同时保持其他tab的活动状态。如果所有tab都在一个进程上运行,则当一个tab无响应时,所有tab将无响应。这是很让人头疼。、(每个tab运行一个进程)