Appearance
题目
系统采用二级反馈队列调度算法进行进程调度。就绪队列 Q1 采用时间片轮转调度算法,时间片为 10ms;就绪队列 Q2 采用短进程优先调度算法;系统优先调度 Q1 队列中的进程,当 Q1 为空时系统才会调度 Q2 中的进程;新创建的进程首先进入 Q1;Q1 中的进程执行一个时间片后,若未结束,则转入 Q2。若当前 Q1,Q2 为空,系统依次创建进程 P1,P2 后即开始进程调度,P1,P2 需要的 CPU 时间分别为 30ms 和 20ms,则进程 P1,P2 在系统中的平均等待时间为( )。
错因
A
把"等待时间"算成了"周转时间"再凑除法:(50+30)/2 = 40 不对,再调成 25。等待时间和周转时间是两个量:周转 = 完成时刻 − 到达时刻,等待 = 周转 − CPU 时间。混用就会得到 25 这种"差不多但不对"的数。
B
把 P1 的等待时间(20ms)当成两人的平均了,没有把 P2 那一段(10ms)拉低进去——实际平均是 (20+10)/2 = 15。也可能是把"等待 Q2 期间的时间段"重复算或者算错了——P2 在 Q2 里只等了 0ms(Q1 一空它就被 SJF 选中跑),漏了这点会高估。
D
把"P2 的等待时间 10ms"直接当成平均,忽略 P1 等待 20ms。或者反过来:只算 Q1 阶段每人各等 10ms,把 Q2 阶段的等待忘了——其实 P1 在 Q2 里还要再等 P2 跑完 10ms 才轮到自己,光算 Q1 一段不够。
总解析
二级反馈队列规则:Q1 RR 时间片 10ms,Q2 SJF;Q1 优先;新进程进 Q1,跑一个时间片没结束就降级到 Q2。P1 P2 同时刻 (T=0) 到达,P1 先创建排在 P2 前。
逐时段推演调度:
| 时段 | 谁在跑 | 行为 | Q1 状态 | Q2 状态 |
|---|---|---|---|---|
| 0 ~ 10 | P1(Q1 队首) | 跑完 10ms 时间片,剩 20ms → 降级到 Q2 | [P2] | [P1(20)] |
| 10 ~ 20 | P2(Q1 队首) | 跑完 10ms 时间片,剩 10ms → 降级到 Q2 | [] | [P1(20), P2(10)] |
| Q1 空 → 调度 Q2 SJF | P2 剩 10 < P1 剩 20 → 选 P2 | |||
| 20 ~ 30 | P2 | 跑 10ms 完成 | [] | [P1(20)] |
| 30 ~ 50 | P1 | 跑 20ms 完成 | [] | [] |
算等待时间(等待 = 周转 − 服务):
| 进程 | 完成时刻 | 周转 | 服务(CPU 时间) | 等待 |
|---|---|---|---|---|
| P1 | 50 | 50 − 0 = 50 | 30 | 50 − 30 = 20 |
| P2 | 30 | 30 − 0 = 30 | 20 | 30 − 20 = 10 |
平均等待时间:
P2 看似"运气好"——它先在 Q1 跑了 10ms,然后 Q2 一空就被 SJF 选中(剩余短)继续跑——所以它从 T=0 到 T=30 只等了 10ms。P1 等的更久:在 Q2 又被 SJF 排在后面。
最终答案是 C。