Appearance
题目
下列选项中,操作系统在终止进程时不一定执行的是( )。
错因
B
想到"如果进程使用共享内存呢,要不要回收?"——觉得这种"特殊情况"让 B 不一定。但共享内存只是引用计数减 1(不是不动),进程私有的栈、堆、数据段必须回收,否则下次该地址被新进程使用时会出错。任何进程终止都涉及内存回收,没有例外。
C
受 Linux 僵尸进程模型影响——exit 之后 PCB 似乎还残留等父进程 wait,于是怀疑 PCB 不一定撤销。但考研语境下"终止进程" = 完整终止流程(exit + wait 合流),PCB 最终必被撤销。否则进程号永远占用、僵尸越积越多,系统会枯竭。OS 教材定义的"终止"动作集里,最后一步就是撤销 PCB。
D
注意到"进程不一定占用设备"——这思路有一定道理(但还不够精确)。区别在:D 描述的"回收占用的设备"是无条件清理步骤,OS 终止流程会扫描设备占用表,对每个占用的设备执行释放——即便表为空,"扫描+释放"的动作仍要走(对空集合执行)。而 A 的"终止子进程"则是流程里有明显的条件分支(if 子进程列表非空),分支可能根本不进入。考研题钉死答案 A 而非 D,区别就在这里。
总解析
判定思路:题目问"不一定执行"——找一个仅在特定条件下才发生的动作。其余三项都是终止流程的标准清理步骤。
进程终止的标准动作集(OS 教材统一描述):
- 找到进程 PCB
- 终止运行(如果在执行)
- 回收所有资源(内存、文件、I/O 设备等)→ B、D
- 撤销 PCB → C
- 若该进程有子进程,递归终止(级联终止)→ A
- 若有等待该进程的父进程,唤醒之
逐项核对:
| 选项 | 是否必做 | 触发条件 |
|---|---|---|
| A 终止子进程 | 不一定 | 仅当该进程有子进程时才进入级联终止分支 |
| B 回收内存资源 | 必做 | 进程必然占用内存(至少代码段+栈),不回收会泄漏 |
| C 撤销 PCB | 必做 | PCB 是 OS 识别进程的唯一标识,不撤销 = 进程没真正终止 |
| D 回收占用的设备 | 必做(流程层面) | 终止流程的标准步骤,扫描+释放动作总要执行 |
核心区分:A 是有逻辑分支的步骤(if 有子进程);B/C/D 是无条件的清理步骤——即使作用对象为空(如不占用任何设备),扫描动作仍会跑一次。
速记:进程一定有 PCB 和内存,可能没设备但流程必扫,唯一可能跳过整段动作的就是"终止子进程"——没有子进程就完全不进入这个分支。
最终答案是 A。