为什么需要调度
因为操作系统不是只有一个进程的,一般来说进程的数量会比处理器的数量多。假设有x个进程,就会有x!种的调度方法。这个时候,选择一种调度方法就很有必要。
作业的基本概念
⑴作业:指在一次应用业务处理过程中,用户提交给OS处理的一个独立任务,用户通常通过作业说明书或特定控制命令来说明作业执行的控制方式。
⑵作业步:在作业运行期间,经过的若干个相对独立又相互关联的顺序加工步骤称为作业步,各作业步之间存在着相互联系,往往是上一个作业步的输出作为下一个作业步的输入。
(3)作业与作业步示例:编程实验作业
(4)作业的三个阶段和三种状态
作业从进入系统到运行结束,通常需要经历收容、运行和完成三个阶段。相应的作业也就有“后备状态”、“运行状态”和“完成状态”。
处理机调度的层次
⑴ 高级调度(作业调度、长程调度):将外存上处于后备队列中的作业调入内存,为它们创建进程、分配必要的资源,放入就绪队列。
⑵ 低级调度(短程调度、进程调度):按照某种算法从进程就绪队列中选取进程,将处理机分配给被它,让进程真正执行器任务。
⑶ 中级调度(中程调度、内存调度、交换调度):把那些暂时不能运行的进程,转移到外存等待,把外存上的已具备运行条件的就绪进程,再重新调入内存,弥补运行内存不足的问题
调度程序和分派程序
- 分派程序:暂停当前进程执行,进行上下文(Context)切换,跳到新选出进程执行(与cpu挂钩的)(选出来的作业交到这里来执行)
- 调度程序:按操作系统设计要求,实现特定的进程调度算法,决定操作系统性能(选一些作业出来完成)
处理机调度性能评价指标
- 处理机的利用率——越高越好
- 作业的周转时间——越短越好
作业周转时间Ti是作业Ji从提交到完成的时间,n个作业平均周转时间是各作业周转时间评价值 - 带权周转时间
是作业的周转时间Ti与系统为它提供服务的时间TSi之比,方便比较不同规模作业获得服务质量,平均带权周转时间 w - 系统吞吐量——越高越好
吞吐量是指在单位时间内系统所完成的作业数。对于很多批处理系统来说,吞吐量越高,经济效益越好 - 反应时间——越短越好
表示从发出一个指令开始,到有回应产生的时间,不是指到进程完成时间,近似地看成从进程就绪开始到第一次获得CPU所经历的时间。响应时间越短,用户体验性越好。
处理机调度算法
一、先来先服务调度算法(FCFS)
算法思想:调度最先进入就绪队列的作业或进程,一个进程一旦分得处理机,便执行下去,直到该进程完成或阻塞时,才释放处理机。
例子:三个作业按顺序但几乎同时到达系统:
作业名 所需CPU时间
作业1 28
作业2 9
作业3 3
采用FCFS调度算法进行调度给出各个作业的开始时间、结束时间、周转时间、带权周转时间,计算平均周转时间和平均带权周转时间
平均周转时间=(28+37+40)/3=35
带权值平均周转时间=(28/28+37/9+40/3)/3
二、短作业优先(SJF)
该算法从就绪队列或后备队列中选出所需CPU时间最短的进程或作业,调度运行或为之分配处理机。
SJF算法举例
四个作业按顺序几乎同时到达系统并立即进入调度,用户估算四个作业所需CPU时间(估计运行时间)如下:
作业名 所需CPU时间
作业1 9
作业2 4
作业3 10
作业4 8
假设系统中没有其他作业,采用SJF调度算法,给出各个作业的开始时间、结束时间、周转时间、带权周转时间,计算平均周转时间和平均带权周转时间,并与FCFS调度算法进行对比。
先按照SJF来画表格(结果是这样的)(按照运行的顺序):
按照FCFS来画表格,是这样的:
缺点:
1、这个算法需要提前知道作业运行所需要的时间,实现上是有困难的
2、这个算法对长作业并不友好,可能会出现饥饿等待(干等却没有被叫吃饭)
三、响应比最高的优先算法(HRRF)
引入原因——FCFS与SJF是片面的调度算法
1、FCFS只考虑作业等候时间,对作业大小不做区分,对短作业不公平
2、SJF仅考虑作业计算时间而忽视作业等待时间,对长作业不利
算法原理:作业选择同时考虑等待时间和作业大小两个因素,每次分配处理机时,根据响应比选择作业,将CPU分配给响应比最高的作业,
响应比是作业进入系统后的响应时间与估计运行时间之比:
响应比=1+等待时间/估计运行时间
响应比越大优先级越高,越先分配资源
算法特点(根据响应比计算公式):
1、 短作业估计运行时间短,容易得到较高响应比 作业等待时间足够长后,也将获得足够高的响应比,不会发生饥饿现象
2、既照顾短作业又不使长作业的等待时间过长,增强了公平性,改进了调度性能。
例题:
以下四个作业先后到达系统进入调度:
作业名 到达时间 所需CPU时间
作业1 0 20
作业2 5 15
作业3 10 5
作业4 15 10用HRRF算法表格画法:
四、优先级调度算法 PSA
-
算法思想:
这种算法是根据确定的优先级来选取作业,每次总是选择优先数高的作业。 -
规定用户作业优先数的方法:
(a)由用户规定优先数(外部优先数)
用户提交作业时,根据急迫程度规定适当的优先级,如果涉及收费,优先级越高,收费将越高
(b)由系统计算优先数(内部优先数)
有很多方法,考虑作业运行时间、用户给出的优先数、等待时间、作业类型等,SJF和HRRF也是一种特殊的优先级调度算法;
五、抢占式短作业优先算法(最短剩余时间优先)
- 算法思想:把SJF算法改为抢占模式,又称抢占式短作业优先算法,一个新作业进入就绪状态,如果新作业需要的CPU时间比当前正在执行的作业剩余下来还需的CPU时间短,SRTF强行赶走当前正在执行作业。
- 举例说明
进程调度
一、多级反馈队列调度算法 MFQ
1、算法思想:
- 设置多个就绪队列,并为每个队列赋予不同的优先级。队列1的优先级最高,其余队列逐个降低
- 各队列中进程时间片的大小各不相同,优先级越高,时间片就越短
- 新进程进入总是插入队列1的末尾,按FCFS等待调度。若一个时间片未完成,超时后转入队列2的末尾,按FCFS再次等待调度,如此下去,如果进入队列n则按RR算法调度执行, 仅当队列1为空时,才调度队列2中的进程运行。若队列I中的进程正执行,此时有新进程进入优先级较高的队列中,则新进程将抢占运行,原进程转移至下一队列
举例说明:
五个任务的到达时间和运行时间如左图所示,采用非抢占多级反馈队列算法。其中第一级和第二级按任务到达时间的优先级调度。请用Gantt图分析任务的调度过程,计算各进程周转时间与平均周转时间。
解题:
说明:
1、A最先到达,所以A先进入队列1,队列1的时间片是3,所以先执行3个时间单位,然后被插入到队列2中(时间用完了);然后在执行过程中,B来了,B也插入到1队列,开始执行3个时间单位,然后被插入到队列2;(此时一共消耗了6个时间单位)执行过程中C也到了,C开始执行3个单位,然后被插入到队列2;同理D也执行3个时间单位,插入队列2的末尾;最后E直接在时间片没有结束之前,执行完毕。队列1执行完毕,开始执行队列2
2、根据FCFS原则,ABCD依次执行四个时间单位,B和D在队列2中因为没有执行完毕,所以被插入到最后一个队列,也就是队列3。至此,队列2执行完毕,队列3执行开始。
3、最后一个队列按照SJF原则,因为D只有一个单位没有执行,B还有两个,所以先执行D,然后再执行B
二、时间片轮转算法(RR算法)
- OS为每个进程分配一个时间片(time slice, 通常为10-100ms之间),每个进程在所分配到的时间内拥有CPU使用权。当某个正在执行的进程其所分配的时间片用完时,OS强行从该进程夺取CPU使用权,并将该进程重新放到就绪队列末尾
三、非抢占式优先算法
- 系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直到完成或因发生某事件而放弃处理机时,系统方可重新分配处理机。
时间片和调度开销问题
例3-9
假设就绪队列中有10个进程,系统将时间片设为200ms,CPU进行进程切换要花费用10ms,试问系统开销所占的比率约为多少?若时间片减小到100ms,系统开销所占的比率增加多少?
解: (1) 10个进程以时间片轮转的方式使用CPU。
系统总时间(200ms+10ms)
系统开销所占的比率: 10/(200+10)= 4.8%(切换所占的比例)
(2) 10个进程以时间片轮转的方式使用CPU。
系统总时间(100ms+10ms)
系统开销所占的比率: 10/(100+10)= 9.1%(切换所占的比例)
系统开销所占比例增加:(9.1%-4.8%)=4.3%
时间片越小,系统响应性能越好,但可进程切换频繁,增大调度开销,实际应用中应在时间片大小和调度开销之间进行折衷。
实时调度
满足实时任务各自时间约束条件的调度称为实时调度
一、实时调度的前提条件
-
单处理机条件下
-
多处理机条件下
二、调度算法分类 -
非抢占式调度算法
-
抢占式调度算法
三、常见调度算法
1、最早截止时间优先 EDF
- 该算法是根据任务的截止时间确定任务的优先级,具有最早截止时间的任务优先级高,排在队列的前面。
- 根据任务的截止时间来确定任务的优先级
截止时间越早,优先级越高
可以是抢占式或非抢占式
非抢占式调度方式用于非周期实时任务
举例:
:四个非周期任务,它们先后到达。
1、 系统先调度任务1执行,在其执行期间,任务2、3又先后到达。
2、 由于任务3的开始截止时间早于任务2,故系统在任务1后将调度任务3执行。
3、 在此期间又到达作业4,其开始截止时间仍是早于任务2的,故在任务3执行完后,系统又调度任务4执行,最后才调度任务2执行。
2、最低松弛度优先算法 LLF
根据任务紧急(或松弛)程度来确定任务的优先级。任务紧迫程度愈高,所赋予优先级愈高。松弛度=必须完成的时间点 - 本身所需运行时间 - 当前时间
例如,一个任务在200ms时必须完成,而它本身运行时间需要100ms,因此,调度程序必须在100 ms之前调度执行(松弛程度为100ms)。
再比如说:
假如一个实时系统中有两个周期性实时任务,A和B,任务A要求每20ms执行一次,执行时间为10ms;任务B只要求每50ms执行一次,执行时间25ms。
图给出了A和 B截止的时间点。