定义

  • 线程(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 刷新),开销大