进程 = 运行中的程序,资源分配单位;线程 = 进程内执行流,CPU 调度单位。
进程 = 程序 + 数据 + PCB。同一程序可对应多个进程(两个终端跑同一个 bash)。
五状态模型(三态 + 新建/终止):
创建 就绪 ──调度──→ 运行 ──完成──→ 终止
new → ready ←──┐ running exit
│ │ 时间片用完/被抢占
│ └──────→ 运行
I/O完成 │
│ │ 等待 I/O / 事件
等待 ←───────────┘
waiting
PCB 是进程存在的唯一标志。典型字段:
| 字段 | 内容 |
|---|---|
| 标识符 | PID、父进程 PPID |
| 处理机状态 | 寄存器现场(上下文,切换时保存) |
| 调度信息 | 优先级、状态、时间片 |
| 内存信息 | 代码/数据段基址、页表指针 |
| 资源清单 | 打开的文件、信号量等 |
| I/O 状态 | 分配的设备、缓冲区 |
上下文切换:保存当前现场到其 PCB,从新进程 PCB 恢复现场——纯开销,无用户价值。
线程共享进程的代码段、数据段、打开的文件;独享栈、寄存器、PC。
| 维度 | 进程 | 线程 |
|---|---|---|
| 资源 | 拥有独立资源 | 共享进程资源 |
| 调度 | 资源分配单位 | CPU 调度单位 |
| 独立性 | 相互隔离,一进程崩溃不影响他人 | 共享内存,一个崩可能全崩 |
| 开销 | 创建/切换大(分配 PCB、页表等) | 创建/切换小(只换栈和寄存器) |
| 通信 | 需 IPC(管道、消息队列、共享内存) | 直接读写共享变量 |
| 用户级线程 | 内核级线程 | |
|---|---|---|
| 管理者 | 用户态线程库 | 内核 |
| 内核感知 | 不可见,内核只看到一个进程 | 可见,每个线程有 TCB |
| 切换开销 | 小(无陷入) | 大(需系统调用/陷入) |
| 阻塞 | 一个线程阻塞,整个进程阻塞 | 一个线程阻塞,其他可继续 |
| 多核 | 无法并行到多核 | 可真正并行 |
| 代表 | 绿色线程 | Linux pthread |
三种映射:多对一(多 ULT 对 1 KLT)、一对一(Linux 主流)、多对多(折中)。