单进程浏览器和多进程浏览器

1,082 阅读5分钟

在了解了进程和线程的基础知识之后,继续进行浏览器的相关部分知识,单进程浏览器和多进程浏览器。

单进程浏览器

在2008年谷歌发布Chrome多进程浏览器之前,市面上几乎所有浏览器都是单进程的,他们将所有功能模块都运行在同一个进程中,其架构示意图如下图所示:

_单进程浏览器 (2).png

从图上可以看出,指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JS引擎和页面等。 如此多的功能模块运行在一个进程里,是导致单进程存在重大隐患的关键因素。

重大隐患:

  • 稳定性

    由于所有模块都运行在同一个进程中,对于一些复杂的js代码或者死循环代码,如果页面渲染引擎崩溃,就会导致整个浏览器崩溃。同样,各种不稳定的第三方插件,也是导致浏览崩溃的隐患。

  • 安全性

    由于插件的存在,某些恶意脚本会利用浏览器漏洞来获取系统权限,进而引发安全问题。

  • 流畅性

    由于很多模块都运行在同一个线程中,如js引擎、页面渲染及插件等,那么执行某个循环任务的模块就会阻塞其他模块的任务执行,这样难免会有卡顿的现象发生。

多进程浏览器

Chrome推出了多进程浏览器架构,将原本揉到一起的各个模块根据职责的不同分拆了出去,极大的减轻了单进程的执行负担,其架构示意图如下图所示:

_多进程浏览器 (1).png

根据如上所示,主要分为以下进程:

  1. 浏览器主进程

    整个浏览器的主要进程。 一个浏览器只有一个主进程,负责如菜单栏、标题栏等界面显示,文件访问,前进后退以及子进程管理等。

  2. GPU进程

    处理GPU渲染方面的任务。GPU(图形处理单元)最初是为了实现3D的CSS效果而引入的,后来随着网页及浏览器在界面中的使用需求越来越普遍,Chrome便在架构加入了GPU线程。

  3. 插件进程

    主要负责插件的运行。主进程会为每个加入浏览器的插件开辟独立的子进程,由于进程间所分配的运行资源相对独立,所以即便某个插件进程意外崩溃,也不至于对浏览器和页面造成影响。另外,出于对安全因素的考虑,这里采用了沙箱模式,在沙箱中的运行的程序收到一些限制:不能读取敏感位置的数据,也不能在硬盘上写入数据。这样即使插件运行了恶意脚本,也无法获取系统权限。

  4. 网络进程

    负责页面上的网络资源加载。之前属于浏览器主进程的一个模块,最近才独立出来。

  5. 渲染进程

    负责页面的渲染。也称为浏览器内核,它默认会为每个标签窗口也开辟一个独立的渲染进程,负责将HTML、CSS、和JavaScript等资源转为可交互的页面,其中包含多个子线程,即JS引擎线程、GUI渲染线程、事件触发线程、定时器触发线程、异步HTTP请求线程等。当打开一个标签页输入URL后,所发起的网络请求就是从这个进程开始的。另外,出于对安全性的考虑,渲染进程也被放入沙箱中

  6. AudioService进程

    用来处理音频。由于将浏览器进程于音频驱动程序故障隔离,从而提高了浏览器稳定性。其次,是音频处理逻辑能够在音频处理过程中运行,即离硬件更近,并且尽可能不讲音频缓冲区传递给渲染进程,这意味着具有更稳定的音频路径延迟和更好的性能。

  7. StorageService进程

    用于处理本地存储的运行,包括Storage、Cache等。

当我们打开浏览器的时候,默认会启动浏览器的主进程,展示整个浏览器窗口和地址栏等一系列的基础UI界面。之后主进程启动其他的子进程。如果需要运行插件的时候,就给对应的插件分配一个进程,如果没有插件就不分配。

当我们打开一个Tab标签页的时候,浏览器会根据这个标签页创建一个渲染进程,用于标签页内页面的渲染和执行。 如果页面中使用了WebGL或者CSS3动画之类的需要GPU进行渲染的东西,Chrome就会创建一个CPU进程来维护这些渲染任务。

HTML页面、JS脚本等需要从服务器下载到本地才能被渲染进程解析执行渲染,所以浏览器又会分配一个网络进程处理网络资源下载的任务。这样,多进程的架构就基本呈现出来了。

  1. 渲染进程和插件进程都是运行在沙箱内部的,哪怕存在恶意脚本被执行了,也无法获取系统权限,访问系统资源。

  2. 其他各个进程都是由浏览器主进程启动和管理的,进程间通过IPC进行数据通信。 image.png

  3. 渲染进程和插件进程可能不止一个,根据要渲染的页面和插件数而定。

    一个浏览器进程 + 1个GPU进程 + 1个网络进程 + 1个?渲染进程 + 多个插件进程 + StorageService,至少有6个进程启动: 浏览器主进程、GPU进程、NetworkService、当前标签页渲染进程、插件进程、StorageService。 如果有音视频场景的话 还需加载 AudioService场景。

参考