众所周知,浏览器是多进程架构,如下图,打开一个标签Chrome启动了五个进程。
1. 什么是进程和线程
进程:一个进程就是一个程序的运行实例,当启动一个程序时,系统会为该程序创建一块内存,用来存放程序依赖的代码、运行数据和一个执行任务的主线程,可以把这些看做是一个环境即进程。
线程:线程无法独立存在,需要依附于一个进程,一个进程可以存在多个线程,提高计算效率。
图片获取于网络非作者原创
补充:
-
如果进程中的任何一个线程出现错误,则会导致整个进程崩溃。
-
同一个进程中的线程之间可以数据共享(对进程的公共数据进行读写)。
-
关闭进程后,系统会回收掉该进程所占用的内存。
-
进程之间的内容虽然是相互隔离的,但是它们之间可以进行通讯。
2. 浏览器告别单进程
单进程浏览器是指浏览器的所有的程序功能都在同一个进程中运行,这也是导致单进程浏览器不稳定,不流畅,不安全的一个主导因素。而多进程浏览器则很大程度避免了这些问题。
- 单进程一旦出错(多方面,页面、插件等等),就会导致整个浏览器崩溃,而多进程架构中,每个进程相互隔离,某一进程崩溃,并不影响其他进程,从而保证了稳定性。
- 单进程浏览器中,所有的功能模块都执行在同一个线程中,这意味着每一个同一时刻只能执行一个模块,其他模块处于等待排队中。假如一个程序处于无限循环的状态,想想都崩溃。在多进程中,每个进程各司其职,并行处理(这也是一个概念,有兴趣可以自行去翻翻资料),关闭某个进程,内存也会得到释放,从而保证了流畅性。
- 单进程浏览器不安全的因素在于,页面中运行一个插件时,这个插件能完全操作整个浏览器,如果是一个恶意插件,后果可想而知。多进程架构使用了安全沙箱,可以看作操作系统给进程上了一把锁,程序可以在沙箱里面运行,但不允许在硬盘上写入数据,也不能读取敏感位置的数据,即使有恶意程序,也无法突破沙箱壁垒,从而保证了安全性。
3. 目前的多进程架构
- **浏览器进程:**主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
- **渲染进程:**核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
- GPU 进程:其实,Chrome 刚开始发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了GPU 进程。
- **网络进程:**主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。插件进程。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。