2.1.9 调度算法
知识总览
学习各种调度算法的思路
- 算法思想
- 算法规则
- 这种调度算法是用于作业调度还是进程调度?
- 抢占式或是非抢占式
- 优点和缺点
- 是否会导致
饥饿
(某进程/作业长期得不到服务)
2.1.9.1 先来先服务
知识点 | 说明 |
---|---|
英文名 | FCFS,即First Come First Serve |
算法思想 | 主要从公平的角度来考虑,类似于我们生活上排队买东西的例子 |
用于进程/作业调度 | 用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列 |
是否可抢占? | 非抢占式算法 |
优缺点 | 优点:公平、算法实现简单;缺点:排在长作业后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。 |
是否会导致饥饿 | 否 |
例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用先来先服务调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
周转时间 = 完成时间-到达时间
P1 = 7-0 = 7 ; P2 = 11- 2 = 9 ; P3 = 12-4 = 8 ; P4 = 16-5 =11
带权周转时间 = 周转时间/运行时间
P1 = 7/7 = 1;P2 = 9/4 = 2.25 ; P3 = 8/1 = 8 ; P4 = 11/4 = 2.75
等待时间 = 周转时间-运行时间
P1 = 7-7 = 0 ;P2 = 9-4 = 5 ; P3 = 8-1 = 7 ; P4 = 11-4 = 7
这里需要注意的是,本例中的进程都是纯计算型的过程,一个进程到达后要么在等待,要么在运行。如果是又有计算、又有I/O操作的过程,其等待时间就是周转时间-运行时间-I/O操作的时间。
平均周转时间 = (7+9+8+11)/4 = 8.75
平均带权周转时间 = (1+2.25+8+2.75)/4 = 3.5
平均等待时间 = (0+5+7+7)/4 = 4.75
2.1.9.2 短作业优先
知识点 | 说明 |
---|---|
英文名 | SJF,即Shortest Job First |
算法思想 | 追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间。 |
用于进程/作业调度 | 既可用于作业调度,也可用于进程调度。用于进程调度时被称为“短作业优先(SPF)算法” |
是否可抢占? | SJF和SPF是非抢占式的算法。但是也有抢占式的版本——最短剩余时间优先算法(SRTN,Shortest Remaining Time Next) |
优缺点 | 优点:“最短的”平均等待时间、平均周转时间。缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先 |
是否会导致饥饿 | 会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饿死”现象。 |
例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用
非抢占式的短作业优先
调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。相比于FCFS算法,显然SPF算法的平均等待/周转/带权周转时间都要更低。
例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用
抢占式的短作业优先
调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。注:抢占式的短作业优先算法又称为
最短剩余时间优先算法(SRTN)
。相比于前两个算法,这个算法的指标更低。
经过上面的学习,我们可以知道一些知识。但是由于教材的不一,我们还有几个小细节需要注意:
- 如果题目中没有特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的。
- 很多书上都会说“SJF调度算法的平均等待时间、平均周转时间最少”。严格来说这个表述的错误的,不严谨的。经过上面的学习我们可以知道最短剩余时间优先算法所得到的指标是最少的。如果仍然要用这里的表述,那我们可以加上前提条件:在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少。
- 虽然根据上面的例子,SJF指标比FCFS低,但是实际上并不是最少,因为SRTN更少嘛。但是这个如果在选择题中,没有错误的选项,可以选择“SJF算法的平均等待时间、平均周转时间最少”这个选项。
2.1.9.3 对上述两种算法的思考
FCFS算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题。
SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至会造成饥饿问题。
那么有没有一个算法,即考虑到各个作业的等待时间,又能兼顾运行时间呢?这就要引出来我们下面的算法了。
2.1.9.4 高响应比优先
知识点 | 说明 |
---|---|
英文名 | HRRN,Highest Response Ratio Next |
算法思想 | 在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务。其中响应比的计算公式为响应比=等待时间+要求服务时间要求服务时间响应比 = \frac{等待时间+要求服务时间}{要求服务时间}响应比=要求服务时间等待时间+要求服务时间 |
用于进程/作业调度 | 既可用于作业调度,也可用于进程调度 |
是否可抢占? | 非抢占式的算法。因此只有当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比。 |
优缺点 | 综合考虑了等待时间和运行时间(要求服务时间) |
是否会导致饥饿 | 不会 |
例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用
高响应比优先
调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
2.1.9.5 小结
这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统
,当然,FCFS算法也常结合其他的算法使用,在现在也扮演着很重要的角色。
在下一部分,我们会讲讲交互式系统
的调度算法。