上下文切换是 CPU 从一个可运行执行实体转去运行另一个实体时,保存前者可恢复执行所需状态并恢复后者状态的过程。具体保存内容由体系结构和内核实现决定,通常包括通用寄存器、程序计数器、栈指针、处理器状态等;内核还维护调度实体状态、内核栈和相关资源引用。
线程切换与进程切换不能简单等同。线程是执行调度实体,属于某进程;同一进程的两个线程通常共享地址空间,切换时无需改变用户地址空间映射。切换到另一个进程的线程时,内核可能要切换地址空间标识/页表上下文;具体成本受硬件地址空间标识、PCID 等机制影响,并非每次都清空全部 TLB。
切换成本不只有保存寄存器的几条指令。调度决策、内核入口与返回、缓存工作集被新任务挤出、分支预测状态变化、TLB 命中率下降,以及被切出线程持有锁造成的等待,都可能扩大实际影响。阻塞系统调用或中断可能触发调度,但系统调用/态切换本身不必然意味着切换到另一个线程。
线程切换基本步骤
发生抢占、阻塞或主动让出时,内核保存当前执行实体状态并更新其状态,调度器选择下一个可运行实体,内核切换必要的内核栈和地址空间状态,恢复新实体寄存器,最后返回到其用户态或内核态执行点。保存位置不一定是一个名为 TCB 的单一结构;不同系统把状态拆放在任务结构、内核栈和 CPU 状态中。
常见追问
Q:线程切换一定比进程切换快吗?
A:同进程线程通常可少一次地址空间切换,但两类切换仍有调度和缓存成本;不同实现、工作集与硬件条件会影响实际开销,不能只凭定义给出固定倍数。
Q:系统调用一定产生上下文切换吗?
A:不一定。系统调用通常有用户态/内核态转换,若调用完成后原线程继续运行,则没有切到另一个线程。
Q:切换进程后 TLB 一定清空吗?
A:不一定。处理器和内核可能使用地址空间标识保留多个进程的 TLB 项;是否失效以及失效范围依架构和映射变更而定。