CPU调度基本策略
CPU调度基本策略:
- 中断/异常:进程切换的方法
- 调度:进程切换的决策
两大优化目标:
目标1:更小的turnaround time(周转时间),任务从到达到整体完成的延迟
目标2:Response time(任务第一次调度与到达时间之差)
T r e s p o n s e = T f i r s t r u n − T a r r i v a l T_{\mathrm{response}}=T_{\mathrm{firstrun}}-T_{\mathrm{arrival}} Tresponse=Tfirstrun−Tarrival
FIFO(First In,First Out)
-
平均 T t u r n a r o u n d = 10 + 20 + 30 3 = 20 T_{turnaround} = \frac{10+20+30}{3}=20 Tturnaround=310+20+30=20
-
优点:简单
-
缺点:当任务长度差距较大时,耗时长
SJF(Shortest Job First)
-
有助于减小平均turnaround time , 如上述例题中,平均
T t u r n a r r o u n d = 10 + 20 + 120 3 = 50 T_{turnarround}=\frac{10+20+120}{3}=50 Tturnarround=310+20+120=50 -
优点:对于任务同时到达, SJF是最优调度算法
-
缺点:如果长任务先到达,则SJF没有办法优化
T t u r n a r r o u n d = 100 + 100 + 110 3 = 103.3 T_{turnarround}=\frac{100+100+110}{3}=103.3 Tturnarround=3100+100+110=103.3
-
改进方法:
- 不要把一个任务执行到底才切换
- 允许任务抢占(时间片/中断作为切换点)
STCF(Shortest Time-to-Completion First)
-
在SJF上增加抢占功能,剩余时间最短的任务优先
-
Preemptive Shortest Job First (PSJF)
-
平均
T t u r n a r r o u n d = 120 + 10 + 20 3 = 50 T_{turnarround}=\frac{120+10+20}{3}=50 Tturnarround=3120+10+20=50
关于平均Turnarround Time的问题:
- 平均Turnaround Time反映整体性能
- 但有些Job被平均(自己牺牲,换来整体平均更好,例如长任务)
- 不能做到公平(Fairness)
- 用户感受可能不好
- 极端情况出现**“饥饿问题”**(job不断到达,某些Job一直不被调度)
- 如果所有job属于一个用户,还可以接受
- 如果jobs属于不同用户(尤其是付费用户),则无法接受牺牲
- 云计算下的公平性问题
- 效率和公平往往不能兼得
现在问题是,之前的调度算法(如SJF)会导致response time很差:
Round Robin
- 基于时间片,轮流执行任务
- response time小
- 增加context switch的开销
- 增大时间片能减小开销的比例,但也会增大response time
- 所以需要在二者之间tradeoff
- 偏重公平(response time):RR(效率相对较低)
- 不看重公平(turnaround time):SJF, STCF
考虑I/O
I/O操作远比CPU周期要慢
进程执行I/O操作时,要block住,直到I/O完成
STCF的问题:
A和B都是50ms的任务
每次interrupt,A剩余的时间小于B,那么会优先调度A,浪费CPU时间
解决方案:
把A看做5个10ms的子任务
每次A开始I/O时,调度器只剩B一个选项,调度B
当I/O完成时(interrupt),A的剩余时间段,调度A
或者增加调度条件,有I/O阻塞不能调度