原文见:https://developers.google.com/web/updates/2018/09/inside-browser-part1,本文有部分删改。
核心概念:CPU、GPU、进程、线程、架构、沙箱
架构:又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计
沙箱(沙盒):一种安全机制,为运行中的程序提供的隔离环境。沙箱通常严格控制其中的程序所能访问的资源。
没有关于如何构建 Web 浏览器的标准规范。 一种浏览器的方法可能与另一种完全不同。
一、浏览器架构
单进程+多线程
多进程+多线程
chrome浏览器最新架构(Chrome's recent architecture)
下面内容以chrome最新架构进行阐述。
二、主要的进程
Browser进程:控制浏览器地址栏、书签、返回/前进、也控制一些看不见的特权部分,比如网络请求和文件访问
Renderer进程:控制一个tab页中网站被显示的任何内容
Plugin进程:控制被网站使用的任何插件,例如flash
GPU进程:独立于其他进程处理 GPU 任务。 它被分成不同的进程,因为 GPU 处理来自多个应用程序的请求并将它们绘制在同一个表面上。
如果要查看具体有多少进程在运行可以通过在Chrome的"更多工具->任务管理器"中查看。
三、Chrome中多进程架构的优缺点
优点:
- 一个tab一个进程,当一个tab崩溃后,其他tab页仍然可以正常工作
- 安全和沙箱能力。因为操作系统提供了限制进程权限的方法,浏览器通过多进程架构可以把某些功能的某些进程提供隔离环境。比如,浏览器限制渲染进程(renderer)对任意文件的访问。
缺点:
- 会花费更多的内存。因为每个进程都有自己的内存空间,它们通常包含公共的基础设施(比如:V8 js引擎),如果它们都是线程就可以共享内存空间。为了节省内存,Chrome限制了它可以启动的进程数,但这个限制取决于硬件设备的内存和CPU能力。如果进程数达到了Chrome的限制,它就会采用同一站点的多个tab页共用一个进程的策略。
四、Chrome中的服务化-节省更多内存
同样的方法应用于浏览器进程。 Chrome 正在经历架构变化,以将浏览器程序的每个部分作为一项服务运行,从而可以轻松地拆分为不同的进程或聚合为一个进程。
一般的想法是,当 Chrome 在强大的硬件上运行时,它可能会将每个服务拆分为不同的进程以提供更高的稳定性,但如果它在资源受限的设备上,Chrome 会将服务合并到一个进程中以节省内存占用。 在此之前,已在 Android 等平台上使用了类似的方法来合并进程以减少内存使用量。
五、站点隔离-一个框一个渲染进程(Site Isolation-Per-frame renderer processes)
站点隔离是 Chrome 中最近引入的一项功能,它为每个跨站点 iframe 运行单独的渲染器进程。 我们一直在讨论每个选项卡模型一个渲染器进程,它允许跨站点 iframe 在单个渲染器进程中运行,并在不同站点之间共享内存空间。 在同一个渲染器进程中运行 a.com 和 b.com 似乎没问题。
同源策略是网络安全模型的核心; 它确保一个站点在未经同意的情况下无法访问其他站点的数据。绕过此策略是安全攻击的主要目的。进程隔离是分离站点的最有效方法。随着Meltdown and Spectre漏洞的出现,使用进程来分隔站点变得显而易见。自 Chrome 67 以来,桌面上默认启用站点隔离,选项卡中的每个跨站点 iframe 都有一个单独的渲染器进程。
站点隔离是一项多年工程成果。 站点隔离并不像分配不同的渲染器进程那么简单; 它从根本上改变了 iframe 相互通信的方式。 在不同进程上运行 iframe 的页面上打开 devtools 意味着 devtools 必须实现一些幕后工作以使其看起来无缝运行。 即使运行简单的 Ctrl+F 来查找页面中的单词也意味着在不同的渲染器进程中进行搜索。 可以看到浏览器工程师将 “站点隔离” 的发布称为重大里程碑的原因!
小结(Wrap-up)
在这篇文章中,我们涵盖了浏览器架构的高级视图,并涵盖了多进程架构的好处。 我们还介绍了与多进程架构密切相关的 Chrome 中的服务化和站点隔离。 在下一篇文章中,我们将开始深入探讨这些进程和线程之间为了显示网站而发生的事情。