进程、线程与多进程架构
很多人对浏览器有一个直觉判断:打开 Chrome,任务管理器里出现一大堆进程,"Chrome 又在吃内存了"。但这些进程分别是什么?为什么不设计成一个进程?一个标签页崩溃为什么不会把整个浏览器拖垮?
浏览器, 沙箱
/**
* 我不知道的 浏览器
* 共 4 篇文章
*/
export const series = {
name : "我不知道的 浏览器" ,
count : 4 ,
guide : "我不知道的浏览器 — 系列导读与阅读路径" ,
description : "《我不知道的 浏览器》系列导读、阅读路径与文章索引。" ,
};
文章数量: 4 篇
根据不同背景选择入口:
如果想系统了解浏览器原理: 按编号 01 → 04 顺序阅读
如果只关心性能优化: 重点看 02(单线程约束)、04(渲染流水线与回流重绘)
如果在调试异步 bug: 重点看 03(事件循环调度规则)
如果想理解 V8 与浏览器的关系: 先读 V8 系列 01-02,再回来读浏览器 01-02
| # | 文章 | 核心内容 |
|---|---|---|
| 01 | 进程、线程与多进程架构 | Chrome 各进程职责、渲染进程线程分工、IPC 开销、单进程 vs 多进程 |
| 02 | 渲染线程为什么是单线程的 | 主线程职责、单线程设计原因、Web Workers 边界、长任务卡顿机制 |
| # | 文章 | 核心内容 |
|---|---|---|
| 03 | 事件循环:浏览器如何协调 JS 与渲染 | 宏任务/微任务优先级、渲染在事件循环中的位置、setTimeout 精度、rAF 与 rIC |
| 04 | 渲染流水线:从 HTML 到屏幕的八个步骤 | 解析→样式→布局→分层→绘制→光栅化→合成,回流/重绘/合成三条性能路径,布局抖动 |
浏览器系列与 V8 系列覆盖不同层次,互为补充:
| 主题 | 浏览器系列视角 | V8 系列视角 |
|---|---|---|
| JavaScript 执行 | 主线程单线程约束(02) | 字节码生成、JIT 编译(V8-01、02) |
| 事件循环 | 浏览器调度与渲染协调(03) | V8 内部宏/微任务实现(V8-13、14) |
| 性能瓶颈 | 渲染流水线回流重绘(04) | 内联缓存与属性访问优化(V8-12) |
很多人对浏览器有一个直觉判断:打开 Chrome,任务管理器里出现一大堆进程,"Chrome 又在吃内存了"。但这些进程分别是什么?为什么不设计成一个进程?一个标签页崩溃为什么不会把整个浏览器拖垮?
"JavaScript 是单线程的"——这句话几乎每个前端开发者都说过,但很少有人追问一句:为什么?
很多人以为 setTimeout(fn, 0) 就是"立即执行",但实际上——它排在所有当前微任务之后,排在浏览器渲染之后,有时候甚至要等几毫秒。
很多人以为修改一个 CSS 属性会触发"浏览器重新绘制页面",但实际上——改 transform 只需要合成线程处理,改 width 要从布局步骤重新计算,改 background-color 跳过布局但仍需重绘。这三种操作的性能开销可以差 10 倍以上。