浏览器
进程与线程
一、概念
进程:操作系统分配资源的最小单位,拥有独立的内存空间。
线程:CPU 调度的最小单位,同一进程内的线程共享内存。
进程 A(独立内存) 进程 B(独立内存)
┌─────────────────┐ ┌─────────────────┐
│ 线程1 线程2 │ │ 线程1 线程2 │
│ ↕ 共享内存 ↕ │ │ ↕ 共享内存 ↕ │
│ 线程3 线程4 │ │ 线程3 │
└─────────────────┘ └─────────────────┘
彼此内存隔离,不能直接访问类比:进程是一栋楼(独立地址),线程是楼里的员工(共用办公资源)。
二、浏览器进程架构(Chrome)
Chrome
├── Browser 主进程(1 个) — 地址栏、书签、网络请求
├── GPU 进程(1 个) — 渲染合成
├── Renderer 渲染进程(每个 tab) — 页面渲染、JS 执行
│ ├── 主线程(JS 执行、DOM、布局、绘制)
│ ├── 合成线程
│ ├── 光栅化线程
│ └── Worker 线程
├── Plugin 进程 — 插件
└── Network 进程 — 网络关键点:同一域名的两个 tab,默认是两个独立的渲染进程(Chrome 的 site isolation),内存隔离,JS 上下文完全独立。
三、为什么 JS 是单线程
JS 最初设计用于操作 DOM,如果多线程同时修改 DOM 会产生竞态问题,所以设计为单线程。
浏览器主线程同时负责 JS 执行和页面渲染,这也是为什么 JS 执行耗时过长会导致页面卡顿。
解决方案是把耗时任务交给 Web Worker,运行在独立线程,不阻塞主线程。