Chrome架构

96 阅读7分钟

前端为什么要了解浏览器

前端代码是基于浏览器运行的,无论你是要设计高性能Web应用,还是要优化Web应用,你都需要了解浏览器的中的网络流程、页面渲染过程、JS执行流程,以及Web安全理论,而这些功能是分散在浏览器的各个组件中的,比较多比较散,要通过浏览器的多进程架构学习,把各个知识点串起来

因此,学习浏览器的多进程架构是非常必要的,Chrome是目前最具代表性的浏览器,本文就基于Chrome浏览器的多进程架构,来了解浏览器运行原理

Chrome打开一个页面至少会启动4个进程

说到进程,要先了解一下进程和线程的概念

进程与线程

先了解一下什么叫并行处理,以下有多个任务,计算A,B, C的值,显示出来

A = 1 + 2;
B = 20 / 5;
C = 7 * 8;

用单线程来处理,就需要4步 如果采用多线程,只需2步(多个线程来一起计算多个计算任务,一个线程来负责最后的显示)

使用并行处理能大大提升性能

线程和进程的联系

多线程可以并行处理任务,线程不单独存在,由进程来启动管理的。 一个进程就是一个程序的运行实例 ,启动一个程序时,操作系统会为该程序创建一块,用来存放代码、运行中的数据和一个执行任务的主线程,这个运行环境叫进程。

单线程和多线程的对比图

1.png

从中可知,线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率。

总结来说,进程和线程之间的关系有以下4个特点。

  1. 进程中的任意一线程执行出错,都会导致整个进程崩溃。
  2. 线程之间共享进程中的数据。
  3. 当一个进程关闭后,操作系统会回收进程所占用的内存
  4. 进程之间的内容相互隔离,需要进行数据通信就需要使用进程间通信(IPC)的机制。

单进程浏览器时代

单进程浏览器是指浏览器的所有功能模块都运行在同一个进程中,包含了网络、插件、JavaScript运行环境、渲染引擎和页面等。单进程浏览器架构如下:

1.png

如此多的功能模块运行在一个进程中,会导致单进程浏览器不稳定、不流畅不安全的一个主要因素。

问题1: 不稳定

早期浏览器借助插件实现很多功能,插件容易出现问题,同时渲染引擎模块也不稳定,一些复杂的JS代码有可能引起渲染模块的崩溃

问题2:不流畅

同一时刻只能有一个模块可以执行。

写个JS脚本无限循环,当执行时会独占整个线程,会导致其他模块没有机会被执行

⻚⾯的内存泄漏也是单进程变慢的⼀个重要原因。

问题3: 不安全

插件和页面脚本两个方面

插件可以获取操作系统的任意资源,恶意插件引发安全性问题 页面脚本通过浏览器的漏洞来获取系统权限

多进程浏览器时代

早期多进程架构

2008年Chrome发布时进程架构

1.png

从中可知,Chrome页面是运行在单独的渲染进程中,插件也运行在单独的插件进程之中,进程之间是通过IPC机制进行通信。

不稳定问题解决:一个页面或者插件崩了,不会影响到其他 不流畅问题解决:一个界面不流畅不会导致整个浏览器的所有界面不流畅 安全问题解决:多进程架构的额外好处是可以使用安全沙箱,即使渲染进程或插件进程里面执行了恶意程序,恶意程序也无法突破沙箱获取系统权限

目前多进程架构

1.png

最新Chrome浏览器包括:1个浏览器主进程、一个GPU进程、一个网络进程、多个渲染进程和多个插件进程。

逐个分析几个进程功能:

浏览器进程:主要负责界面显示、用户交互、子进程管理,提供存储等功能。

渲染进程:可以有多个。核心任务是将HTML、CSS和Javascript转换为用户可以与之交互的网页,排版引擎Blink和JavaScript引擎V8都是运行在该进程中,默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。

GPU进程:刚发布时没有这个进程,GPU使用初衷是为了实现3DCSS效果,后面网页、Chrome的UI界面都选择GPU绘制,使得GPU成为浏览器普遍的需求,后面就引入了

网络进程: 负责网络资源加载。

插件进程: 负责插件的运行,因插件容易崩,所以隔离

**为了提升浏览器的稳定性、流畅性和安全性,带来了一些问题: **更高的资源占用 **更复杂的体系架构

未来⾯向服务的架构

为了解决这些问题,在 2016 年,Chrome 官⽅团队使⽤“⾯向服务的架构”(Services Oriented Architecture,简称 SOA)的思想设计了新的 Chrome 架构。也就是说 Chrome 整体架构会朝向现代操作系统所采用的"面向服务的架构"方向发展,原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务必须使用定义好的接口,通过IPC来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现Chrome简单、稳定、高速、安全的目标。

Chrome 最终要把 UI、数据库、⽂件、设备、⽹络等模块重构为基础服务,类似操作系统底 层服务,下⾯是 Chrome“⾯向服务的架构”的进程模型图:

1.png

同时 Chrome 还提供灵活的弹性架构,在强⼤性能设备上会以多进程的⽅式运⾏基础服务, 但是如果在资源受限的设备上(如下图),Chrome 会将很多服务整合到⼀个进程中,从⽽节省内存占⽤。

1.png

总结

最初的浏览器都是单线程的,他们不稳定、不流畅且不安全,之后出现了Chrome,创造性的引入了多进程架构,并解决了这些遗留问题。随后 Chrome 试图应⽤到更多业务场景,如移 动设备、VR、视频等,为了⽀持这些场景,Chrome 的架构体系变得越来越复杂,这种架构 的复杂性倒逼 Chrome 开发团队必须进⾏架构的重构,最终 Chrome 团队选择了⾯向服务架 构(SOA)形式,这也是 Chrome 团队现阶段的⼀个主要任务。 鉴于⽬前架构的复杂性,要完整过渡到⾯向服务架构,估计还需要好⼏年时间才能完成。不过 Chrome 开发是⼀个渐进的过程,新的特性会⼀点点加⼊进来,这也意味着我们随时能看到 Chrome 新的变化。

总体说来,Chrome 是以⼀个⾮常快速的速度在进化,越来越多的业务和应⽤都逐渐转⾄浏览 器来开发,身为开发⼈员,我们不能坐视不管,⽽应该紧跟其步伐,收获这波技术红利。