01-Chrome架构

143 阅读6分钟

Chrome架构

提出问题:仅仅打开一个页面,为什么有4个进程

进程和线程

理解进程线程之前,需要先了解一下并行处理

并行处理

计算机中的并行处理就是同一时刻处理多个任务

也就是多线程处理,这会大大加快处理性能

线程与进程

线程是不能单独存在的,它是由进程来启动和管理的

启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程

也就是说,线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率

进程与线程关系.png

并且,这里总结进程与线程关系的4个特点:

  • 进程中的任意线程执行出错,都会导致整个进程崩溃
  • 线程之间共享进程中的数据
  • 当一个进程关闭后,操作系统会回收进程所占用的内存
  • 进程之间内容相互隔离,不会互相产生影响

单进程浏览器时代

其实在2007年之前,市场上的浏览器都是单进程的,也就是所有功能模块都运行在一个进程中,单进程的架构如图:

单进程浏览器架构.png 这种架构有很多缺点:

  • 不稳定

    早期的浏览器需要借助于插件来实现像Web视频、游戏等功能,但是插件很容易出现问题,并且还运行在浏览器进程中,所以一旦一个插件崩溃就会引起整个浏览器的崩溃,还有渲染引擎模块,一些复杂的JS代码可能导致该模块崩溃,同样导致浏览器崩溃

  • 不流畅

    由于所有模块都是运行在一个线程中的,所以如果这时候有一个无限循环的脚本运行在浏览器中,那么就会占据整个线程,导致其他模块没有机会执行,引起整个浏览器失去响应,变卡顿,除了脚本让浏览器卡顿,页面的内存泄漏也是单进程变慢的重要原因

  • 不安全

    插件可以使用C等语言编写,所以可以获取操作系统下的任意资源,在一个页面运行插件时,也就意味着这个插件能够完全操作你的电脑

多进程浏览器时代

早期多进程架构

早期浏览器架构.png 这是谷歌2008年发布的进程架构,这个架构将插件和渲染两个功能模块运行在单独的进程中,而进程间通过IPC机制进行通信

这个架构能够解决上面的三个单进程存在问题:

  • 稳定进程相互隔离,假如一个插件崩溃了,影响到的仅仅是当前插件的进程,并不会影响到其他进程
  • 流畅:JS运行在渲染进程中,即使JS阻塞了渲染进程,也不会导致整个浏览器的崩溃,影响的只是当前的页面
  • 安全使用了安全沙箱,沙箱里面的程序可以运行,但是不能在硬盘上写入任何数据,也不能在敏感位置读取任何数据,这样恶意程序就不能通过插件获取系统权限了

目前多进程架构

目前多进程架构.png

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

所以这里我们可以回答这个问题:仅仅打开了一个页面,为什么有4个进程?

因为打开1个页面至少需要1个网络进程、1个浏览器进程、1个GPU进程以及1个渲染进程,共4个;如果打开的页面有运行插件的话,还需要再加上1个插件进程

并不是说当前的架构就已经很完美了,他也有不足的地方:

  • 更高的资源占用:因为每个进程都会包含公共基础结构的副本(如JavaScript运行环境),这就意味着浏览器会消耗更多的内存资源
  • 更复杂的体系架构:浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了

未来面向服务的架构

在2016年,Chrome官方团队使用“面向服务的架构”(Services Oriented Architecture,简称SOA)的思想设计了新的Chrome架构

原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过IPC来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标

面向服务的架构.png

同时Chrome还提供灵活的弹性架构,在强大性能设备上会以多进程的方式运行基础服务,但是如果在资源受限的设备上,Chrome会将很多服务整合到一个进程中,从而节省内存占用