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