Skip to content

浏览器多进程/多线程架构

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 进程职责对比

进程类型数量职责
Browser1主进程,UI、地址栏、书签、网络请求、文件访问
Renderer每 Tab 1+解析 HTML/CSS、执行 JS、渲染页面、Blink 引擎
GPU13D 绘制、合成、硬件加速
Network1网络请求、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 等侧信道攻击读取其他页面内存。

前端面试知识库