处理机调度算法详解----进程调度
在之前的理论篇中,我们也介绍了处理机调度的层次,不同的操作系统也会根据自己的设计目标来配置不同层次的调度算法,并且因为调度算法众多,如果全部糅杂在一起来讲,会让人比较困惑,因此将调度算法按照层次来讲解,本文会先讲作业调度算法。下文涉及到的一些名词,如果不明白,可以参考上一篇博文。
进程调度调度的对象是进程,其主要任务是根据某种算法,选取处于就绪队列中的进程,并由分派程序将处理机分配给被选中的进程。进程调度是一种最基本的调度,在多道批处理、分时和实时等OS中,都必须要配置这级调度。其执行周期最短,也就是执行频率最高,分时系统中10-100ms便要进行一次进程调度,因此也称为短程调度。因为执行频率高,进程调度算法不宜过于复杂(太过复杂会占用太多CPU的时间)下面我们一起来看下进程调度的几种调度算法。
先来先服务、短进程优先等调度算法不在此进行介绍了,有兴趣的可参考上篇博文。
1.轮转调度算法
基于时间片的轮转(round robin,RR)调度算法是实现分时系统的一个最简单也是最常用的调度算法。该算法让就绪队列中的每个进程每次仅运行一个时间片,来保证每个进程都可以平均的获得处理机。这也是我们经常说到的时分复用,可以保证每个进程每次大约获取1/n的处理机时间。
基本原理:在RR调度算法中,系统根据FCFS策略,将所有的就绪进程排成一个就绪队列,并设置每隔一定的时间间隔(时间片)产生一次中断,让CPU处理中断并触发进程调度(将处理机分配给下个进程)。
进程切换时间:在RR调度算法中,有两种情况会触发进程切换:1.在一个时间片内,正在运行的进程执行完毕,此时CPU空闲,就立即激活调度程序;2.在一个时间片用完时,中断处理程序被激活,触发调度,如果进程尚未运行完毕,调度程序将当前进程插入到就绪队列队尾。
时间片大小:时间片在RR调度算法中是一个比较重要的概念,时间片的大小对算法的性能有很大的影响。如果时间片很小,那么在OS中会频繁的执行进程调度和进程的上下文切换,这对系统的性能会有很大的损耗;如果过大,RR算法就退化成FCFS算法,无法满足短作业和交互式用户的需求。因此时间片的大小应是:略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成,从而保证快速响应。
下图为时间片大小分别为q=1和q=4时,对平均周转时间的影响。
为了让大家方便理解轮转调度算法的调度策略和时间片过小带来的问题,我画出了q=1时的进程执行情况,如下图所示,从中我们可以看到,进程执行过程中频繁的进行上下文的切换,并且作业的周转时间明显较长。
2.优先级调度算法
优先级是为了满足进程的紧迫性而设置的,类似现实生活中的VVIP通道,可以保证紧急的进程先执行。在这里我们讲述两种优先级。
静态优先级:静态优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。主要由进程类型、进程对资源的需求、用户要求三方面决定。
动态优先级:在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能,比如高响应比优先调度算法。
3.多队列调度算法
前述的调度算法,因为系统中仅设置一个进程就绪队列,因此进程调度算法是固定的、单一的,无法满足系统中不同用户对进程调度策略的不同要求,并且在多CPU的系统中,这种缺点尤为突出。
该算法将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级。
因为对队列调度算法设置了多个就绪队列,因此可以每个就绪队列设置不同的调度算法,可以很容易满足多用户的不同需求,对于多CPU系统,同样可以很方便的为每个处理机设置一个单独的就绪队列。
4.多级反馈队列调度算法
前面讲到的调度算法都有一定的局限性,比如需要知道进程的要求服务时间、优先级等信息。而有些信息是很难预先给出的,因此在多队列调度算法的基础上,发展出多级反馈队列调度算法,可以不需知道各种进程所需的执行时间,还可较好的满足各种类型进程的需要,是目前公认的一种较好的调度算法(Pis:同理,会相对来说更复杂)。
调度机制:
- 设置多个就绪队列。在系统中设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,第二个次之,其余队列优先级逐个降低。并为不同就绪队列中进程所赋予的执行时间片大小也各不相同,优先级越高的队列中,时间片就越小。简言之:优先级高的为第一级队列,时间片最小,随着队列级别的降低,时间片加大。
- 每个队列都采用FCFS算法。每当新进程进入内存(创建工作完成),首先将它放入到第一队列末尾,按照FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,就表明进程执行完毕,可以被销毁。否则则该进程插入到第二级队列的末尾等待调度,调度方式依次类推。当进程最后被降到第n级队列(优先级最低的队列)后,在第n级队列中按轮转调度(RR)方式运行。
- 按照队列优先级调度。调度程序首先会调度最高优先级队列中的进程运行,仅当第一队列空闲时才调度第二优先级对列;换言之,仅当第1~(i-1)所有队列均空时,才会调度第i队列中的进程运行。(注:如果处理机正在执行第i队列中的某一进程时,又有新的进程进入最高优先级队列,此时必须立即吧正在运行的进程插入到第i队列的队尾,此时调度程序去调度高优先级的队列)
因为结合了多队列调度算法、先来先服务、轮转调度算法、优先级调度算法的优点,多级反馈队列调度算法可以较好的满足各种类型的用户需要,如终端型用户、短批处理作业用户、长批处理作业用户。
4.基于公平原则的调度算法
上述几种调度算法所保证的只是优先运行,如优先级算法是优先级高的进程优先运行,但并不保证进程占用多少处理机时间。另外也未考虑到调度的公平性,因此,下面介绍两种相对公平的调度算法。
1.保证调度算法:保证调度算法是另外一种类型的调度算法,它向用户所做出的保证并不是优先运行,而是明确的性能保证,该算法可以做到调度的公平性。一种比较容易实现的性能保证是处理机分配的公平性,比如系统中有n个相同类型的进程同时运行,为公平起见,须保证每个进程都获得相同的处理机时间1/n。
2.公平分享调度算法:对于上述的保证调度算法,是对诸进程而言体现的一定程度的公平性。但是对于用户来讲就不一定公平了。因此,在该调度算法中,调度的公平性主要针对用户而言,是所有用户能获得相同的处理机时间,或者所要求的时间比例。
假如系统中仅有两个用户,用户1启动了四个进程(A、B、C、D),用户2只启动了1个进程(E)。
对于保证进程公平的调度序列为:A B C D E A B C D E…
对于保证用户的公平的调度序列为:A E B E C E D E A E B E C E D E…
又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。
如有兴趣,还可以查看我的其他几篇博客,都是OS的干货,喜欢的话还请点赞、评论加关注_。