Appearance
题目
在采用页式虚拟存储管理方式的系统中,当发生上下文切换时,下列寄存器中操作系统不需要更新的是( )。
错因
A
把"通用寄存器和当前进程无关"当成想当然的事实。通用寄存器(如 x86 的 EAX/EBX、RISC 的 r1~rN)每个进程都用得不一样——A 进程算到一半的中间结果就在这些寄存器里。切到 B 进程之前必须把 A 的通用寄存器全部存回它的 PCB,再把 B 上次保存下来的通用寄存器写回 CPU,否则 B 一跑就会拿到 A 残留的脏数据。"通用寄存器是 OS 不管的"是错觉。
B
漏掉了"页式虚存"这个前提。每个进程有自己独立的页表,存在主存某个物理地址;CPU 通过**页表基址寄存器(PTBR / CR3)**找到当前进程的页表。切换进程时,新旧进程页表的物理位置完全不同——若不更新 PTBR,新进程会按旧进程的页表去翻译地址,立刻拿到错误的物理页。所以 PTBR 必须更新(同时还得刷 TLB,但这是另一回事)。
C
把"PC 是硬件自动管的"和"OS 不需要管 PC"混为一谈。PC(程序计数器)记录下一条指令地址——A 进程被切走时,它走到哪一行必须由 OS 保存进 PCB,下次再调度回 A 时再写回 PC,A 才能从断点继续。如果不更新 PC,切换回来 CPU 就会从错误的位置取指,等于程序乱跳。
总解析
判定原则:上下文切换中,"需要更新的寄存器" = "因进程而异、各进程值不同"的寄存器;"不需要更新的" = "整个系统全局共享、所有进程都一样"的寄存器。
逐项分析:
| 选项 | 寄存器 | 因进程而异? | 切换时是否更新 |
|---|---|---|---|
| A | 通用寄存器(GPR) | 是(进程的运算中间值) | 要更新(保存旧进程到 PCB,载入新进程) |
| B | 页表基址寄存器(PTBR/CR3) | 是(每进程独立页表) | 要更新(指向新进程页表的物理地址) |
| C | 程序计数器(PC) | 是(每进程执行点不同) | 要更新(保存断点 + 恢复新进程断点) |
| D | 内核中断向量表基址寄存器 | 否(系统全局共享) | 不需要更新 |
关键认知:中断向量表是整个 OS 内核唯一的一份——它记录了"中断号 i → 中断处理程序入口地址"的映射,所有进程进入内核处理中断/异常/系统调用时都查同一张表。其基址寄存器(如 x86 的 IDTR)在系统初始化时由 OS 写好,此后只要不重启或不进入多核迁移等极端情形,永远不变。换进程,跟它没关系。
口诀:"进程私有的要换,全局共用的不动"。
最终答案是 D。