单进程浏览器
什么是单进程浏览器,就是指所有的功能模块都运行在同一个进程里的浏览器(网络,插件,JS运行环境等模块)
在2007年以前,都是单进程浏览器。
但这会导致一些问题
1. 不稳定
当只有一个进程,所有线程都是一个进程中的时候,就会出现当一个线程崩了的时候,比如说一个插件崩了的时候,整个浏览器都会崩掉。
2. 不流畅
当只有一个进程的时候,很多个模块都会被放在同一个线程里面,比如负责页面渲染的渲染线程,负责网络请求的网络线程,都会放在同一个线程中,所以当执行的时候,如果网络请求10s,那么页面的渲染就要等待网络请求结束了,才渲染,就会造成卡顿,不流畅的现象。
3. 不安全
一些C/C++的插件可以获取到操作系统的资源,修改操作系统的资源,也就是以前的浏览器病毒。
多进程浏览器
多进程浏览器就是现在的这种浏览器,像Google浏览器,每一个Tab都是一个单独的进程,整个浏览器里面有很多不同的进程,而进程间是通过IPC机制进行的通信。
我们先看看如何解决不稳定的问题。由于进程是相互隔离的,所以当一个页面或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面,这就完美地解决了页面或者插件的崩溃会导致整个浏览器崩溃,也就是不稳定的问题。
接下来再来看看不流畅的问题是如何解决的。同样,JavaScript 也是运行在渲染进程中的,所以即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面,因为其他页面的脚本是运行在它们自己的渲染进程中的。所以当一个页面崩了,崩得不是整个浏览器,而是那个单独的tab。
**最后我们再来看看上面的两个安全问题是怎么解决的。**采用多进程架构的额外好处是可以使用安全沙箱,你可以把沙箱看成是操作系统给进程上了一把锁,沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌面。Chrome 把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限。
常见的浏览器进程
- 浏览器进程:主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
- 渲染进程:核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
- **GPU 进程:**其实,Chrome 刚开始发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求。最后,Chrome 在其多进程架构上也引入了 GPU 进程。
- **网络进程:**主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程
- **插件进程:**主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。

总结
最初的浏览器都是单进程的,它们不稳定、不流畅且不安全,之后出现了 Chrome,创造性地引入了多进程架构,并解决了这些遗留问题。随后 Chrome 试图应用到更多业务场景,如移动设备、VR、视频等,为了支持这些场景,Chrome 的架构体系变得越来越复杂。