Chrome架构:仅仅打开了1个页面,为什么有4个进程?( 三 )


Chrome架构:仅仅打开了1个页面,为什么有4个进程?

文章插图
 
早期 Chrome 进程架构图
从图中可以看出,Chrome 的页面是运行在单独的渲染进程中的,同时页面里的插件也是运行在单独的插件进程之中,而进程之间是通过 IPC 机制进行通信(如图中虚线部分) 。
我们先看看如何解决不稳定的问题 。由于进程是相互隔离的,所以当一个页面或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面,这就完美地解决了页面或者插件的崩溃会导致整个浏览器崩溃,也就是不稳定的问题 。
【Chrome架构:仅仅打开了1个页面,为什么有4个进程?】接下来再来看看不流畅的问题是如何解决的 。同样,JavaScript 也是运行在渲染进程中的,所以即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面,因为其他页面的脚本是运行在它们自己的渲染进程中的 。所以当我们再在 Chrome 中运行上面那个死循环的脚本时,没有响应的仅仅是当前的页面 。
对于内存泄漏的解决方法那就更简单了,因为当关闭一个页面时,整个渲染进程也会被关闭,之后该进程所占用的内存都会被系统回收,这样就轻松解决了浏览器页面的内存泄漏问题 。
最后我们再来看看上面的两个安全问题是怎么解决的 。采用多进程架构的额外好处是可以使用安全沙箱,你可以把沙箱看成是操作系统给进程上了一把锁,沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌面 。Chrome 把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限 。
好了,分析完早期的 Chrome 浏览器后,相信你已经了解了浏览器采用多进程架构的必要性 。
目前多进程架构不过 Chrome 的发展是滚滚向前的,相较之前,目前的架构又有了很多新的变化 。我们先看看最新的 Chrome 进程架构,你可以参考下图:
Chrome架构:仅仅打开了1个页面,为什么有4个进程?

文章插图
 
最新的 Chrome 进程架构图
从图中可以看出,最新的 Chrome 浏览器包括:1 个浏览器(Browser)主进程、1 个 GPU 进程、1 个网络(NetWork)进程、多个渲染进程和多个插件进程 。
下面我们来逐个分析下这几个进程的功能 。
  • 浏览器进程 。主要负责界面显示、用户交互、子进程管理,同时提供存储等功能 。
  • 渲染进程 。核心任务是将 html、css 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程 。出于安全考虑,渲染进程都是运行在沙箱模式下 。
  • GPU 进程 。其实,Chrome 刚开始发布的时候是没有 GPU 进程的 。而 GPU 的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求 。最后,Chrome 在其多进程架构上也引入了 GPU 进程 。
  • 网络进程 。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程 。
  • 插件进程 。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响 。
讲到这里,现在你应该就可以回答文章开头提到的问题了:仅仅打开了 1 个页面,为什么有 4 个进程?因为打开 1 个页面至少需要 1 个网络进程、1 个浏览器进程、1 个 GPU 进程以及 1 个渲染进程,共 4 个;如果打开的页面有运行插件的话,还需要再加上 1 个插件进程 。
不过凡事都有两面性,虽然多进程模型提升了浏览器的稳定性、流畅性和安全性,但同样不可避免地带来了一些问题:
  • 更高的资源占用 。因为每个进程都会包含公共基础结构的副本(如 JavaScript 运行环境),这就意味着浏览器会消耗更多的内存资源 。
  • 更复杂的体系架构 。浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了 。
对于上面这两个问题,Chrome 团队一直在寻求一种弹性方案,既可以解决资源占用高的问题,也可以解决复杂的体系架构的问题 。
未来面向服务的架构为了解决这些问题,在 2016 年,Chrome 官方团队使用“面向服务的架构”(Services Oriented Architecture,简称SOA)的思想设计了新的 Chrome 架构 。也就是说 Chrome 整体架构会朝向现代操作系统所采用的“面向服务的架构” 方向发展,原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标 。如果你对面向服务的架构感兴趣,你可以去网上搜索下资料,这里就不过多介绍了 。


推荐阅读