Appearance
题目
若某单处理器多进程系统中有多个就绪态进程,则下列关于处理机调度的叙述中,错误的是( )。
错因
A
A 是对的——进程结束时 CPU 必然空出来要选下一个进程跑,是最自然的调度时机。题问"错误的",A 是对的所以不该选;选了 A 多半是看错"错误"两字。
B
B 也是对的——新进程创建后也是常见调度时机:可能新进程优先级更高、需要立刻调度选它跑。比如 fork 后子进程是否立即抢占父进程,是调度策略问题,但调度时机本身是允许的。
D
D 也是对的——系统调用从内核态返回用户态前,OS 通常会做一次调度检查(看有没有更高优先级的进程在就绪队列里、当前进程时间片是否用完等)。Linux 内核的"返回用户态前的调度点"就是这条。
总解析
题问"错误的"。先把"调度时机"梳理清楚:
| 时机 | 是否可调度 | 说明 |
|---|---|---|
| 进程结束 | ✓ | CPU 自然空出 |
| 创建新进程 | ✓ | 新进程进入就绪队列,可能触发抢占 |
| 时间片用完 | ✓ | RR 经典时机 |
| 阻塞(等 I/O 等) | ✓ | 当前进程让出 CPU |
| 从内核态返回用户态 | ✓ | 检查就绪队列是否有更高优先级 |
| 进程在临界区 | ✓(用户级临界区) | 临界区只是同步保护、不阻止 CPU 调度 |
C 错在哪里:
临界区(用户级互斥保护的代码段)和处理机调度是两件不同的事:
- 临界区 解决的是"多个进程不能同时进入这段代码"——靠互斥锁 / 信号量保证
- 调度 决定"CPU 给哪个进程用"——靠调度算法
进程在临界区时仍可被调度让出 CPU——它退出时不释放锁就行。被调度走后另一个进程上来,如果也想进同一个临界区会被锁挡住、阻塞等。临界区不阻止调度。
区分:内核临界区(不可抢占内核区) 是另一回事——某些操作在内核里不允许被打断,OS 会临时禁用抢占;但题面说"进程处于临界区"通常指用户级临界区,不影响调度。即使按内核临界区理解,"不能调度"也不是绝对真理(依内核设计而定),不应该被作为绝对正确的命题。
逐项核对:
| 选项 | 描述 | 判定 |
|---|---|---|
| A | 进程结束时调度 | ✓ |
| B | 创建新进程后调度 | ✓ |
| C | 临界区时不能调度 | ✗ 错 —— 临界区不阻止调度,进程仍可被切走 |
| D | 返回用户态时调度 | ✓ |
最终答案是 C。