定义
- 线程(Thread)是 CPU 调度的基本单位,轻量级进程(Lightweight Process)
- 一个进程可以包含多个线程
- 同一进程的线程共享进程的地址空间和资源
- 每个线程拥有独立的:线程 ID、程序计数器(PC)、寄存器集合、栈
TCB(线程控制块)
- 包含:线程 ID、程序计数器、寄存器集合、栈指针
- 相比 PCB,内容更少,切换更快
引入原因
- 进程切换开销大(需切换地址空间、TLB 刷新)
- 进程间通信复杂(需 IPC 机制)
- 需要更轻量级的并发执行单元以支持高并发
进程 vs 线程
| 方面 | 进程 | 线程 |
|---|
| 资源拥有 | 独立的地址空间和资源 | 共享所属进程的资源 |
| 调度单位 | 资源分配单位 | CPU 调度单位 |
| 切换开销 | 大(需切换地址空间、刷新 TLB) | 小(仅保存/恢复寄存器+栈) |
| 通信方式 | 需 IPC 机制(管道、消息队列、共享内存等) | 直接读写共享内存/全局变量 |
| 拥有者 | 操作系统管理 | 用户库 或 操作系统管理 |
| 独立性 | 进程间相互独立,一个崩溃不影响其他 | 线程间共享,一个线程崩溃可能导致整个进程崩溃 |
线程优势
- 低开销:创建和撤消线程的开销远小于进程
- 快速切换:同一进程内的线程切换只需保存/恢复少量寄存器
- 高效通信:线程间通过共享内存直接通信,无需内核介入
- 高并发:一个进程可轻松创建成百上千个线程,适合高并发服务(如 Web 服务器)
线程分类
用户级线程(User-Level Thread, ULT)
- 由用户空间的线程库管理(如 POSIX Pthreads 用户态实现)
- 内核完全不知晓线程的存在,内核调度的是进程
- 线程切换无需陷入内核,切换速度极快
- 缺点:一个线程阻塞(如 I/O)会导致整个进程所有线程阻塞
内核级线程(Kernel-Level Thread, KLT)
- 由操作系统内核直接管理
- 内核知道每个线程的存在,调度以线程为单位
- 线程阻塞不影响同一进程中的其他线程
- 缺点:线程切换需要陷入内核,开销比用户级大
混合模式(Combined)
- 用户级线程复用到内核级线程上
- 应用可创建大量用户级线程,映射到较少的内核级线程
- 兼顾用户级的快速切换和内核级的阻塞不阻塞
线程切换开销分析
- 同一进程内线程切换:仅需切换寄存器和栈,无需切换地址空间(TLB 有效),开销小
- 不同进程间线程切换:需切换地址空间(TLB 刷新),开销大