调度算法学习
饥饿:某进程/作业长期得不到服务
非抢占式算法:对于当前正在占用处理机的进程或作业,只有进程主动放弃处理机的时候,才会进行和调度,才会用调度算法的规则选择下一个应该得到服务的进程
先来先服务(FCFS)
先来先服务调度算法:按照到达的先后顺序调度,事实上就是等待时间越久的越优先得到服务。
调度顺序为1、2、3、4
周转时间=完成时间-到达时间
P1=7
P2=9
P3=8
P4=11
带权周转时间=周转时间/运行时间
P1=1
P2=9/4=2.25
P3=8/1=8
P4=11/4=2.75
等待时间=周转时间-运行时间
p1=0
如果要有I/O设备输出,等待时间=周转时间-运行时间-I/O操作的时间
平均周转时间
平均带权周转时间
平均等待时间
短作业优先(SJF)
非抢占SPF
使用非抢占式的短作业优先调度算法(严格来说,用于进程调度应该称为短进程优先调度算法SPF)
短作业/进程优先调度算法:每次调度时选择当前已到达且运行时间最短的作业/进程
调度顺序:
P1--P3--P2--P4
周转时间=完成时间-到达时间
p1=7
p3=8-4=4
p2=12-2=10
p4=16-5=11
带权周转时间
p1=7/7=1
p3=4/1=4
p2=1=/4=2.5
p4=11/5=2.75
等待时间
p1=7-7=0
p3=4-1=3
p2=10-4=6
p4=11-4=7
平均带权时间、带权周转时间、等待时间都比FCFS低
抢占式SRTN
使用抢占式的短作业优先调度算法(抢占式的短作业优先算法又称“最短剩余时间有限算法(SRTN)
最短剩余时间优先算法:
每当有进程加入就绪队列改变时就需要调度,如果新到达的进程时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度
周转时间=完成时间-到达时间
p1=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
对比非抢占式的短作业优先算法,显然抢占式的这几个指标又要更低
小细节
对于题目未特别说明,所提到的"短作业/进程优先算法"默认是非抢占式的
在所有的进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少
或
在所有进程都几乎同时到达时,........
如果不加上述前提条件,则应该说"抢占式的短作业/进程优先调度算法"(最短剩余时间优先,SRNT算法)的平均等待时间、平均周转时间最少
严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间
如果选择题中遇到“SF算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项
是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项
两个比较
FCFS算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务,但没有考虑到作业运行时间,因此导致了对短作业不友好
SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至会造成饥饿问题
高响应比优先(HRRN)
高响应比优先算法:
非抢占式的调度算法,只有当前运行的进程主动放弃CPU时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选择响应最高的进程上处理机
响应比=等待时间+要求服务时间/要求服务时间
P2和P4要求服务时间一样,但P2等待时间长,所以是P2响应比更大
比较
这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统,当然,FCFS算法也常结合其他的算法使用,在现在也扮演着很重要的角色。
时间片轮转调度算法(RR)
该算法中,将一个较小时间单元定义为时间量或时间片。时间片的大小通常为 10~100ms。
就绪队列作为循环队列。CPU 调度程序循环整个就绪队列,为每个进程分配不超过一个时间片的 CPU。
时间片轮转常用于分时操作系统,更注重“响应时间”,因此此处不计算周转时间
时间片为2时
时间片为5时
先来先服务和时间片为5的一样
时间片太大太小有什么影响
如果时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少,可见时间片也不能太小
优先级调度算法
非抢占式的优先级调度算法:
每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发送调度
抢占式的优先级调度算法
每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。另外,当就绪队列发生改变时,也需要检查是否发生抢占
补充:
就绪队列未必只有一个,可以按照不同优先级来组织。另外,可以把优先级高的进程排在更靠近队头的位置
根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种
静态优先级:创建进程时确定,之后一直不变。
动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。
如何合理的设置各类进程的优先级
通常:
系统进程优先级高于用户进程
前台进程优先级高于后台进程
操作系统更偏好I/O型进程(或称i/o繁忙进程
注:与I/O型进程相对的是计算机进程(或称CPU繁忙进程)
I/O设备和CPU可以并行工作。如果优先让I/O繁忙型进程优先运行的话,则越有可能让I/O设备尽早地投入工作,则资源利用率、系统吞吐量都会得到提升
采用动态优先级怎么调整?
可以从追求公平、提升资源利用率等角度考虑
如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级
如果某进程占用处理机运行了很长时间,则可适当降低其优先级
果发现一个进程频繁地进行I/O操作,则可适当提升其优先级
四种特点总结
多级反馈队列调度算法
设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
SPF和SJF算法的区别
SJF是最短进程优先调度算法
SJF的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行;而SPF调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。