前端知识框架构建二:浏览器的架构

210 阅读4分钟

单进程浏览器

什么是单进程浏览器,就是指所有的功能模块都运行在同一个进程里的浏览器(网络,插件,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 进程。
  • **网络进程:**主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程
  • **插件进程:**主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a96b50f0552d4bf1b503207decd714ec~tplv-k3u1fbpfcp-zoom-1.image

总结

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