Appearance
题目
进程 P0、P1、P2 和 P3 进入就绪队列的时刻、优先级(值越小优先权越高)及 CPU 执行时间如下表所示。
| 进程 | 进入就绪队列的时刻 | 优先级 | CPU 执行时间 |
|---|---|---|---|
| P0 | 0 ms | 15 | 100 ms |
| P1 | 10 ms | 20 | 60 ms |
| P2 | 10 ms | 10 | 20 ms |
| P3 | 15 ms | 6 | 10 ms |
若系统采用基于优先权的抢占式进程调度算法,则从 0ms 时刻开始调度,到 4 个进程都运行结束为止,发生进程调度的总次数为( )。
错因
A
只数了"运行进程发生变化"的几次(P0→P2、P2→P3、P3→P2、P2→P0),4 次切换。漏掉了 t=0 启动 P0 也算一次调度,以及 P0 结束后切到 P1 同样要从就绪队列里挑——只要"重新决定 CPU 给谁"就是一次调度。
B
漏了一次。常见漏法是把 t=0 启动 P0 默认成"开机自动跑"不计入;或者觉得 P0 跑完只剩 P1 一个候选"没得选了"——但 OS 还是要走一次调度流程从就绪队列里把 P1 拎出来。
D
把 t=10 时 P1、P2 同时到达数成了两次调度。但 P1 的优先级 20 比当前正在跑的 P0(15)还低,根本上不了 CPU——进入就绪队列不等于发生调度。同一时刻多个进程到达,至多触发一次调度(看最高优先级那个是否抢占)。
总解析
题面有两个关键约束要扣紧:优先级值越小越高 + 抢占式。每次"有事件发生"都要重新看一眼当前队列里的最高优先级是不是仍然在跑——只要"重新选了一次",调度次数就 +1。
事件来源就三类:进程到达、进程结束、(抢占式独有的)新到的优先级比当前高。逐事件推:
| 时刻 | 事件 | 当前进程 | 就绪队列最高优先级 | 决定 | 计数 |
|---|---|---|---|---|---|
| 0 | P0 到达 | 空闲 | P0(15) | 启动 P0 | ① 调度 |
| 10 | P1(20)、P2(10) 到达 | P0 跑了 10ms 剩 90 | P2(10) < P0(15) | P2 抢占 | ② 调度 |
| 15 | P3(6) 到达 | P2 跑了 5ms 剩 15 | P3(6) < P2(10) | P3 抢占 | ③ 调度 |
| 25 | P3 跑完结束 | — | P2(10) 最高 | 继续 P2 | ④ 调度 |
| 40 | P2 跑完结束 | — | P0(15) 最高 | 切到 P0 | ⑤ 调度 |
| 130 | P0 跑完结束 | — | P1(20) 唯一 | 切到 P1 | ⑥ 调度 |
| 190 | P1 结束 | — | 队列空 | 全部完成 | — |
合计 6 次。
注意 t=10 时 P1 也到达,但它的优先级 20 比正在跑的 P0(15) 还低,连"被考虑"的资格都没有,不增加调度次数。
最终答案是 C。