浏览器的进程模型
约 2120 字大约 7 分钟
2025-07-10
并行处理
并行处理指的是计算机同一时刻处理多个任务
A = 1 + 2
B = 20 / 5
C = 7 * 8在编写实际代码时,如果程序按照单线程的方式来处理,就可将这个过程分为四个步骤
单线程处理
- 步骤 1:计算 A = 1 + 2;
- 步骤 2:计算 B = 20 / 5
- 步骤 3:计算 C = 7 * 8
- 步骤 4:显示最后计算结果
如果采用多线程,那么只需分成两步
多线程处理
- 步骤 1:使用三个线程同时执行前三个任务(并行处理)
- 步骤 2:显示最后计算结果

进程与线程
线程是不能单独存在的,它是由进程来启动和管理的。所谓进程就是一个程序的运行实例,当启动一个程序时,操作系统会为该程序创建一块内存,这块内存被用来存放代码、运行中的数据和执行任务中的主线程。将这样的一个环境就叫做进程
进程与线程的关系
- 进程中的任意线程执行出错,都会导致整个进程崩溃
- 当一个进程关闭之后,操作系统会回收进程所占用的空间
- 进程之间的内容项目隔离不能随意访问,如果需要进程之间的通信,则需要使用 IPC 机制
- 线程之间共享进程中的数据
浏览器概述
单进程浏览器
单进程浏览器的所有功能模块全都是运行在同一个进程里,这里面包含:网络、插件、JS 引擎、渲染引擎和页面等,在 2007 年之前,市面上浏览器都是单进程的

单进程浏览器的缺陷
不稳定
早期浏览器需要借助于插件来实现诸如 Web 视频、Web 游戏等各种强大的功能,但插件是最容易出问题的模块,并且插件还运行在浏览器进程之中,所以一个插件的崩溃会导致整个浏览器的崩溃
除了插件,渲染引擎模块也是不稳定的,通常一些复杂的 JS 代码就有可能导致渲染引擎模块的崩溃,进而导致整个浏览器崩溃
不流畅
从上面的 "单进程浏览器架构图" 可以看出,所有的渲染模块、JS 执行环境以及插件都是运行在同一个线程中的,这就意味着同一时刻只能有一个模块可以运行。因此如果此时运行一个无限循环的脚本,它就会独占整个线程,这样导致其他运行在该线程中的模块就没有机会被执行。然后浏览器中所有的页面都运行在同一个进程中,因此这些页面都没有机会去执行任务,这样就会导致整个浏览器失去响应,变卡顿
不安全
插件可以使用 C/C++ 等代码编写,通过插件可以获取到操作系统的任意资源,当你在页面运行一个插件时也就意味着这个插件能够完全操作你的电脑,如果是个恶意插件,那么它就可以释放病毒、窃取账号密码,引发安全问题
还有就是页面脚本,它可以通过浏览器的漏洞来获取系统权限,这些脚本获取系统权限之后也可以对你的电脑做一些恶意的事情,同样也会引发安全问题
多进程浏览器
早期多进程架构
在早期多进程架构中,每个 Chrome 页面都会运行在其单独的渲染进程、插件进程中,而进程与进程之间的通信通过 IPC 机制

多进程架构的解决方案
不稳定
由于进程之间是相互隔离的,所以当一个页面或者插件崩溃时,仅会影响当前页面或插件,别的页面不会受到影响
不流畅
同样,JavaScript 也是运行在渲染进程中的,即使 JavaScript 阻塞了当前页面,渲染也只是影响当前的渲染页面,其他页面的脚本运行在它们自己的渲染进程中
不安全
除此之外采用多进程架构的另一个好处是可以使用安全沙箱(相当于给操作系统上了一把锁),在沙箱中的程序可以运行,但不能在硬盘上写入数据或是在敏感位置读取数据,Chrome 把插件进程和渲染进程锁在沙箱里面,这样即使在渲染进程或插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限
现代多进程架构
相较于早期的多进程架构,现代的多进程架构又发生了改变,最新的 Chrome 浏览器包括
| 进程 | 主要职责 |
|---|---|
| Browser 主进程 | 地址栏、标签管理、前进后退、权限与存储、子进程调度 |
| Render 渲染进程 | HTML/CSS/JS 解析执行、布局绘制(沙箱内)排版引擎 Blink 和 V8 引擎都运行在该进程中 |
| GPU 进程 | 合成与光栅化加速 |
| Network 进程 | DNS、连接、HTTP/HTTPS 请求调度 |
| 插件进程 | 插件独立运行,故障隔离 |

所以,之所打开一个 Tab 以会启动 4 个进程就是因为打开一个页面至少要启动:1 个网络进程,1 个渲染进程,1 个 GPU 进程以及 1 个浏览器主进程,如果打开的页面有运行插件的话,还需要再加上 1 个插件进程

现代多进程架构的缺陷
- 更高的资源占用:每个进程都会包含公共基础结构的副本(如 JavaScript 运行环境),这就意味着浏览器会消耗更多的内存资源
- 更复杂的体系架构:浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了
未来面向服务的架构
在 2016 年,Chrome 团队使用 "面向服务的架构(Services Oriented Architecture,简称 SOA)" 的思想设计了新的 Chrome 架构
原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标

拓展补充
即便是如今的多进程架构,偶尔还是会遇到由于单个页面卡死最终导致所有页面崩溃的情况
这通常情况是一个页面使用一个进程,但是有一种情况,叫 同一站点,比如下面这三个:
https://time.geekbang.org
https://www.geekbang.org
https://www.geekbang.org:8080Chrome 的默认策略是,每个标签对应一个渲染进程但如果从一个 Tab 也打开了同属于一个站点的另一个页面时,那么新页面会复用父页面的渲染进程,官方把这个策略叫做:process-per-site-instance。所以,这种情况下,一个页面崩溃了,会同时导致同一站点的页面同时崩溃,因为它们使用的是同一个渲染进程
