Chrome架构:仅仅打开了一个页面,为什么有4个进程?
在理解进程和线程之前,先了解下并行处理,因为理解了并行处理的概念,再理解进程和线程之间的关系就轻松许多了。
什么是并行处理?
计算机中的并行处理就是同一时刻处理多个任务。使用并行处理能大大提升性能。
let a = 1+2 // 任务一
let b = 20/5 // 任务二
let c = 7*8 // 任务三
//任务四 显示计算结果
单线程:分四步,按照顺序分别执行四个任务
多线程:分两步,第一步使用的三个线程同时执行前三个任务,第二步执行任务四
线程和进程的关系
-
线程是不能单独存在的,它是由进程来启动和管理的。
-
一个进程就是一个程序的运行实例。启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
-
由图可知,线程是依附于进程,而进程中使用多线程并行处理能提高运算效率。
进程和线程之间的四个特点
-
进程中任意一个线程执行出错,都会导致整个进程的崩溃
-
线程之间共享进程中的数据
-
当一个进程关闭之后,操作系统会回收进程所占用的内存
-
进程至今啊的内容相互隔离
如果进程之间需要进行数据的通讯,需要使用用于进程间通信(IPC)的机制。
单进程浏览器时代
顾名思义,单进程浏览器是指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JavaScript运行环境、渲染引擎和页面等。
导致问题的出现:
- 不稳定
最容易出问题的是插件和渲染引擎模块,其中一个出现意外崩溃,会导致整个浏览器的崩溃。 - 不流畅
function freeze() {
while (1) {
console.log("freeze");
}
}
freeze();
不好的脚本或插件的使用,会让单进程浏览器变卡顿,页面的内存泄露也是单进程变慢的重要原因。
3. 不安全
使用C/C++等代码编写,可以通过插件来获取操作系统的任意资源,意味着这些插件可以完成操作你的电脑;也可以使用页面脚本通过浏览器漏洞获取系统权限,对你的电脑做一下恶意的事情,引起安全问题。
多进程浏览器时代
- 早期多进程架构
由图可见,页面时运行在单独的渲染进程中的,页面的插件也是运行在单独的插件进程中,进程之间通过IPC机制通信。
不稳定问题解决:进程是相互隔离的,当页面或插件崩溃时,影响的仅仅时当前页面进程或插件进程,并不会影响到浏览器或其他页面
不流畅问题解决:javaScript运行在渲染进程中,即使当javaScript的脚本阻塞了渲染进程,影响到的也只是当前的渲染页面,并不会影响到浏览器或其他页面。内存泄漏问题就更简单了,关闭一个页面时,渲染进程也会被关闭,进程所占用的内存也会被系统回收。
不安全问题解决:使用安全沙箱,沙箱里面运行的程序不能随意的在硬盘上写入数据,也不能在敏感位置读取数据,把插件和渲染进程锁在沙箱里运行,恶意程序也无法获取系统 权限了。
- 目前多进程架构
由图可知,最新的Chrome浏览器包括:一个浏览器(Browser)主进程、一个GPU进程、一个网络(NetWork)进程、多个渲染进程和多个插件进程。
- 浏览器进程。主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
- 渲染进程。核心任务是将HTML、CSS和JavaScript转换为用户可以与之交互的网页,排版引擎Blink和JavaScript引擎V8都是运行在该进程中,默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
- GPU进程。Chrome刚发布时并没有GPU进程,而GPU使用的初衷是为了实现3D CSS的效果,只是后面随着页面和Chrome的UI界面都采用了GPU进程,使得GPU成为浏览器普遍的需求。最后Chrome在其多进程架构上引入了GPU进程。
- 网络进程。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。
- 插件进程。主要负责插件的运行,因插件容易崩溃,所以需要通过插件进程来隔离,保证插件进程崩溃不会对浏览器和页面造成影响。
看到这里就可以回到开头提到的问题了:仅仅打开一个也页面,为什么有4个进程?因为一个页面至少需要一个网络进程、一个浏览器进程、一个渲染进程、一个GPU进程,共四个;如果打开的页面有运行插件的话,还需要加上一个插件进程。
不过凡是有两面性,多进程模型提升了浏览器的稳定性、流畅性和安全性,不免带来一些问题:
- 更高的资源占用。因为每个进程都会包含公共基础结构的副本(如JavaScript运行环境),这就意味着浏览器会消耗更多的内存资源。
- 更复杂的体系架构。浏览器各模块之间耦合性高、拓展性差等问题,会导致现在的架构已经很难适应新的需求了。
最初的浏览器都是单进程的,它们不稳定、不流畅且不安全,之后出现了 Chrome,创造性地引入了多进程架构,并解决了这些遗留问题。随后 Chrome 试图应用到更多业务场景,如移动设备、VR、视频等,为了支持这些场景,Chrome 的架构体系变得越来越复杂,这种架构的复杂性倒逼 Chrome 开发团队必须进行架构的重构,最终 Chrome 团队选择了面向服务架构(SOA)形式,这也是 Chrome 团队现阶段的一个主要任务。
参考:
极客时间-《浏览器工作原理与实践》