首页/操作系统/进程管理/上下文切换 🔗 在 Obsidian 中打开
操作系统 · 进程管理

上下文切换

重要度 ★★★★ 上下文切换进程切换模式切换
速查
上下文切换=保存旧进程 CPU 状态到 PCB、从新进程 PCB 恢复 CPU 状态。进程切换一定包含模式切换,反之不然。最大开销来自切换地址空间(TLB 刷新 + Cache 失效)。

基本概念

上下文切换(Context Switch)是操作系统将 CPU 从一个进程切换到另一个进程的过程:保存当前进程的执行状态,恢复新进程的执行状态。

保存内容PC、通用寄存器、PSW、栈指针等 → 存入该进程的 PCB。注意:保存的是寄存器状态,不是整个进程数据。

上下文切换步骤

  1. 保存当前进程的 CPU 寄存器状态到其 PCB
  2. 更新当前进程的 PCB 状态(运行态 → 就绪/阻塞)
  3. 将当前 PCB 加入相应队列
  4. 从就绪队列中选择新进程(调度)
  5. 更新新进程 PCB 状态为运行态
  6. 从新进程 PCB 恢复 CPU 寄存器状态
  7. 刷新 TLB 和 Cache(若切换了地址空间)
  8. 跳转到新进程的 PC 继续执行
① 保存寄存器→ PCB ② 更新 PCB入队列 ③ 调度新进程选就绪 ④ 恢复寄存器← 新PCB ⑤ 刷新TLB/Cache
点击「下一步」逐步查看上下文切换流程

上下文切换 vs 模式切换

对比项模式切换上下文切换
触发原因系统调用、中断进程调度
地址空间不切换可能切换
TLB / Cache不失效可能失效
开销较小较大
包含关系是上下文切换的一部分一定包含模式切换
关键点上下文切换一定包含模式切换;模式切换不一定导致上下文切换(如系统调用后返回同一进程)。

开销来源

开销来源说明
保存/恢复寄存器所有 CPU 寄存器写入/读取 PCB
切换地址空间切换页表基址寄存器(如 CR3)
TLB 刷新新地址空间的 TLB 条目失效
Cache 失效旧进程 Cache 数据可能无用
调度开销选择新进程的时间
注意同进程内线程切换不需要切换地址空间,因此比进程切换快得多。上下文切换本身是纯开销(切换期间 OS 不做有用工作)。

易错点

必记
  1. 上下文切换一定包含模式切换,但模式切换不一定导致上下文切换。
  2. 保存的是CPU 寄存器状态到 PCB,不是整个进程数据。
  3. 同进程内线程切换不需要切换地址空间,开销远小于进程切换。
  4. 上下文切换是纯开销——OS 在切换期间不做有用工作。
  5. 切换地址空间最昂贵——会导致 TLB 全部失效。

记忆卡片

切换保存什么到哪里?
保存 CPU 寄存器状态(PC、寄存器、PSW)到进程的 PCB。
与模式切换的关系?
上下文切换一定包含模式切换;模式切换不一定导致上下文切换。
最大开销来源?
切换地址空间(导致 TLB 刷新和 Cache 失效)。
线程切换为何更快?
不需要切换地址空间,TLB 和 Cache 不失效。
如何减少切换开销?
增大时间片、用线程代替进程、减少进程数。
上下文切换是有效工作吗?
不是,是纯开销,期间 OS 不做有用工作。

交互动画 · 上下文切换:保存 / 恢复 PCB 现场

手动模式
进程 A(运行中) CPU:PC=0x1004 · 寄存器现场地址空间 A · 页表/TLB 指向 A 进程 B(就绪) CPU:PC=0x2000 · 寄存器现场地址空间 B · 页表/TLB 指向 B PCB(进程控制块,内核保存现场) PCB-A:保存 PC/寄存器+ 状态/优先级/指针 PCB-B:保存 PC/寄存器+ 状态/优先级/指针 CPU 现场槽 PC / 通用寄存器 / PSW任一时刻只属于一个进程 切换五步 1 2 3 4 5
保存 A 现场 → 更新 PCB-A → 选 B → 载入 PCB-B → 恢复 B 现场
点击「播放」或「下一步」,走一遍 A→B 的完整上下文切换
上下文切换开销:地址空间切换(TLB 刷新 + Cache 失效)最贵
变量配色:进程 A · 进程 B · 切换五步,高亮即当前动作对象。

相关知识点

process-and-thread process-control-block-pcb

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。