SJF短作业优先算法
算法思想: 追求更少的平均时间,最少的平均周转时间,最少的平均平均带权周转时间
算法规则: 最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
用于作业/进程调度: 即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF,Shortest Process First)算法”
是否可抢占?: SJF和SPF都是非抢占式的算法。但是也有抢占式的版本----最短剩余时间优先算法。(SRTN,Shortest Remaining Time Next)
优点: "最短的"平均等待时间、平均周转时间
缺点: 不公平。对短作业有利,对长作业不利。可能产生==饥饿现象。==另外,进程/作业的运行时间都是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。
饥饿: 会导致饥饿
例题
例题:各进程到达就绪队列的时间、需要的运行时间如下所示,使用非抢占式的短作业优先调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间
进程 | 到达时间 | 运行时间 |
p1 | 0 | 7 |
p2 | 2 | 4 |
p3 | 4 | 1 |
p1 | 5 | 4 |
短作业/进程优先调度算法:每次调度选择当前已到达且运行时间最短的作业/进程。
经过简单的分析之后,可以知道调度顺序为p1–>p3–>p2–>p4
下面我们来用最短剩余时间来考虑:
进程 | 到达时间 | 运行时间 |
p1 | 0 | 7 |
p2 | 2 | 4 |
p3 | 4 | 1 |
p1 | 5 | 4 |
最短剩余时间优先算法:每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。
需要注意的是,当有新进程到达时就绪队列就会改变,就要按照上述规则就行检查。以下pn(m)表示当前pn进程剩余时间为m。每个时刻的情况如下
(我们用黄色表示这个时刻剩余时间最短的进程)
- 0时刻(p1到达):p1(7)
- 2时刻(p2到达):p1(5) 、 p2(4)
- 4时刻(p3到达):p1(5)、p2(2)、p3(1)
- 5时刻(p3完成且p4刚好到达):p1(5)、p2(2)、p4(4)
- 7时刻(p2完成):p1(5)、=p4(4)
- 11时刻(p4完成):p1(5)
- 16时刻(p1完成):结束
周转时间=完成时间-到达时间
带权周转时间=周转时间 / 运行时间
等待时间=周转时间- 运行时间
周转时间 | p1=16-0=16 | p2=7-2=5 | p3=5-4=1 | p4=11-5=6 |
带权周转时间 | p1=16/7=2.28 | p2=5/4=1.25 | p3=1/1=1 | p4=6/4=1.5 |
等待转时间 | p1=16-7=9 | p2=5-4=1 | p3=1-1=0 | p4=6-4=2 |
平均周转时间=(16+5+1+6)/4=7
平均带权周转时间=(2.28+1.25+1+1.5)/4=1.5
平均等待时间=(9+1+0+2)/4=3