浏览器多进程/多线程架构
Chrome 多进程模型、进程隔离与崩溃恢复
一、Chrome 多进程架构概览
1.1 为什么需要多进程?
单进程浏览器的问题:
├── 一个 Tab 崩溃 → 整个浏览器崩溃
├── 插件/脚本卡死 → 页面无响应
├── 安全隔离不足 → 恶意页面可访问其他页面
└── 内存泄漏累积 → 长时间使用后变慢1.2 主要进程类型
┌─────────────────────────────────────────────────────────────────────────┐
│ Chrome 多进程架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────┐ │
│ │ Browser Process │ ← 主进程,唯一 │
│ │ (浏览器进程) │ 负责:UI、网络、存储、插件管理 │
│ └──────────┬──────────┘ │
│ │ │
│ ┌──────────┼──────────┬──────────┬──────────┐ │
│ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Renderer│ │Renderer│ │Renderer│ │Renderer│ │Renderer│ ← 渲染进程,每个 │
│ │Process │ │Process │ │Process │ │Process │ │Process │ Tab 一个(可同源) │
│ │ Tab 1 │ │ Tab 2 │ │ Tab 3 │ │ Tab 4 │ │ Tab 5 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ GPU Process │ │ Network Process │ ← 独立进程 │
│ │ (GPU 进程) │ │ (网络进程) │ │
│ │ 3D 绘制、合成 │ │ HTTP 请求、缓存 │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Utility Process │ │ Plugin Process │ ← 按需创建 │
│ │ (工具进程) │ │ (插件进程) │ │
│ │ 音频、视频、打印 │ │ PDF、Flash 等 │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘1.3 进程职责对比
| 进程类型 | 数量 | 职责 |
|---|---|---|
| Browser | 1 | 主进程,UI、地址栏、书签、网络请求、文件访问 |
| Renderer | 每 Tab 1+ | 解析 HTML/CSS、执行 JS、渲染页面、Blink 引擎 |
| GPU | 1 | 3D 绘制、合成、硬件加速 |
| Network | 1 | 网络请求、Cookie 管理 |
| Utility | 按需 | 音频解码、视频解码、数据解码 |
| Plugin | 按需 | PDF、Flash 等插件 |
二、渲染进程内部结构
2.1 多线程模型
┌─────────────────────────────────────────────────────────────┐
│ Renderer Process │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Main Thread │ │ Compositor │ │ Raster │ │
│ │ (主线程) │ │ Thread │ │ Thread │ │
│ │ │ │ (合成线程) │ │ (光栅线程) │ │
│ │ • JS 执行 │ │ │ │ │ │
│ │ • 样式计算 │ │ • 图层合成 │ │ • 图层绘制 │ │
│ │ • 布局计算 │ │ • 滚动处理 │ │ • 分块 │ │
│ │ • DOM 构建 │ │ • 输入处理 │ │ • 解码 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Worker │ │ Worker │ ← 可选,Web Worker │
│ │ Thread │ │ Thread │ │
│ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘2.2 主线程与合成线程
- 主线程:负责 JS、DOM、CSS、布局、绘制指令生成。长任务会阻塞主线程。
- 合成线程:接收主线程的绘制指令,将图层合成并提交给 GPU 进程。
- 光栅线程:将图层分块绘制成位图,可多线程并行。
三、进程间通信 (IPC)
3.1 通信方式
Browser Process ────────────── IPC (Mojo) ────────────── Renderer Process
│ │
│ 请求资源、存储 Cookie、创建新 Tab │
│ 返回渲染结果、处理输入事件 │
│ │
└────────────────────────────────────────────────────┘- Mojo:Chrome 的跨进程通信框架,替代早期 IPC。
- 共享内存:大量数据传输时使用 SharedArrayBuffer(需安全上下文)。
3.2 安全隔离
- 渲染进程运行在沙箱中,无法直接访问文件系统、网络。
- 所有敏感操作需通过 Browser 进程代理。
- 同源策略在渲染进程内由 Blink 引擎执行。
四、Site Isolation 与同源隔离
4.1 默认行为
- 早期:同源页面可共享同一渲染进程(节省内存)。
- Site Isolation(2018+):不同站点强制使用不同渲染进程,防止 Spectre 等侧信道攻击。
4.2 进程分配策略
chrome://process-internals → 查看当前进程分配
同源策略:
- a.com 与 b.com → 不同进程
- a.com/page1 与 a.com/page2 → 可同进程(Out-of-Process iframes 除外)五、崩溃隔离与恢复
5.1 崩溃隔离
- 单个渲染进程崩溃 → 仅该 Tab 显示「页面崩溃」,其他 Tab 不受影响。
- 可通过
window.onerror或 Service Worker 上报崩溃。
5.2 进程复用
- 同源多 Tab 可共享渲染进程(节省资源)。
- 进程数量有上限,超出后复用空闲进程。
六、高频面试题
Q1: Chrome 有哪些进程?
答案:Browser(主进程)、Renderer(每 Tab)、GPU、Network、Utility、Plugin 等。Browser 唯一,Renderer 按 Tab/站点分配。
Q2: 渲染进程和主进程的区别?
答案:Browser 主进程负责 UI、网络、存储;Renderer 进程负责单个 Tab 的 HTML/CSS/JS 解析与渲染,运行在沙箱中。
Q3: 为什么多进程能提升稳定性?
答案:进程间内存隔离,一个 Tab 崩溃不会影响其他 Tab;插件、脚本卡死也隔离在各自进程内。
Q4: Site Isolation 是什么?
答案:不同站点强制使用不同渲染进程,防止跨站点的 Spectre 等侧信道攻击读取其他页面内存。