Appearance
题目
在支持页式存储管理的系统中,进程切换时 OS 要执行( )。
Ⅰ. 更新 PC(程序计数器)值 Ⅱ. 更新栈基址寄存器值(ebp) Ⅲ. 更新页表基址寄存器值
错因
A
只记住了"进程切换 = 切地址空间",认为换一下页表基址就够了。但 PC 和栈也是上下文的核心组件——不切 PC,下一条指令就跑回旧进程的代码;不切栈基址,函数调用栈帧错位、局部变量乱串。三者一个都不能漏。
B
典型的"进程切换 vs 线程切换"混淆。线程切换只切 PC + 栈 + 寄存器(不切页表,因为同进程地址空间相同);进程切换还得切页表基址(地址空间私有)。选 B 的人按线程切换的思路想进程切换,漏掉了 Ⅲ。
C
记得"进程切换 = 切地址空间 + 切执行流",但把"栈"漏在外面——觉得栈基址寄存器不算"控制流"的一部分。但栈是进程私有数据,每个进程的栈在各自地址空间里有独立位置,必须切换基址。漏 Ⅱ 是对"栈也属于进程上下文"印象不深。
总解析
核心知识点:进程切换时,OS 必须保存原进程的完整 CPU 上下文,并恢复新进程的上下文。"完整"=能让新进程从原断点继续运行所需的所有状态。
进程上下文必含项:
| 寄存器 / 状态 | 是否更新 | 为什么 |
|---|---|---|
| PC(程序计数器) | ✓ | 决定下一条要执行的指令;不切就跑回旧代码 |
| 栈基址寄存器(ebp/rbp) | ✓ | 进程的栈在私有地址空间,不切则栈帧错位、局部变量乱串 |
| 页表基址寄存器(CR3 / TTBR0) | ✓ | 地址空间私有,不切则虚拟地址按旧进程页表翻译,访问的是别人的物理页 |
| 通用寄存器组 | ✓ | 中间运算结果都存在这里 |
| PSW / 状态字 | ✓ | 包含 ZF、SF、CF 等条件码,影响分支跳转 |
题面给出的 Ⅰ、Ⅱ、Ⅲ 都是必要项,三者一个都不能漏。
易混点:进程切换 vs 线程切换
| 切换类型 | PC | 栈基址 | 页表基址 | 通用寄存器 |
|---|---|---|---|---|
| 线程切换(同进程) | ✓ | ✓ | ✗(地址空间不变) | ✓ |
| 进程切换 | ✓ | ✓ | ✓ | ✓ |
进程切换比线程切换"重",重就重在切页表基址——连带 TLB 全部失效、Cache 命中率骤降,这是进程切换开销远大于线程切换的根本原因。
速记:执行流(PC)+ 数据流(栈)+ 地址空间(页表),进程切换三件套全要换。
最终答案是 D。