41.进程-vs-线程.md 5.2 KB

进程 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


每主题一页,复习时只翻本目录。