学习日期:2024.7.4
内容摘要:各种调度算法的思想、规则、优缺点介绍
为什么要有调度算法?
调度算法就好比一群人在银行办理业务,准备办理业务的人就是进程/作业,银行窗口的工作人员就是CPU,进程往往是比CPU数目多的。调度算法就是决定,哪些人可以先被服务,哪些人要排队等待。
适用于批处理系统的调度算法
先来先服务(FCFS)
先来先服务算法(FCFS,First Come First Serve),最简单的做法就是先来后到,先到银行的人先办业务。但是,有可能先到的“人”是来办理贷款的,谈了好几个小时都没谈完,后面一群人都只需要几分钟就能办完业务,但是都得被迫堵在后面排队,显然很不方便。
算法思想:主要按“公平”的角度考虑。(类似生活中排队办业务)
算法规则:按照作业/进程到达的先后顺序服务。
是否抢占:非抢占式算法。
优点:公平、算法实现很简单
缺点:排在长作业后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验很差。即FCFS算法对长作业有利,对短作业不利。
是否会导致饥饿:不会,只要进程一直等待一定能得到服务。(饥饿:进程一直得不到服务)
短作业优先(SJF)
短作业优先算法(SJF,Shortest Job First),工作人员先服务任务简单,耗时少的客户,快速搞定,不让他们一直等。但是,如果源源不断的一直有任务简单耗时少的客户,想办大业务的客户等到银行下班也不能办理业务。
SPF就是Shortest Process First,短进程优先算法,除调度对象外没有区别。
算法思想:追求最少的平均等待时间、平均(带权)周转时间(详见《调度算法的评价指标》
注意前提!当所有进程几乎同时到达时,采用SJF调度算法的平均等待时间和平均周转时间最少。
算法规则:最短的作业/进程优先得到服务(“最短”指的是要求服务时间最短)
每次调度时,选择当前已经到达的作业中运行时间最短的作业。
是否抢占:非抢占式算法,但也有抢占式的版本SRTN(Shortest Remaining Time Next,最短剩余时间优先算法)
SRTN在就绪队列改变时(有新进程加入,当前进程完成)就需要调度,如果新进程的剩余时间比当前正在运行的进程的剩余时间更短,则由新进程抢占处理机,当前运行的进程重新回到就绪队列
SRTN调度算法的平均等待时间和平均周转时间最少。
优点:平均等待时间和平均周转时间较小
缺点:不公平,对短作业有利,对长作业不利,且作业的运行时间是由用户提供的估计值,并不是精确值,不一定能做到真正的短作业优先。
是否会导致饥饿:会,如果源源不断的有短作业到来,长作业就会一直得不到服务。
思考:FCFS算法只考虑了进程的等待时间而不考虑运行时间,导致了对短作业不友好,而SJF算法又只考虑了运行时间不考虑等待时间,对长作业不友好,甚至会造成长作业饥饿,这两种算法都有点太极端了,那么能不能设计一个同时考虑到等待时间和运行时间的算法呢?于是,高响应比优先(HRRN)算法应运而生。
高响应比优先(HRRN)
高响应比优先算法(HRRN,Highest Response Ratio Next),引入了响应比这一概念来衡量作业的优先级,先为响应比高的作业提供服务。
响应比=(等待时间+要求服务时间)/要求服务时间,即1+(等待时间/要求服务时间)
当等待时间很长时,分子较大,响应比高。当要求服务时间较小时,分母较小,响应比高。这样,等待时间长的和任务简单耗时少的进程都会有较高的优先级,综合了以上两种方法的优点。
算法思想:综合考虑进程的等待时间和要求服务的时间
算法规则:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的服务
是否抢占:非抢占式算法,当前运行的作业主动放弃处理机时,计算所有就绪队列的进程的响应比,选择响应比最高的进程上处理机。
优点:综合考虑了等待时间和运行时间,综合了SJF和FCFS的优点。
缺点:无明显缺点,但作业的运行时间在实际运行前是估计值,不是精确值,可能会有影响。
是否会导致饥饿:不会,对于长作业来说,随着等待时间越来越久,其响应比也会越来越大。
以上三种算法都同时适用于作业调度和进程调度,主要关心对用户的公平性,平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也不区分任务的紧急程度,对于用户来说交互性很差,因此以上三种算法一般适用于早期的批处理操作系统。因为此时计算机非常昂贵,个人计算机较少,通常使用公用计算机,人们更追求系统的整体性能,而不是很在乎个人的使用体验如何。
适用于交互式系统的调度算法
时间片轮转(RR)
时间片轮转调度算法(RR,Round-Robin),时间片:操作系统规定的一定量的时间。
如果时间片太大,每个进程都能在一个时间片内完成,则RR算法会退化为先来先服务算法,失去了RR算法的意义。
另一方面,进程的调度、切换是有时间代价的(保存和恢复运行环境),如果时间片太小,会导致进程切换过于频繁,系统会花大量时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。
算法思想:公平、轮流地为各个进程服务,让每个进程在一定的时间间隔内都可以得到响应
算法规则:按照各个进程到达就绪队列的顺序,轮流人各个进程执行一个时间片(如100ms),若在时间片内进程没有执行完,则剥夺处理机,将进程放到就绪队列尾重新排队,进行调度;若执行完,则主动下处理机,进行调度。每次调度时,选择就绪队列头的进程执行一个时间片。
如果在某一时刻当前进程的时间片用完,且刚好有新进程到达,则默认新到达的进程先进入就绪队列,轮转下来的进程后进入。
是否抢占:是,若进程未在时间片内运行完,会被剥夺处理机。
适用场景:仅用于进程调度,只有作业放入了内存建立了相应的进程后,才能被分配处理机时间片
优点:公平,响应快,适用于分时操作系统。
缺点:高频率的进程切换会导致一定的时间开销,不区分任务的紧急程度,只按时间片轮转。
是否会导致饥饿:不会,随着时间片轮转一定能轮转到每个等待的进程。
优先级调度
优先级调度算法
算法思想:随着实时操作系统的出现,一些应用场景需要根据任务的紧急程度来决定处理顺序。
算法规则:每个进程/作业都有各自的优先级,调度时选择优先级最高的进程/作业,如果是考试做题,题目中会给出进程/作业对应的优先数,优先数越大越优先。当优先级相同时,选择更早进入就绪队列的进程。
补充:
①就绪队列未必只能有一个,可以按照不同优先级组织。
②根据优先级是否可以改变,可以分为静态优先级和动态优先级两种,静态优先级的优先数在创建进程时确定,之后不会改变,而动态优先级的进程在创建时有一个优先数的初始值,但之后会根据情况调整。
当使用动态优先级进程时,进程等待了很长时间,或频繁的进行I/O操作,就可以提升其优先级。当进程长时间占用处理机时,可以降低其优先级。
高响应比优先(HRRN)算法,在某种意义上来说,就是一种动态优先级调度算法。
③系统进程优先级高于用户进程,前台进程优先级高于后天进程,操作系统更偏好I/O繁忙型进程(与I/O繁忙型进程相对的是CPU繁忙型进程),因为I/O设备和CPU可以并行工作,如果优先让其运行,则越有可能让I/O设备尽早投入工作。
是否抢占:有抢占式和非抢占式两种版本,非抢占式只需要在进程主动放弃处理机时调度即可,而抢占式需要在每次就绪队列变化时检查是否会发生抢占。
适用场景:进程调度和作业调度,甚至包括I/O调度。
优点:可用优先级灵活区分紧急程度和重要程度,适用于实时操作系统,调度灵活。
缺点:可能会导致低优先级进程饥饿。
是否会导致饥饿:会,如果源源不断的有高优先级作业进入,会导致低优先级的进程饥饿。
思考:FCFS算法的优点是公平,SJF算法的优点是平均等待和周转时间小,RR算法能让各个进程得到及时的响应,优先级调度算法可以灵活的调度各种进程,那么能否对上面的算法做一个折中权衡,得到一个综合表现优秀的算法呢?
好消息:算法很优秀 坏消息:全缝了,超级缝合怪
多级反馈队列
多级反馈队列调度算法
算法思想:对其它调度算法的折中权衡
算法规则:1.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。(SJF)
2.新进程到达时先进入第一级队列,按FCFS原则排队等待被分配时间片,若用完时间 片以后进程还未结束,则进程进入下一级队列队尾,若已经在最下级队列,则放回队 尾。(RR)
3.只有k级队列为空时,才会为k+1级队头的进程分配时间片。(优先级)
是否抢占:抢占式,在k级队列的进程运行过程中,若更上级的队列(1~k-1级)进入了新进程,由于新进程的优先级更高,会抢占处理机,原来运行的放回k级队列的队尾。
适用场景:仅用于进程调度
优点:相对公平(FCFS的优点);每个新到达的进程都可以很快得到响应(RR的优点);短进程只需要较少的时间就能完成(SJF的优点);不必估计进程的运行时间,可灵活调整对各类进程的偏好程度。(拓展:可以将因I/O而阻塞的进程放回原队列,而非降级队列,这样可以保证I/O进程的高优先级)
缺点:可能会导致低优先级的进程饥饿。
是否会导致饥饿:会,同SJF,如果源源不断的有短进程到达,高优先的前几级队列一直有进程,较低优先级的进程就会饥饿。
比起早期的批处理操作系统,由于计算机造价大幅降低,交互式操作系统(包括分时操作系统、实时操作系统等)更注重系统的响应时间、公平性、平衡性等指标,而这几种算法能较好的满足交互式系统的需求,比如UNIX使用的就是多级反馈队列调度算法。
内容总结自王道计算机考研《操作系统》 和 人民邮电出版社《操作系统导论》