什么是「Chrome 基本架构」?

为什么要了解 Chrome 架构

开发者不管是想要设计高性能的 Web 应用,还是想要对当前的 Web 应用进行优化,都需要开发者了解浏览器中的网络流传、页面渲染过程、JavaScript 执行流程以及 Web 安全理论等等。这些知识较为分散,而学习浏览器的架构后,能够更容易讲将这些分散的知识点整体连接起来。

线程与进程

打开 Chrome 浏览器,选中右上角「自定义及控制」,找到「更多工具-任务管理器」。浏览器中的任务管理器展示了 Chrome 中正在使用的进程。我们现在仅仅打开空白标签页面,但是却能够发现进程不止一个。

要弄清楚这个现象,我们首先需要再了解进程和线程的概念。

  • 线程:线程是操作系统中能够进行运算调度的最小单位。
  • 进程:一个进程是一个程序的运行实例。

单线程与多线程

为了更好理解线程与进程的概念与关系,我们首先需要了解一下单线程与多线程。

当有多个任务要分开执行时,由于单线程只有一个运算单位,因此这多个任务只能挨个执行,即串行执行。

但是如果这里的多个任务,相互独立,那么我们可以用若干个单线程(也就是多线程)来分配任务的执行,即使用多线程同时执行,即并行执行。

对比分析我们发现,相比于串行执行(单线程),并行执行(多线程)能大大提升性能。

线程与进程

尽管多线程可以并行处理任务,但是线程本身是不能单独存在的:线程依托于进程,由进程来启动和管理。

前面提到,一个进程就是⼀个程序的运⾏实例。我们这么来理解,当我们启动⼀个程序的时候,操作系统会为该程序创建⼀块内存,⽤来存放代码、运⾏数据和⼀个执⾏任务的主线程,这里的运⾏环境就叫做进程。

而进程中使用单线程还是多线程处理,就取决于具体的进程环境。

线程与进程有下列四个特点:

  1. 进程中的任意线程执⾏出错,都会导致整个进程的崩溃。

这就类似于 SQL 中的「事务」。

  1. 线程之间能够共享进程中的数据。
  2. 当⼀个进程关闭之后,操作系统会回收进程所占⽤的内存。
  3. 进程之间的内容相互隔离。

不同时代的浏览器

单进程浏览器时代

单进程浏览器指的是浏览器的所有功能模块都运行在同一个进程。这些模块就包含了网络、插件和 JavaScript 运行环境等等。具体来说,单进程浏览器的单个进程中包含了「页面线程」、「网络线程」和「其他线程」三大内容。其中,「页面线程」则包括了页面渲染、页面展现等等模块。

如此多的功能模块运⾏在⼀个进程⾥,就容易导致单进程浏览器不稳定、不流畅以及不安全:

  1. 不稳定

早期浏览器需要借助于插件来实现诸如 Web 视频、Web 游戏等各种强⼤的功能。而插件本身,就是最容易出现问题的部分。前面提到过,进程中的一个线程崩溃,就会导致整个进程崩溃。

除了插件之外,渲染引擎模块也是不稳定的。渲染一些复杂的 JavaScript 代码也十分可能引起渲染引擎模块的崩溃。

  1. 不流畅

浏览器中的许多模块都放在了「页面线程」这一个线程中,这就意味着同一时刻只能有一个模块可以执行。

假如浏览器运行了一个无限循环的脚本,那么它会独占整个「页面线程」,将导致其他的功能模块没有机会被执⾏。从而导致整个浏览器变卡顿或者直接失去响应。

  1. 不安全

关于单进程浏览器的不安全,可以从插件和脚本来解释:

(1)通过插件可以获取到操作系统的任意资源,当你在页面运⾏⼀个插件时也就意味着这个插件能完全操作你的电脑。如果是个恶意插件,那么它就可以释放病毒、窃取你的账号密码,引发安全性问题。

(2)脚本文件则可以通过浏览器的漏洞来获取系统权限,这些脚本获取系统权限之后也可以对你的电脑做 ⼀些恶意的事情,同样也会引发安全问题。

多进程浏览器时代

多进程浏览器针对单进程浏览器中容易出现的问题,做出了很多的修改。简单而言,多进程浏览器主要包含了下列三个进程:

  1. 插件进程
  2. 渲染进程

渲染进程运行在沙箱中,不能读写硬盘上的数据,不能获取操作系统权限。

  1. 浏览器主进程

有了三个独立的进程,Chrome 页面则运行在单独的渲染进程,页面的插件运行在单独的插件进程,浏览器主进程则负责下载资源,管理 IPC(进程间通信)等等。

我们来看看多进程浏览器的上述三个主要进程,是如何解决单进程浏览器中的问题的:

  1. 稳定问题

由于进程是相互隔离的,所以当⼀个⻚⾯或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面,这就完美地解决了⻚⾯或者插件的崩溃会导致整个浏览器崩溃,也就是不稳定的问题。

  1. 流畅问题

JavaScript 也是运⾏在渲染进程中的,所以即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面,因为其他页面的脚本是运行在它们自己的渲染进程中的。所以当我们再在 Chrome 中运行上面那个死循环的脚本时, 没有响应的仅仅是当前的⻚⾯。

  1. 安全问题

采⽤多进程架构的额外好处是可以使⽤安全沙箱,你可以把沙箱看成是操作系统给进程上了⼀把锁,沙箱中的程序可以运行,但是不能在你的硬盘上写⼊任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌⾯。Chrome 把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也⽆法突破沙箱去获取系统权限。

当前的 Chrome 进程架构

当前的 Chrome 进程架构包括下面 5 个进程:

  1. 浏览器主进程

主要负责界面显示、用户交互、⼦进程管理,同时提供存储等功能。

  1. 渲染进程

核⼼任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎和 JavaScript 引擎 V8 都是运⾏在该进程中。默认情况下,Chrome 会为每个标签页创建⼀个渲染进程。出于安全考虑,渲染进程都是运⾏在沙箱模式下。

  1. GPU 进程

GPU 的使用初衷是为了实现 3D CSS 效果。网页和 Chrome UI 都选择了采用 GPU 来绘制,这使得 GPU 成为浏览器更加普遍的需求。

  1. 网络进程

负责页面中网络资源的加载。

  1. 插件进程

主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃 不会对浏览器和页面造成影响。

了解了现在的 Chrome 架构,我们便了解了为什么只打开了一个标签页,但是却有多个进程。

虽然多进程模型提升了浏览器的稳定性、流畅性和安全性,但同样不可避免地带来了 ⼀些问题:

  1. 更高的资源占⽤。因为每个进程都会包含公共基础结构的副本(如 JavaScript 运⾏环境),这就意味着浏览器会消耗更多的内存资源。
  2. 更复杂的体系架构。浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享