浏览器发展史和它的多进程架构

457 阅读8分钟

浏览器是每天陪伴我们时间最长的软件之一,特别是前端开发工程师, 对于这位每天陪伴着我们的朋友,我们有必要去了深入地解一下它。但是浏览器的工作原理涉及的内容非常多,这篇文章就先从它的发展历程和多进程架构入手,从宏观视角去了解浏览器。

浏览器发展历史

按照时间顺序简单罗列浏览器从1991年到2008年之间的发展:
1991年:Berners-Lee建立了第一代网络浏览器WorldWideWeb , 能显示文字和图片。

founder-of-the-web-08-2018-embed01 (1).jpeg 1993年: Mosaic问世,它是第一个获得普遍使用并且能显示文字和图片的浏览器。
1994年:网景浏览器发布,只能显示静态HTML,没有JS和CSS,同年还出现了Opera 。
以上浏览器由于年代久远我们可能都没使用过,接下来的浏览器可能大家更熟悉一点:
1995年:微软发布了IE1.0,IE2.0 ,就是我们熟悉的,在windows电脑上自带的浏览器。1996年:微软将IE3.0集成在windows操作系统中。集成浏览器在系统中是出于和网景浏览器的竞争,当时网景的市场份额达到86%,微软的IE浏览器集成在Windows系统后到1999年,它占据浏览器市场的99%。
2003年:苹果发布了Safari浏览器,同样是集成在苹果的电脑系统中,并在2005年将其内核webkit开源。
2004年:Firefox1.0发布
2008年:谷歌以WebKit作为内核,创建了一个新的项目Chromium,在该项目的基础上发布了自己的浏览器产品Chrome ,Chrome到目前为止,占据着浏览器市场60%以上的市场份额。
世界上目前使用率最高的pc浏览器是Chrome,据statcounter的数据显示, Chrome在全世界的浏览器市场占比达68.58%, 一骑绝尘,是第2名的Safari的7倍多,IE的市场份额已经掉到了1.37%,排名第六。Chrome、微软的Edge和国内大部分浏览器都是基于谷歌的Chromium项目开发的,因此接下来要讲到的多进程架构将以Chrome为例。
image (3).png 2013年是chrome发布后的第5年,其世界市场份额排名已经达到第一,本文第二部分说到的多进程架构就是chrome最先应用的,我们来看下多进程架构有什么优势。

image (4).png 2009年-01月-2021年07月pc浏览器市场份额变化(数据来源于statcounter

多进程浏览器架构

在理解浏览器多进程架构前,首先要了解进程和线程的概念以及它们的一些特点。

进程和线程

  • 进程是一个应用的执行程序。也就是说,在我们打开一个应用的时候操作系统就会创建相应的进程。当我们打开浏览器,操作系统会就创建浏览器进程,打开微信会创建微信进程,其它应用也一样。

Snipaste_2021-09-08_18-50-42.png

  • 进程有以下三个特点
    • 进程能让操作系统启动另外的进程来执行不同的任务。
    • 进程之间相互隔离:操作系统会为不同的进程分配不同的内存块,这样可以避免进程中的数据写入到另一个进程中。如果进程之间需要通信,则需要通过IPC(Inter Process Communication进程间通信)。
    • 结束进程后,浏览器会回收相应的内存资源。把应用关掉后,该应用的进程也会结束运行,随后操作系统会回收进程运行时占用的内存资源,等待分配给其它进程。
  • 线程: 线程是进程内部用来执行任务的结构,一个进程可以使用启动多个线程来执行任务。

Snipaste_2021-09-08_18-53-21.png

  • 线程也有一些特点:
    • 线程共享进程内的数据
    • 同一进程内的一个线程运行出错就会引起整个进程崩溃

单进程浏览器

单进程浏览器的所有功能模块都运行在同一个进程里,如下图所示:

单进程浏览器.png 2007年前的浏览器都是单进程的,由于早期的浏览器要展示的网页内容比较简单,只是展示图片和文字等,很少交互的功能,所以采用单进程架构能更节省内存。但是随着技术的进步,网页不仅要展示文字图片,还要展示各种复杂的动画效果,使用JavaScript交互也越来越多。所有的功能模块都在一个进程中运行,会导致浏览器不稳定、不流畅和不安全。

  • 不稳定:由于进程中任何一个线程执行出错都会导致整个进程崩溃,插件和渲染引擎都很容易出错,一旦页面线程执行出错,将导致整个浏览器进程崩溃。
  • 不流畅:JavaScript运行环境和页面渲染都运行在同一个线程中,如果出现复杂的JS代码或者死循环,JavaScript运行环境将一直独占页面线程,所有页面都没机会执行任务,浏览器会变得卡顿无响应。
  • 不安全:线程除了共享进程中的数据还共享权限,也就是说如果浏览器进程拥有操作系统的读写权限,一些恶意插件就可以往计算机写入病毒,读取计算机上的账号密码。

早期多进程架构

早期多进程架构.png 在chrome早期的多进程架构中,页面和插件都运行在单独的进程中。上图中的层叠矩形表示多个进程,多个插件可以运行在多个插件进程中,浏览器在内存资源充足的时候,会为每一个浏览器tab启动一个进程。浏览器主进程负责控制浏览器的用户界面,包括地址栏、前进后退按钮和书签,同时还负责网络请求、文件访问和管理进程之间的通信等。多进程架构可以解决单进程浏览器的不稳定、不流畅和不安全问题。

  • 解决不稳定问题:因为进程是相互隔离的,所以即使页面或者插件崩溃了也不会影响到其它页面,也不会导致整个浏览器崩溃。
  • 解决不流畅的问题:JavaScript运行在独立的渲染进程中,即使该渲染进程崩溃也不会影响到其它页面和浏览器主进程。运行死循环代码时只有当前页面会出现卡顿。
  • 解决安全问题:渲染进程和插件进程在沙箱里面运行,通过限制进程的权限来保证系统安全。

后来的多进程架构

后来的多进程架构.png 提出多进程架构后谷歌不断地进行优化,后来将网络模块从浏览器主进程中独立出来,添加GPU进程用于绘制Chrome的UI界面。虽然多进程架构能提高浏览器的稳定性、流畅性和安全性,但同时又会带来内存资源占用过多的问题,因为进程包含重复的功能模块,比如每个渲染进程都会包含JS运行环境。如下图所示每个浏览器tab的渲染进程都要包含JS运行环境,当打开的页面很多时,将占用大量的内存资源。 内存.png

面向服务的架构

为了解决浏览器占用过多系统资源的问题以及进一步优化多进程架构,在 2016 年,Chrome 官方团队使用“面向服务的架构”(ServicesOriented Architecture,简称SOA)的思想设计了新的 Chrome 架构。

面向服务的架构.png 新架构将原来各个功能模块重构成独立的服务,每个服务都可以在独立的进程中运行,访问服务必须使用定义好的接口。目前 Chrome 正处在老的架构向服务化架构过渡阶段。新架构灵活具有弹性,在内存资源充足的设备 上,基础服务将运行在独立的进程中。在内存资源不足时,多个基础服务将合并到浏览器主进程执行,如下图所示。

内存不足.png

总结

用一句话总结本文:长江后浪推前浪,一代新人换旧人。这句话的意思是事物是发展的,新事物推动着旧事物发展,新事物将取代旧事物。浏览器的发展也是如此,从1991年至今30年间,市场上的主流浏览器不断发生变化,从早期受人们欢迎的网景到IE, 再到后来的FireFox和Safari, 最后是现在的Chrome。浏览器技术也在不断进步,从早期只能显示文字和图片的静态页面到现在能显示各种媒体的动态页面。从以前的单进程架构到现在稳定流畅安全的多进程架构。在Chrome应用了多进程架构后,IE和FireFox都实现了自己的多进程架构。

参考

time.geekbang.org/column/arti…
www.bilibili.com/read/cv7962…
Chrome Service Model
Multi-process Architecture
Inside look at modern web browser (part 1)
Process Models