[浏览器]现代浏览器与进程

535 阅读6分钟

最近想重新系统地整理一下前端的知识,因此写了这个专栏。我会尽量写一些业务相关的小技巧和前端知识中的重点内容,核心思想。

前言

浏览器是每一位前端开发者的开发武器,了解浏览器,不仅可以帮助我们更好地理解前端工作,还会为我们在技术优化的层面上提供更多的角度。注意本文讲述的浏览器默认指的是chrome。

进程与线程

进程就是一个程序的运行实例。当我们启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,这样的一个运行环境就是【进程】。

而【线程】则是由进程启动和管理的任务执行环境,因此他们的关系应该是一个进程对应多个线程。

多线程的作用

之所以会有线程这个东西,是因为我们的进程执行任务时需要把任务分成多个同时进行,也就是我们说的【并行处理】。

举个例子:

var a = 1+1;
var b = 2+2;
var c = 3+3;
var d = a+b+c;

以上代码如果由单线程执行,会线性的先依次算出a,b,c。再把他们相加得出d。而并行执行可以让我们由3个线程同时计算a,b,c。最后得出d。本来4个的步骤,可以缩减成2个。

进程与线程的关系

要注意进程与线程之间有下面的规则:

  1. 进程中的任意一线程执行出错,都会导致整个进程的崩溃。
  2. 线程之间共享进程中的数据。
  3. 当一个进程关闭之后,操作系统会回收进程所占用的内存。
  4. 进程之间的内容相互隔离。

浏览器与进程

既然进程是一个应用的运行环境,那是不是说我们启动浏览器时,就只会启动一个“浏览器进程”呢?不完全错,因为早期的浏览器确实是单进程的。

在早期(2007年以前),市面上的浏览器都是单进程的,所有的功能模块都在一个进程里进行。这就导致了浏览器很多问题,不同任务之前阻塞,插件会大规模地影响我们的页面等。这也是浏览器崩溃的原因。

幸运的是现在的浏览器都采用了多进程的架构。这样就带来了不少的优化:

  1. 由于多个进程之间相互隔离,当一个其中一个进程崩溃时,并不会影响到其他(最常见的场景就是页面被插件玩挂或者页面A崩溃影响到页面B)。从而避免了由某一功能导致整个浏览崩溃的情况发生。
  2. 当某个进程关闭后会马上回收他的内存,这样就会不发生以前的浏览器开着占用内存越来越多的内存泄露悲剧。
  3. 浏览器作为一个程序本身是可以与操作系统交互的,因此在单进程时代,一些恶意插件是可以通过漏洞访问到我们的计算机的,这是极大的安全问题。而采用多进程架构之后,浏览器的每个进程都运行在【安全沙箱】里,插件无法再访问我们的计算机了。

那么浏览器究竟有多少个进程?

既然现在浏览器是多进程架构的,那他一共有多少个进程呢?答案是根据使用情况而定。但我们举个最简单的例子,一个干净的浏览器(没有安装任何插件)打开一个页面。会有4个进程:

浏览器进程浏览器的主进程,负责界面显示、用户交互、子进程管理,同时提供存储等功能。
渲染进程页面渲染的核心进程,负责将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中。渲染进程都是运行在沙箱模式下,确保安全。
GPU 进程Chrome 刚开始发布的时候是没有 GPU 进程的。最早 GPU 只是为了实现 3D CSS 的效果,但后来网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。因此引入了 GPU 进程。
网络进程负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。

如果使用了插件,就会有插件进程:

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

当然还要强调的是,每当我们打开一个新的页面tab,会新创建一个渲染进程。这样不同的页面之间就实现了进程隔离。因此,如果我们用浏览器打开了2个页面,并运行了一个插件,实际上我们在跑的进程有6个——浏览器进程,GPU进程,网络进程,插件进程和2个渲染进程。

“同一站点”的情况

上面我们说到,浏览器每打开一个新的页面,都会创建一个新的渲染进程。但实际上存在着一种特殊请况。就是“同一站点”。

“同一站点”指协议和根域名相同的情况,如下列例子:

https://video.xxx.com
https://picture.xxx.com
https://picture.xxx.com:8000
// 以上3个url都属于同一站点。

假如我们打开一个新页面的时候,浏览器判断认为新页面B与原有的某个页面A是同一站点,就不会创建新的渲染进程,而是复用页面A的渲染进程。

未来的浏览器

虽然多进程架构的浏览器带来了很多好处,但同时带来了不少问题:

  • 更高的资源占用。多个进程中难免会包含一些公共基础结构的副本,这部分的内存资源实际上是无谓的。
  • 更复杂的体系架构。浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了。

为了解决这些问题,在 2016 年,Chrome 官方团队使用“面向服务的架构”(Services Oriented Architecture,简称 SOA)的思想设计了新的 Chrome 架构。这是一个整个架构被重构的方案,有兴趣的朋友可以自行查阅了解。可以肯定的是,每一代新架构的浏览器都对web行业有着“工业革命”般的影响。

总结

今天我们了解进程与线程的关系,以及当代浏览器的进程架构。希望可以帮助大家对浏览器有进一步的了解。