~/ ?.log $
返回文章列表
8 min read
更新于 2026年3月5日

我不知道的浏览器(01)— 进程、线程与多进程架构

很多人对浏览器有一个直觉判断:打开 Chrome,任务管理器里出现一大堆进程,"Chrome 又在吃内存了"。但这些进程分别是什么?为什么不设计成一个进程?一个标签页崩溃为什么不会把整个浏览器拖垮?

很多人对浏览器有一个直觉判断:打开 Chrome,任务管理器里出现一大堆进程,“Chrome 又在吃内存了”。但这些进程分别是什么?为什么不设计成一个进程?一个标签页崩溃为什么不会把整个浏览器拖垮?

这背后是浏览器多进程架构的核心设计。

一、进程与线程是什么关系

进程和线程是操作系统管理程序执行的两层结构。

进程是资源分配的基本单位。 每个进程有独立的内存空间。操作系统把 RAM 分块分给各个进程,进程之间的内存默认不互通——一个进程崩溃,不会直接破坏另一个进程的内存。

线程是进程内的执行单元。一个进程可以有多个线程,这些线程共享该进程的内存。多线程的代价是需要协调:两个线程同时写同一块内存会产生数据竞争,需要锁机制来保护。

说白了,进程是”圈地”(划定独立的资源边界),线程是”干活”(在圈定的地盘里实际执行代码)。

二、Chrome 的多进程架构

Chrome 不是一个进程,而是一组协作进程。打开 Chrome 任务管理器(Shift+Esc),可以看到以下几类进程:

**浏览器主进程(Browser Process)**是整个架构的协调中心,负责:UI 界面(地址栏、工具栏、书签)、用户输入处理、各个进程的生命周期管理。它是唯一一个可以访问文件系统和操作系统 API 的进程。

**渲染进程(Renderer Process)**是每个标签页的”内核”,负责把 HTML、CSS、JavaScript 转换成用户能看到的页面。通常每个标签页独享一个渲染进程(同一域名的标签页可能共享,具体取决于 Site Isolation 策略)。渲染进程运行在沙箱中,不能直接访问文件系统或发起系统调用,必须通过浏览器主进程中转。

**GPU 进程(GPU Process)**专门处理图形渲染,利用 GPU 硬件加速页面绘制、CSS 动画、WebGL 等。将 GPU 操作隔离在独立进程中,是因为 GPU 驱动历史上是 bug 高发区,隔离可以防止驱动崩溃带倒渲染进程。

**网络进程(Network Process)**处理所有网络请求——DNS 解析、HTTP/HTTPS 连接、资源下载。单独隔离网络层有助于实施更严格的安全策略(如 CORB、CORS 检查)。

此外还有插件进程、实用工具进程等,每类都有明确的职责边界。

三、渲染进程内部的线程分工

渲染进程内部并不只有一个线程,而是多个线程协同工作:

**主线程(Main Thread)**是任务最重的角色,它承担了:解析 HTML 构建 DOM、解析 CSS 构建 CSSOM、执行 JavaScript、计算布局、生成绘制指令。主线程是后续渲染流水线的起点(具体步骤见第 04 篇)。

**合成线程(Compositor Thread)**接收主线程的绘制结果,将页面图层分块、协调 GPU 进程光栅化,最后合成最终帧输出到屏幕。合成线程可以在不通知主线程的情况下处理滚动和部分动画,这是”合成层动画性能优”的根本原因。

**IO 线程(IO Thread)**处理渲染进程与浏览器主进程之间的进程间通信(IPC)。

Worker 线程运行 Web Workers,执行耗时的 JS 计算而不阻塞主线程。

四、进程间如何通信

进程之间不共享内存,需要通过**进程间通信(IPC,Inter-Process Communication)**协作。Chrome 使用 Mojo(一套 IPC 框架)来实现这套通信。

这里有一个很多人会忽略的细节——IPC 是有开销的。一次从渲染进程发起网络请求,实际路径是:渲染进程 → IPC → 浏览器主进程 → IPC → 网络进程 → 发出 HTTP 请求 → 结果原路返回。每次 IPC 都有序列化/反序列化的 CPU 开销,以及上下文切换的调度开销。多进程带来了安全和稳定性,但不是”免费的”。

五、为什么不用单进程

早期浏览器(IE 6、早期 Firefox)就是单进程的。所有标签页、插件、浏览器界面跑在同一个进程里。

单进程的问题是:一个标签页上的 JavaScript 死循环,会让整个浏览器界面失去响应;一个插件崩溃,整个浏览器崩溃;页面与页面之间的 JavaScript 可以跨标签页访问同一内存地址(安全漏洞的温床)。

多进程架构用内存换稳定性和安全性:一个渲染进程崩溃,只影响那一个标签页,其他标签页和浏览器界面继续正常运行。 这是现代浏览器的基本保障。

如果你只记住一句话:Chrome 的多进程架构是”用隔离换稳定”——进程边界既是崩溃隔离墙,也是安全沙箱的边界。

六、总结

进程提供内存隔离,线程在进程内并行执行。Chrome 的多进程架构让不同职责(UI、渲染、网络、GPU)运行在隔离的进程中,任何一个进程的崩溃或安全问题都不会波及整体。

渲染进程是前端开发最直接打交道的进程——主线程、合成线程、Worker 线程都在这里,下一篇聚焦渲染进程的主线程,解释它为什么必须是单线程的。


本系列其他文章:

相关主题:

share.ts

// 觉得这篇文章有帮助?

// 欢迎分享给更多人

export const  subscribe  =  "/rss.xml" ;