主题
概念卡片:进程与线程
一句话机制:进程是操作系统资源分配的最小单位,线程是 CPU 调度执行的最小单位。 进程是「正在执行的程序」的动态实例,拥有独立地址空间;线程是进程内的执行单元,共享进程地址空间。并发是「单核时间片轮流交替」,并行是「多核真正同时」。
进程 vs 线程(完整对比)
| 维度 | 进程 | 线程 |
|---|---|---|
| 本质 | 资源分配最小单位 | 调度执行最小单位 |
| 地址空间 | 独立 | 同进程线程共享 |
| 切换开销 | 大(上下文重) | 小(轻量级) |
| 健壮性 | 一个崩溃不波及其他 | 一个崩溃全进程死 |
| 资源 | 独立代码/数据空间 + 独立运行栈/PC | 共享代码/数据,独立运行栈/PC |
| 并发 | 可跨机器迁移 | 适合 SMP 单机 |
根本区别只有一条:进程有独立地址空间,线程共享地址空间,其余所有差异都由它派生(速度、通信方式、同步需求)。
进程状态模型
| 模型 | 状态 |
|---|---|
| 三态 | 就绪 → 执行 → 阻塞 |
| 五态 | + 创建(建 PCB、加载程序)、终止(回收资源) |
| 七态 | + 挂起就绪(对换到辅存)、挂起阻塞 |
- 就绪:除 CPU 外资源齐备,一拿到 CPU 即执行。
- 执行:正在 CPU 上运行(单核任意时刻只有一个)。
- 阻塞:等待某事件(I/O),CPU 空闲也不能运行。
- PCB(进程控制块):存放进程管理与控制信息的数据结构,是进程存在的唯一标志。
进程调度算法
| 算法 | 思路 | 特点 |
|---|---|---|
| FCFS 先来先服务 | 按进入就绪队列顺序 | 简单,对短作业不友好 |
| SJF 短作业优先 | 选估计运行时间最短的 | 照顾短作业、饿死长作业 |
| RR 时间片轮转 | 每个进程分配一个时间片 | 最公平、最常用 |
| 多级反馈队列 | 多队列 + 优先级 + 时间片 | 兼顾高优先级响应与短作业,UNIX 采用 |
| 优先级调度 | 按优先级执行,同级 FCFS | 可能低优先级饿死 |
为什么有了进程还要线程?
进程隔离性好但切换开销大、并发粒度粗。线程共享地址空间,切换/通信快、资源利用率高,适合同一任务内的并发(如 Web 服务器一个请求一个线程)。
不变量(必须成立的约束)
- 进程 = 资源单位,线程 = 调度单位;线程不能独立执行,必须依附进程。
- 同进程线程共享地址空间,因此用公共变量必须同步;进程间地址空间隔离,天然无需同步。
- 单核任意时刻只有一个进程处于执行态。
常见误解
- 以为「线程比进程快就一定更好」→ 线程崩溃拖垮全进程,隔离性场景必须用进程。
- 以为「并发和并行是一回事」→ 并发是时间片交替(逻辑同时),并行是多核真同时。
- 以为「程序 = 进程」→ 程序是静态文本,进程是动态执行实例,二者非一一对应。
关联
- IPC 与同步:概念卡片:进程间通信与线程同步
- 死锁:概念卡片:死锁
- 总览:操作系统技术栈总览