浏览器中的进程和线程
进程 vs 线程
| 进程 | 线程 | |
|---|---|---|
| 定义 | 程序运行的基本单位,独立的内存空间 | 进程内独立执行的最小单位 |
| 隔离性 | 进程间完全隔离,互不干扰 | 同进程内线程共享内存,可直接通信 |
| 崩溃影响 | 一个进程崩溃不影响其他进程 | 一个线程崩溃会导致整个进程崩溃 |
| 通信方式 | 需要通过 IPC(进程间通信管道) | 直接共享数据 |
Chrome 的多进程架构
| 进程 | 作用 |
|---|---|
| 1个浏览器进程 | 管理 UI(地址栏、书签)、协调其他进程 |
| 1个网络进程 | 负责所有网络请求的发起与接收 |
| 1个GPU进程 | 负责页面图层合成、硬件加速渲染 |
| 多个渲染进程 | 每个 Tab 独立一个进程 |
| 多个插件进程 | 每个插件独立运行,崩溃不影响页面 |
为什么用多进程?
早期浏览器是单进程的,一个 Tab 崩溃或一个插件卡死会让整个浏览器崩溃。 多进程架构让每个 Tab 相互隔离——一个 Tab 崩溃不影响其他 Tab。
渲染进程中的线程
渲染进程是页面运行的核心,内部包含多个协作的线程:
五个关键线程
① GUI 渲染线程 解析 HTML/CSS → 构建 DOM/CSSOM → 生成渲染树 → 布局 → 绘制
② JS 引擎线程(V8) 解析并执行 JavaScript,每个 Tab 只有一个,即 JS 单线程。
⚠️ GUI 渲染线程和 JS 引擎线程互斥 两者不能同时执行——JS 执行时渲染暂停,渲染时 JS 暂停。 这就是为什么长时间运行的 JS 会导致页面卡顿(掉帧)。
③ 计时器线程 处理 setTimeout / setInterval,独立计时。 (若由 JS 引擎计时,JS 阻塞时计时就失准了)
④ 异步请求线程 处理 XMLHttpRequest / Fetch,请求完成后将回调加入任务队列。
⑤ 事件触发线程(Event Loop) 管理任务队列,监控调用栈,负责驱动整个事件循环。