进程 vs 线程
判别规则(核心,唯一要记的)
- 看隔离:要互相隔离、一个崩不影响其他 → 进程;要共享数据、轻量并发 → 线程
- 看开销:频繁创建/切换、性能敏感 → 线程;进程创建切换都重(要换地址空间)
- 看通信:进程间要 IPC(管道/消息/共享内存);线程直接共享变量 + 锁同步
一句话:"进程 = 独门独户(隔离稳、但重),线程 = 一个房子里的住户(轻快、但一个崩全崩);要隔离用进程,要轻快用线程。"
抽象描述(一句话本质)
进程 = 独门独户的房子(独立地址空间、独立资源);线程 = 同一个房子里的住户(共享地址空间、共享资源)。房子之间隔墙,住户之间共用客厅厨房。
对比表
|
进程 |
线程 |
| 地址空间 |
独立(隔墙) |
共享(同一进程的内存) |
| 资源 |
各有各的(文件/内存/PCB) |
共享进程的资源 |
| 切换开销 |
重(要换地址空间) |
轻(不换地址空间) |
| 崩溃影响 |
崩一个不影响其他进程 |
一个线程崩 → 整个进程崩 |
| 通信 |
要 IPC(管道/消息/共享内存) |
直接共享变量 + 锁同步 |
| 创建 |
慢(要新建地址空间/资源) |
快(复用进程资源) |
| 类比 |
一套房子 |
房子里的人 |
为什么进程切换重、线程切换轻
- 进程切换 = 换"房子":要换页表,TLB(地址缓存)失效,缓存重新加载 → 开销大
- 线程切换 = 房子里换人:不换地址空间,只换寄存器、栈指针 → 开销小
各有什么代价
- 线程:创建快、切换快、通信简单(共享内存)——但一个崩全崩、改共享变量会互相影响(必须同步)
- 进程:隔离稳(一个崩不影响其他)——但慢、通信要绕 IPC
为什么线程崩 = 进程崩,进程崩 ≠ 其他进程崩
- 线程共享进程的地址空间和资源 → 一个线程把共享内存写坏/崩溃,整个进程的资源跟着坏 → 进程挂
- 进程各有独立地址空间 → 一个进程内存错乱不影响别的进程(有隔离墙)
- 浏览器多标签页 = 每标签一个进程,这就是为什么一个标签崩了浏览器还活着
判别规则细化(怎么选)
- 要崩溃隔离(一个挂不能拖垮其他)→ 进程
- 要共享数据 + 轻快切换 → 线程
- 注意:线程共享变量必须同步(锁/原子/信号量),否则数据竞争
正反例(建立直觉)
- 正例1:浏览器多标签页,一个崩了不影响其他 → 进程隔离
- 正例2:一个程序里多个并发任务,都要访问同一份数据 → 线程
- 反例1:以为一个进程崩了整个系统就挂 → 错,进程隔离正是为了防这个
- 反例2:两个无关的应用用线程共享 → 错,要进程隔离,线程共享会互相污染
变体验证(3 题,全过=学会)
- 浏览器一个标签页崩了,其他标签页不受影响 → 多进程隔离(每标签一个进程,独立地址空间)
- 陷阱题:"线程间共享全局变量,所以不需要同步" → 错,共享正是要同步的原因;不锁会出现数据竞争(读改写被切开)
- 陷阱题:两个并发任务频繁交换数据 + 要轻快切换 → 线程(共享内存 + 切换轻;进程要 IPC 重)
口述要点(面试怎么讲)
- 结论先行:要隔离用进程,要轻快用线程
- 为什么进程切换重:换地址空间 → 换页表、TLB 失效、缓存重载;线程只换寄存器/栈指针
- 为什么线程崩 = 进程崩:共享地址空间和资源,一个线程坏了共享部分,整个进程跟着坏;进程有独立空间(隔离墙)
- 为什么进程通信麻烦:地址空间隔离,不能直接访问对方变量,必须经过内核搭桥(管道/消息/共享内存);线程共享同一块内存,直接读写 + 锁
- 易错点:以为线程不要同步;以为一个进程崩全系统崩;该隔离用线程导致互相污染
关系网络
| 相邻概念 |
关系 |
孤立理解会犯的错 |
| RTOS 任务 |
RTOS 任务 ≈ 线程(同一进程内并发) |
把 RTOS 任务当进程,以为有隔离 |
| 内存(地址空间) |
进程隔离的本质是地址空间隔离 |
以为隔离靠代码约定而非硬件 |
| IPC 通信 |
进程间要用 IPC,线程用共享变量 |
在进程间直接共享变量(不合法) |
| 互斥/同步 |
线程共享变量必须加锁 |
线程不加锁,数据竞争 |
学习日期
2026-08-18
每主题一页,复习时只翻本目录。