Appearance
上下文切换模拟器使用指南
考情分析
上下文切换本身不常单独出大题,但"模式切换 vs 进程切换"的区分是 408 的高频易错点,几乎每两年就以选择题或判断题出现。很多同学知道"保存寄存器、恢复寄存器"这几个字,但脑子里没有画面——到底保存什么?保存到哪里?模式切换和进程切换有什么区别?
这个模拟器用三个场景把这些问题变成你亲眼看到的动画:
| 考点 | 你会在哪个场景看到 | 考频 |
|---|---|---|
| CPU 寄存器与 PCB 的关系 | 探索结构 | 🔥🔥 |
| 模式切换 vs 进程切换的区别 | 模式切换 | 🔥🔥🔥 |
| 上下文切换的完整步骤 | 进程切换 | 🔥🔥 |
| 切换开销与 CPU 利用率 | 进程切换 | 🔥🔥 |
按顺序走完三个场景大约 15 分钟。走完之后再看选择题,你不用死记硬背,靠画面就能选对。
场景一:探索结构
打开模拟器后默认进入这个场景。你看到的是三个核心结构:
一眼看懂的三件事
1. CPU 寄存器(中间大方框)
6 个寄存器槽位 + 底部 PSW 栏。这些就是进程运行时 CPU 里"活跃的数据":
| 寄存器 | 作用 | 考试怎么考 |
|---|---|---|
| R0 - R3 | 通用寄存器,存运算中间结果 | 上下文切换时必须保存 |
| PC | 程序计数器,下一条指令地址 | 最常考——切换后从哪继续执行 |
| SP | 栈指针,当前栈顶 | 函数调用相关 |
| PSW | 程序状态字,包含模式位 | 模式切换的核心 |
2. PCB 卡片(左右两侧)
蓝色是进程 A 的 PCB,橙色是进程 B 的 PCB。每张卡片里有相同的 6 个寄存器行——这就是"寄存器保存区"。注意看:CPU 里的值和 PCB A 的值完全一样——因为当前是进程 A 在运行。
关键认知
CPU 寄存器里的值 = 当前运行进程的上下文。进程不运行时,这些值保存在它的 PCB 里。
3. 就绪队列(底部)
显示哪些进程在等待 CPU、哪个正在运行。进程 B 和 C 在就绪队列,进程 A 显示为"运行中"。
你应该注意的
- CPU 寄存器值的颜色和当前运行进程一致(蓝色 = 进程 A),后面切换时颜色会变
- PSW 底栏显示绿色"用户态"——模式位的可视化
场景二:模式切换(最重要的场景)
点击"模式切换"标签,进入本模拟器最核心的场景——因为它对应的是 408 最常出错的考点。
这个场景在演示什么
进程 A 执行 read() 系统调用:用户态 → 内核态 → 用户态。全程只有进程 A,没有任何进程切换。
六个阶段
每一步都可以用 ⏮ / ⏭ 手动推进:
| 阶段 | 你能看到什么 | 重点观察 |
|---|---|---|
| ① 用户态运行 | CPU 显示 A 的值,PSW 绿色"用户态" | 正常运行状态 |
| ② 系统调用 | CPU 下方出现"系统调用 read()" | 系统调用是主动进入内核的方式 |
| ③ 模式切换 | PSW 从绿变红,"核心态",上方出现"模式切换"标签 | 只有 PSW 变了!寄存器值没动! |
| ④ 内核执行 | CPU 方框出现淡红遮罩 | 内核在核心态处理 read() |
| ⑤ 返回用户态 | PSW 从红变回绿,"用户态" | 又一次模式切换(反向) |
| ⑥ 继续运行 | 和第①步完全一样 | 进程 A 像什么都没发生一样继续执行 |
关键观察:寄存器值始终没有变
从①到⑥,CPU 里的寄存器值始终是 0x0A01、0x0A02...。没有任何值被保存到 PCB,也没有从其他 PCB 恢复。这就是模式切换的本质——只改 PSW 模式位,不动寄存器。
对比场景三,你会看到完全不同的情况。
右侧面板的对比表
场景二右侧始终显示一张"模式切换 vs 进程切换"对比表。建议截图保存,考前翻一遍:
| 模式切换 | 进程切换 | |
|---|---|---|
| 触发 | 系统调用、中断、异常 | 时间片到、阻塞、抢占 |
| 操作 | 仅改 PSW 模式位 | 保存/恢复整个 PCB |
| 开销 | 小 | 大 |
| 关系 | 进程切换 ⊃ 模式切换 |
四条必记结论
右侧"易错点"区域列出了四条判断题常考的结论:
- 系统调用一定引起模式切换 ✓
- 系统调用不一定引起进程切换 ✓
- 进程切换一定包含模式切换 ✓
- 模式切换不一定伴随进程切换 ✓
这四条不用死记——看完场景二和场景三的对比,它们就是显而易见的。
场景三:进程切换
点击"进程切换"标签。这个场景多了进程 C(绿色 PCB),底部出现 CPU 时间分配条。
这个场景在演示什么
进程 A 时间片用完 → 中断 → 内核保存 A 的寄存器 → 调度器选 B → 恢复 B 的寄存器 → B 运行。完整的上下文切换。
八个阶段
| 阶段 | 你能看到什么 | 对比场景二 |
|---|---|---|
| ① 进程 A 运行 | CPU 蓝色,PSW 绿色 | 和场景二①一样 |
| ② 时钟中断 | CPU 闪烁红色遮罩,"时钟中断" | 场景二是主动系统调用,这里是被动中断 |
| ③ 进入内核 | PSW 变红 | 和场景二③一样——都是模式切换 |
| ④ 保存上下文 | CPU 寄存器值"飞"到左侧 PCB A 卡片 | ⭐ 场景二没有这一步! |
| ⑤ 调度决策 | "调度器选择下一个进程",PCB B 高亮 | 场景二没有这一步 |
| ⑥ 恢复上下文 | PCB B 的值"飞"回 CPU,CPU 变橙色 | ⭐ 场景二没有这一步! |
| ⑦ 返回用户态 | PSW 变回绿色 | 和场景二⑤一样 |
| ⑧ 进程 B 运行 | CPU 橙色,就绪队列更新 | 场景二始终是进程 A |
重点看第④和第⑥步
第④步保存:6 个彩色方块从 CPU 飞向 PCB A——这就是"保存上下文到 PCB"。
第⑥步恢复:6 个彩色方块从 PCB B 飞回 CPU——CPU 寄存器值全部换成 B 的(0x0B01、0x0B02...),颜色从蓝变橙。
这两步就是进程切换比模式切换多出来的开销。 场景二里这两步不存在,所以模式切换开销小。
继续切换:观察开销累积
到第⑧步后,右下角出现"继续切换"按钮。点击后开始下一轮:B → C。
每轮切换后,右侧面板和底部时间条会更新:
| 指标 | 1 次切换后 | 2 次切换后 | 3 次切换后 |
|---|---|---|---|
| 切换次数 | 1 | 2 | 3 |
| 有效工作 | 10 单位 | 15 单位 | 20 单位 |
| 切换开销 | 3 单位 | 6 单位 | 9 单位 |
| CPU 利用率 | 76.9% | 71.4% | 69.0% |
注意利用率在下降——切换越频繁,浪费在"搬寄存器"上的时间越多。
底部时间分配条
彩色横条直观展示 CPU 时间去哪了:
[ A 蓝色 ] [灰色切换] [ B 橙色 ] [灰色切换] [ C 绿色 ]灰色段就是纯开销——CPU 在做家务(搬寄存器),不干正事。时间片越短,灰色段占比越高。
考试公式
右侧始终显示:
其中 q = 时间片长度,δ = 上下文切换开销。
计算题典型问法
时间片 = 20ms,上下文切换 = 5ms,求 CPU 利用率。
答:
如果时间片改为 5ms:
在模拟器里多点几次"继续切换",看利用率数字一步步下降,比背公式记得牢。
三个场景的对比总结
走完三个场景后,你脑子里应该有这张清晰的对比图:
| 场景二:模式切换 | 场景三:进程切换 | |
|---|---|---|
| PSW 变色 | ✓ 绿→红→绿 | ✓ 绿→红→绿 |
| 寄存器值搬运 | ✗ 没有 | ✓ CPU↔PCB 飞行动画 |
| CPU 颜色变化 | ✗ 始终蓝色 | ✓ 蓝→橙 |
| 就绪队列变化 | ✗ 不变 | ✓ 进程轮换 |
| 开销 | 小(只改 PSW) | 大(保存+调度+恢复) |
一句话总结:模式切换只是"换帽子"(PSW 变色),进程切换是"换人"(寄存器全搬)。
推荐使用流程
第一轮:建立直觉(8 分钟)
- 探索结构(2 分钟):看 CPU 寄存器和 PCB 卡片的对应关系,注意值和颜色
- 模式切换(3 分钟):0.5x 慢速走完 6 步,重点看 PSW 颜色变化,确认寄存器值不动
- 进程切换(3 分钟):0.5x 慢速走完 8 步,重点看第④⑥步的飞行动画
第二轮:对比记忆(5 分钟)
- 回到场景二,快速走完,在第③步暂停——PSW 变红,寄存器没动
- 切到场景三,走到第④步暂停——PSW 变红,而且寄存器在搬运
- 对比右侧面板:场景二写"仅模式切换",场景三写"保存上下文到 PCB"
- 这个对比就是考试要你分清的东西
第三轮:做题验证(按需)
拿一道选择题,心里回忆场景画面,然后选答案。比如:
"中断处理一定会引起进程切换吗?"
回忆场景二:系统调用(也是一种中断)只引起了模式切换,进程 A 从头到尾没换。答案:不一定。
考研高频考点速览
| 考点 | 考频 | 关键记忆 |
|---|---|---|
| 模式切换 vs 进程切换 | 🔥🔥🔥 | 模式切换只改 PSW;进程切换保存/恢复整个 PCB |
| 系统调用与模式切换的关系 | 🔥🔥🔥 | 系统调用一定模式切换,不一定进程切换 |
| 上下文切换保存的内容 | 🔥🔥 | PC、PSW、通用寄存器、栈指针 → 全部保存到 PCB |
| 切换开销与时间片的关系 | 🔥🔥 | CPU 利用率 = q/(q+δ),时间片越短利用率越低 |
| PCB 是进程存在的唯一标志 | 🔥🔥 | 进程创建时建 PCB,终止时撤 PCB |
| 一次进程切换包含两次模式切换 | 🔥 | 用户→内核(处理中断)→ 用户(新进程运行) |