FumadocsZDecode
浏览器

进程与线程

一、概念

进程:操作系统分配资源的最小单位,拥有独立的内存空间。

线程: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,运行在独立线程,不阻塞主线程。

On this page