浏览器为什么采用多进程架构?一个标签页卡死为什么不一定拖垮整个浏览器?

先理解原理和示例,再练习完整口述与追问。

现代 Chrome 分为浏览器主进程、渲染进程、GPU 进程、网络服务等进程。多进程带来稳定性(单个渲染进程崩溃不影响其他)、安全性(渲染进程运行在沙箱中,站点隔离防止跨站读取内存)和并行性。同站页面可能共享渲染进程,所以并不是完全隔离。

浏览器主进程负责地址栏、标签管理、导航和权限协调;渲染进程运行 Blink 和 V8,负责解析 HTML/CSS、执行 JS、布局绘制,主线程之外还有合成线程和光栅化线程;GPU 进程负责合成上屏;网络、存储、音频等以服务进程运行。

站点隔离(Site Isolation)让不同站点运行在不同渲染进程中,即使页面中的跨站 iframe 也会放到独立进程,降低 Spectre 类侧信道攻击读取其他站点数据的风险。为节省内存,同一站点的多个标签页可能复用一个渲染进程,通过 window.open 打开且保留 opener 关系的页面也常同进程。

一个页面的 JS 死循环只会占满它所在渲染进程的主线程:该页面无法响应,同进程的其他页面也会受影响,但其他站点的页面照常运行。浏览器主进程或 GPU 进程崩溃,则会影响全部页面。

新开一个标签访问某站点,至少涉及主进程、GPU 进程、网络服务和一个渲染进程;如果页面含两个不同站点的 iframe,还可能多出对应的渲染进程。打开任务管理器(Shift+Esc)可以看到每个进程承载了哪些页面。

不要背“一个标签页固定有 4 个进程”,进程数随站点、iframe、扩展和内存压力变化。页面卡顿时滚动有时还能进行,是因为合成线程独立于主线程,不代表 JS 没有阻塞。

浏览器拆成主进程、渲染进程、GPU 进程和网络等服务进程,好处是稳定、安全和并行:渲染进程跑在沙箱里,崩溃只影响它承载的页面,站点隔离还能防止跨站读取内存。但同站标签页或带 opener 的窗口可能共享渲染进程,所以一个页面卡死可能连带同站页面;主进程或 GPU 进程出问题则影响全部。进程数量不是固定值,会随站点和内存情况调整。