在 Chorme Developer 上无意之中翻到了这个系列,作者描写的很清楚,并且配图十分的优秀,推荐阅读(阅读的时候需要注意这篇博客发布的时候是 2018 年 9 月,有些东西可能对于现在来说有一些过时了)。这是这个系列博客的第一部分,主要是研究浏览器架构。CPU 和 GPU 在这里就不谈了,你可以去原文查看。
在进程和线程上执行程序
在深入浏览器之前,我们需要掌握进程和线程的概念。一个进程可以看成一个应用的执行程序,而线程是存在于进程内部来执行任意部分程序的。
启动应用时,将会创建一个进程。这个进程会创建一个或多个线程来帮助它进行工作,但这不是必须的。操作系统为进程提供了一个内存块,所有进程的状态都保存在这个专用的内存空间中,当你关闭应用的时候,进程也会随之消失,操作系统就会释放内存。
一个进程可以让操作系统启动另一个进程来运行其他任务。这样操作系统会为新的进程分配新的内存。如果这两个进程需要对话,则可以用 IPC (进程间通信) 来实现。许多程序被设计成多进程就是因为如果其中一个进程未响应的时候,它可以进行重启而不会影响到应用的其他进程。
浏览器架构
了解了上面的知识,那我们如何使用进程和线程来构建浏览器应用呢?它可以是一个具有多线程的进程的架构,也可以是多个进程通过 IPC 进行通信的架构。
需要注意的是不同的架构属于实现细节,关于浏览器的构建并没有一个标准,两个浏览器可能使用的架构方式可能会不一样。
这个系列里,会使用如下图的 Chrome 最新架构方式。
最上面是浏览器进程,负责协调调度其他进程。对于渲染进程,会创建多个进程来分配给每一个标签页。直到最近,Chrome 才尽可能的为每个标签页分配一个进程。现在,Chrome 尝试给每个站点分配自己的进程,包括 iframe 的。
每个进程控制什么?
下面介绍了每个进程以及它控制的地方:
进程 | 负责 |
---|---|
Browser | 负责处理属于 Chrome 的部分,比如地址栏、书签、前进后退按钮等等,以及一些看不见的需要权限的部分,比如网络请求、文件访问 |
Renderer | 负责处理标签页内的显示工作 |
Plugin | 负责处理网站用到的所有插件,比如 Flash |
GPU | 被分离出来独立处理 GPU 任务,由于 GPU 会处理来自不同应用的请求,绘制到同一个地方,所以将它单独拆出来 |
除了这些,还有其他进程,比如扩展进程、实用程序进程。如果你想看看你的 Chrome 里有多少进程,可以点击右上角选择更多工具,然后选择任务管理器,这时候你就能够看到当前运行的进程了。
多进程架构的好处
上面提到 Chrome 使用多个渲染进程。想象这么一个场景,每个标签页都有自己的进程。比如你打开了三个标签页,那么每个标签页都对应着一个进程,当其中一个不响应了,你可以关闭它,其他的标签页都是正常的。如果三个都在一个进程中,那一个不响应,三个都会挂掉。
把浏览器的工作分成多个进程的另一个好处就是安全性和沙箱。由于操作系统提供了一种限制进程权限的方法,浏览器就可以在某些进程上对这些功能进行限制。比如,Chrome 会限制可以接收任意用户输入的渲染进程对任意文件的访问。
由于进程的内存是隔离的,所以这些进程都会保存一份基础架构的副本,比如 V8 引擎。这意味着会浪费更多的内存,因为无法共享它们。为了节省内存,Chrome 对开启的进程数做了限制,这个限制取决于你的电脑性能,当到达限制后,Chrome 会在一个进程内运行来自同一个网站的多个标签页。
节省更多内存 – Chrome Servicification
将相同的方法应用到浏览器上,Chrome 将浏览器的每个部分作为服务来运行,以便可以轻松的分解或者是合并。
通常的想法是,当 Chrome 运行在性能强悍的计算机上时,把服务拆分成不同的进程,从而达到更高的稳定性,但是如果计算机的性能不好的时候,Chrome 会将服务合并成一个进程以节省内存占用。
站点隔离
站点隔离是 Chrome 最近的一个功能,为每一个跨站的 iframe 单独运行一个渲染进程。我们刚刚一直讨论的是为每个标签页启动一个进程的模式,这个进程允许跨站 iframe 在渲染进程中执行并在不同站之间共享内存。在相同的进程上运行 a.com 和 b.com 似乎看起来是可以的。但是同源策略是 Web 的核心安全策略,这样可以保证一个站点未经同意就不能访问其他站点的数据。这样一来绕过这个安全策略就是安全攻击的主要目标。而进程隔离是分割站点最有效的办法。随着 Meltdown and Spectre 漏洞的公开,我们更加需要使用进程来隔离站点了。自 Chrome 67 以来在桌面版默认启用了站点隔离,选项卡中的每个跨站 iframe 都会启动一个单独的渲染进程。
为了启用站点隔离,花费了多年时间去研究,它不像分配不同的渲染进程这么简单。它从根本上改变了 iframes 之间的对话方式。在运行着不同站点 iframe 的页面上打开 DevTools 意味着,DevTools 必须要在后台让它看起来是无缝的。即便是运行 Ctrl + F
来进行搜索,也意味着要在不同的进程中进行所有,这就是浏览器工程师将站点隔离的发布作为重要里程碑的原因。
PS: 上传文章,发现有些动图上传失败了,为了更好的阅读体验,欢迎到公众号查看文章,后续还会有接下来的三篇。
欢迎关注、转发、分享支持我。