Appearance
题目
进程 P1、P2 和 P3 进入就绪队列的时刻、优先级(越大优先权越高)以及 CPU 的执行时间如下表所示。
| 进程名 | 进入就绪队列的时刻 | 优先级 | CPU 执行时间 |
|---|---|---|---|
| P1 | 0ms | 1 | 60ms |
| P2 | 20ms | 10 | 42ms |
| P3 | 30ms | 100 | 13ms |
系统采用基于优先权的抢占式 CPU 调度算法,从 0ms 时刻开始进行调度,则 P1、P2 和 P3 的平均周转时间为( )。
错因
A
60 ms 离正解就差 1——典型的"算时刻点漏一两个 ms"的粗心失误。比如把 P3 完成时刻写成 t=42 而不是 t=43,或者 P1 最终完成时刻写成 114 ms,心算抢占切换的瞬间最容易在这种地方掉单位。
C
70 ms 多半是把"P3 跑完后由谁继续"判错了。按抢占式优先级,P3 在 t=43 完成时,就绪队列里 P2(优先级 10) > P1(优先级 1),应当 P2 续跑。如果顺手当成 FCFS 让 P1 在 t=43 接续,P1、P2 的完成时刻互换,整体周转时间和就被推高。
D
71 ms 常见是漏掉某次抢占——比如认为 P3 在 t=30 到达时不能立刻抢占 P2,得等 P2 跑完才上 CPU。漏一次抢占就让三个进程的时间线整体后移、周转时间集体变大。
总解析
题面有两个约束要扣紧:优先级值越大越高(注意和有些题"越小越高"反过来)+ 抢占式。
事件来源:进程到达 / 进程结束,每次都重新选当前就绪队列里的最高优先级。
| 时刻 | 事件 | 当前进程 | 决策 |
|---|---|---|---|
| 0 | P1 到达 | 空闲 | 启动 P1(唯一进程) |
| 20 | P2(10) 到达 | P1(1) 跑了 20ms 剩 40 | P2 抢占(10 > 1) |
| 30 | P3(100) 到达 | P2(10) 跑了 10ms 剩 32 | P3 抢占(100 > 10) |
| 43 | P3 跑完结束 | — | 候选 P1(1)、P2(10) → P2 续(10 > 1) |
| 75 | P2 跑完结束 | — | 队列里只剩 P1 → P1 续 |
| 115 | P1 跑完结束 | — | 全部完成 |
各进程周转时间 = 完成时刻 − 进入时刻:
| 进程 | 进入 | 完成 | 周转时间 |
|---|---|---|---|
| P1 | 0 | 115 | 115 ms |
| P2 | 20 | 75 | 55 ms |
| P3 | 30 | 43 | 13 ms |
平均周转时间:
最终答案是 B。