现代浏览器有哪些进程?为什么要多进程?
一句话回答
以 Chrome 为例,主要有浏览器进程(界面、导航、协调其他进程)、渲染进程(运行 Blink 和 V8,把 HTML、CSS、JS 变成页面)、GPU 进程和网络服务,此外还有存储、音频、扩展等进程或服务。多进程带来了稳定(一个页面崩溃不影响其他页面)、安全(沙箱和站点隔离)和并行,代价是内存占用更高。
详细解析
Chrome 的主要进程
| 进程 | 职责 |
|---|---|
| 浏览器进程 | 地址栏、标签栏、前进后退等界面;处理导航;创建和协调其他进程;文件访问等需要特权的操作 |
| 渲染进程 | 运行 Blink 排版引擎和 V8,把 HTML、CSS、JS 变成可交互的页面;运行在沙箱中,一般按站点分配 |
| GPU 进程 | 处理来自各个进程的 GPU 任务,负责合成与绘制加速 |
| 网络服务(Network Service) | 发起和管理网络请求 |
| 其他 | 存储、音频等服务,以及扩展进程等;早年还有运行 Flash 等插件的插件进程 |
进程数量不是固定的。Chrome 会根据设备内存等情况调整:内存充足时,各个服务分别运行在独立的进程里;内存紧张时,可能把一些服务合并到同一个进程。面试常问"打开一个页面有几个进程":桌面版 Chrome 至少有浏览器进程、渲染进程、GPU 进程和网络服务这 4 个,实际还会有存储服务、音频服务等进程。在 Chrome 的任务管理器(更多工具 → 任务管理器)里可以看到当前有哪些进程。
为什么要多进程
早期浏览器是单进程的,所有页面、插件都在一个进程里:一个页面崩溃,整个浏览器跟着崩溃;渲染引擎一旦被漏洞攻破,攻击者就拥有和浏览器一样的系统权限。拆成多进程后:
- 稳定:渲染进程之间相互独立,一个页面崩溃或卡死,只影响它所在的进程
- 安全:渲染进程运行在沙箱里,不能直接读写文件、访问系统资源,要通过 IPC 请浏览器进程代办。站点隔离(Site Isolation)进一步把不同站点的页面放进不同的渲染进程,用来防御 Spectre 这类侧信道攻击
- 性能:任务分散到多个进程中并行执行,能更好地利用多核 CPU
代价是内存占用更高:每个渲染进程都有自己的一套 Blink 和 V8,同样的基础设施要在多个进程里各占一份内存。
渲染进程里的线程
| 线程 | 职责 |
|---|---|
| 主线程 | 解析 HTML、执行 JS、样式计算、布局、生成绘制记录 |
| 合成线程 | 把图层分成图块交给光栅化线程,再把结果合成为一帧;也负责处理滚动 |
| 光栅化线程 | 把图块转换成位图,通常借助 GPU 完成 |
| Worker 线程 | 运行 Web Worker 等 |
| IO 线程 | 负责和其他进程通信(IPC) |
JS、样式计算、布局都挤在主线程上,由事件循环依次调度。所以一个 JS 长任务会阻塞同在主线程上的渲染工作:页面不更新,点击也没有反应。
只涉及合成的动画可以不受影响。用 CSS 动画或过渡改变 transform、opacity 时,浏览器一般可以把动画交给合成线程,每一帧都不需要主线程参与。可以做个实验:给两个元素分别加上 transform 动画和 left 动画,再用一个 while 循环占住主线程 3 秒,前者照常移动,后者会卡住。这也是动画优先使用这两个属性的原因(见回流和重绘)。
滚动也类似:合成线程可以直接处理滚动,所以主线程繁忙时页面通常还能滚动。但如果绑定了非 passive 的 wheel、touchmove 监听器,合成线程就得先等主线程执行完监听器(见事件流与 passive)。
面试官可能追问
多个同站点的标签页会共用一个渲染进程吗?
可能会,也可能不会,不能一概而论。Chrome 会综合考虑页面之间的关系、设备内存和当前的进程数量来决定是否复用进程,不同浏览器、不同版本的策略也不一样。比如通过 window.open 打开、能直接访问对方 window 的同站页面,一般会放在同一个进程里;在桌面端,进程数量超过上限后,新页面也可能复用已有的同站点进程。共用一个进程时也共用一个主线程,一个页面的长任务会拖慢另一个。
什么是站点隔离?
把不同站点的页面放进不同的渲染进程,页面里的跨站 iframe 也会放到单独的进程里。这里的"站点"指协议加可注册域名(eTLD+1),范围比"源"大,例如 https://a.example.com 和 https://b.example.com 属于同一个站点。
它主要用来防御 Spectre:这类攻击利用 CPU 的推测执行,恶意代码有可能读到同一进程内的其他数据,同源策略这类软件层面的检查挡不住。把其他站点的数据放到别的进程里,才能从根本上隔离。桌面版 Chrome 默认对所有站点开启;安卓版受内存限制,只隔离用户登录过的网站等部分站点,内存不足 2GB 的设备不开启。
为什么一个页面卡死时其他标签页还能正常使用?
页面卡死通常是它所在渲染进程的主线程被长任务占满了,比如死循环。其他标签页一般在各自的渲染进程里,有自己的主线程;地址栏、标签栏属于浏览器进程,也不受影响,所以还能切换或关闭这个标签页。Chrome 检测到页面长时间无响应时,还会弹出提示框,让用户选择等待或关闭这个页面。如果两个页面恰好共用一个渲染进程,就会一起卡住。
易错点
- "JS 是单线程的"说的是页面的 JS 在主线程上执行(Web Worker 除外),浏览器本身是多进程、多线程的
- 多进程不等于"一个标签页一个进程":同一个标签页里的跨站 iframe 可能在另一个进程,多个标签页也可能共用一个进程
- 主线程卡住时,交给合成线程的动画还能继续播放;用 JS 逐帧修改样式的动画会跟着一起卡住
AI 模拟面试官
用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮
这道题你掌握了吗?
选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。
学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。