目录
1. 先来先服务(FCFS, First-Come, First-Served)
2. 最短作业优先(SJF, Shortest Job First)
3. 优先级调度(Priority Scheduling algorithm,PSA)
6. 多级反馈队列调度算法(Multileved Feedback Queue,MLFQ)
1.7 多级反馈队列调度算法(Multileved Feedback Queue,MFQ)
一、常见的调度算法
调度算法是调度器决定如何选择下一个执行进程的规则。常见的调度算法有:
1. 先来先服务(FCFS, First-Come, First-Served)
- 按照进程到达的顺序依次分配CPU时间,先到的进程优先执行。
2. 最短作业优先(SJF, Shortest Job First)
- 优先调度执行预计执行时间最短的进程,以减少平均等待时间。
3. 优先级调度(Priority Scheduling algorithm,PSA)
- 每个进程都有一个优先级,优先级最高的进程获得CPU执行时间。
4. 轮转调度(Round Robin, RR)
- 每个进程按照时间片轮流获得CPU时间,时间片用完后将进程放回队列尾部,等待下一轮调度。
5. 高响应比优先调度算法(HRRN)
高响应比优先调度算法(Highest Response Ratio Next, HRRN)是一种兼顾了进程等待时间和执行时间的非抢占式调度算法。它通过计算每个进程的响应比来决定下一个被调度的进程。响应比越高的进程越优先得到处理,这样可以避免长期等待的进程“饥饿”。
6. 多级反馈队列调度算法(Multileved Feedback Queue,MLFQ)
多级反馈队列调度算法(Multilevel Feedback Queue Scheduling, MLFQ)是操作系统中的一种复杂而灵活的进程调度算法,旨在通过动态调整进程的优先级来优化系统性能。它是在多级队列调度算法的基础上进行扩展,允许进程在不同优先级的队列之间移动,以便更好地平衡CPU的使用。主要思想:多级反馈队列调度算法的核心思想是根据进程的执行历史动态调整其优先级。短期任务优先处理,而长期任务则逐步降低其优先级,以避免长期占用系统资源。
7. 多级队列调度算法
多级队列调度算法是一种用于操作系统中的任务调度的方法。它将任务分配到不同的队列中,根据任务的优先级和特性来决定调度策略。
Tips:各种调度算法的学习思路:
1.算法思想
2.算法规则
3.这种调度算法是用于作业调度还是进程调度?
4.抢占式?非抢占式?
5. 优点和缺点
6.是否会导致饥饿【某进程/作业长期得不到服务】
1.1 先来先服务调度算法(FCFS)
1.1.1 基本知识
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。
举例:
调度算法评价指标请参考博文:操作系统 ---- 调度算法的评价指标-CSDN博客
例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用先来先服务调度算法,计算各进程的等待时间、平均等待时间、周转时间、平均周转时间、带权周转时间、平均带权周转时间。
IO操作时间属于被服务的时间,因此不属于等待时间。
1.1.2 小结
1.2 短作业优先调度算法 (SJF)
1.2.1 基本知识
由于在实际情况中,短作业(进程)占有很大比例,为了能使它们能比长作业优先执行,而产生了短作业优先调度算法。
1) 短作业优先算法
SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。
2) 短作业优先算法的缺点
SJF调度算法较之FCFS算法有了明显的改进,但仍然存在不容忽视的缺点:
(1) 必须预知作业的运行时间。在采用这种算法时,要先知道每个作业的运行时间。即使是程序员也很难准确估计作业的运行时间,如果估计过低,系统就可能按估计的时间终止作业的运行,但此时作业并未完成,故一般都会偏长估计。
(2) 对长作业非常不利,长作业的周转时间会明显地增长。更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象。
(3) 在采用FCFS算法时,人—机无法实现交互。
(4) 该调度算法完全未考虑作业的紧迫程度,故不能保证紧迫性作业能得到及时处理。
1.2.2 非抢占式短作业优先调度算法
在上题中,严格来说,用于进程调度应该称为短进程优先调度算法(SPF)。
1.2.3 抢占式短作业优先调度算法
抢占式的短作业优先算法又称“最短剩余时间优先算法(SRTN)”。
注意几个小细节:
1.如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的
2.很多书上都会说“SJF调度算法的平均等待时间、平均周转时间最少”
严格来说,这个表述是错误的,不严谨的。之前的例子表明,最短剩余时间优先算法得到的平均等待时间、平均周转时间还要更少
【应该加上一个条件“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少”;或者说“在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少”;如果不加上述前提条件,则应该说“抢占式的短作业/进程优先调度算法(最短剩余时间优先, SRNT算法)的平均等待时间、平均周转时间最少”】
3.虽然严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间
4.如果选择题中遇到“SJF算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项
是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项
1.2.4 小结
1.3 高响应比优先调度算法(HRRN)
1.3.1 高响应比优先调度算法的由来
FCFS算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题;SJF算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至还会造成饥饿问题。
能不能设计一个算法,即考虑到各个作业的等待时间,也能兼顾运行时间呢?
在批处理系统中,FCFS算法所考虑的只是作业的等待时间,而忽视了作业的运行时间。而SJF算法正好与之相反,只考虑作业的运行时间,而忽视了作业的等待时间。高响应比优先调度算法则是既考虑了作业的等待时间,又考虑作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长,从而改善了处理机调度的性能。
1.3.2 实现方法
高响应比优先算法是如何实现的呢? 如果我们能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:
由于等待时间与服务时间之和就是系统对该作业的响应时间,故该优先级又相当于响应比RP。据此,优先又可表示为:
1.3.3 例题
1.3.4 小结
1.4 FCFS、SJF、HRRN调度算法小汇总
注:这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统,当然,FCFS算法也常结合其他的算法使用,在现在也扮演着很重要的角色。而适合用于交互式系统的调度算法将在下个小节介绍..
1.5 时间片轮转调度算法(RR,Round-Robin)
1.5.1 轮转调度算法基本原理
在轮转(RR)法中,系统将所有的就绪进程按FCFS策略排成一个就绪队列。系统可设置每隔一定时间(如30 ms)便产生一次中断,去激活进程调度程序进行调度,把CPU分配给队首进程,并令其执行一个时间片。当它运行完毕后,又把处理机分配给就绪队列中新的队首进程,也让它执行一个时间片。这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得一个时间片的处理机时间。
1.5.2 进程切换时机
在RR调度算法中,应在何时进行进程的切换,可分为两种情况:
① 若一个时间片尚未用完,正在运行的进程便已经完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片。
② 在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未运行完毕,调度程序将把它送往就绪队列的末尾。
1.5.3 例题
时间片轮转调度算法常用于分时操作系统,更注重“响应时间”,因而此处不计算周转时间 。
例题:各进程到达就绪队列的时间、需要的运行时间如下表所示。使用时间片轮转调度算法,分析时间片大小分别是2、5时的进程运行情况。
时间片轮转调度算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)。
- 时间片大小为2(注:以下括号内表示当前时刻就绪队列中的进程、进程的剩余运行时间)。
流程总结如下:
0时刻(P1(5)):0时刻只有P1到达就绪队列,让P1上处理机运行一个时间片。
2时刻(P2(4)→P1(3)) :2时刻P2到达就绪队列,P1运行完一个时间片,被剥夺处理机,重新放到队尾。此时p2排在队头,因此让P2上处理机。(注意:2时刻,P1下处理机,同一时刻新进程P2到达,如果在题目中遇到这种情况,默认新到达的进程先进入就绪队列)。
4时刻(P1(3)→P3(1)→ P2(2)):4时刻,P3到达,先插到就绪队尾,紧接着,P2下处理机也插到队尾。
5时刻(P3(1)→P2(2)→ P4(6)):5时刻,P4到达插到就绪队尾(注意:由于P1的时间片还没用完,因此暂时不调度。另外,此时P1处于运行态,并不在就绪队列中)
6时刻(P3(1)→P2(2)→P4(6)→P1(1)):6时刻,P1时间片用完,下处理机,重新放回就绪队尾,发生调度。
7时刻(P2(2)→P4(6)→P1(1)):虽然P3的时间片没用完,但是由于P3只需运行1个单位的时间,运行完了会主动放弃处理机,因此也会发生调度。队头进程P2上处理机。
9时刻(P4(6)→P1(1)):进程P2时间片用完,并刚好运行完,发生调度,P4上处理机。
11时刻(P1(1)→P4(4) ) :P4时间片用完,重新回到就绪队列。P1上处理机。
12时刻(P4(4)) :P1运行完,主动放弃处理机,此时就绪队列中只剩P4,P4上处理机。
14时刻(NULL):就绪队列为空,因此让P4接着运行一个时间片。
16时刻:所有进程运行结束。
- 时间片大小为5
流程总结如下:
0时刻(P1(5)):只有P1到达,P1上处理机。
2时刻(P2(4)) :P2到达,但P1时间片尚未结束,因此暂不调度。
4时刻(P2(4)→P3(1)):P3到达,但P1时间片尚未结束,因此暂不调度。
5时刻( P2(4)→P3(1)→P4(6)):P4到达,同时,P1运行结束。发生调度,P2上处理机。
9时刻( P3(1)→ P4(6)):P2运行结束,虽然时间片没用完,但是会主动放弃处理机。发生调度。
10时刻( P4(6)):P3运行结束,虽然时间片没用完,但是会主动放弃处理机。发生调度。
15时刻(NULL):P4时间片用完,但就绪队列为空,因此会让P4继续执行一个时间片。
16时刻(NULL) :P4运行完,主动放弃处理机。所有进程运行完。
若按照先来先服务调度算法,则有:结论:如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间【比如:系统中有10个进程在并发执行,如果时间片为1秒,则一个进程被响应可能需要等9秒...也就是说,如果用户在自己进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能被系统响应】。因此时间片不能太大。
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
那么基于此,时间片大小该如何确定呢?请看1.5.4小节。
1.5.4 时间片大小的确定
在轮转算法中,时间片的大小对系统性能有很大的影响。 下图示出了时间片大小对响应时间的影响,其中图(a)是时间片略大于典型交互的时间,而图(b)是时间片小于典型交互的时间。

1.5.5 小结
1.6 优先级调度算法(PSA)
1.6.1 基本原理介绍
我们可以这样来看作业的优先级,对于先来先服务调度算法,作业的等待时间就是作业的优先级,等待时间越长,其优先级越高。对于短作业优先调度算法,作业的长短就是作业的优先级,作业所需运行的时间越短,其优先级越高。但上述两种优先级都不能反映作业的紧迫程度。
优先级进程调度算法,是把处理机分配给就绪队列中优先级最高的进程。这时,又可进一步把该算法分成如下两种。 (1) 非抢占式优先级调度算法。 (2) 抢占式优先级调度算法。
1.6.2 例题
例题:各进程到达就绪队列的时间、需要的运行时间、进程优先数如下表所示。使用非抢占式的优先级调度算法,分析进程运行情况。(注:优先数越大,优先级越高)
- 非抢占式优先级调度
非抢占式的优先级调度算法:每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。
注:以下括号内表示当前处于就绪队列的进程。
0时刻(P1):只有P1到达,P1上处理机。
7时刻(P2、P3、P4):P1运行完成主动放弃处理机,其余进程都已到达,P3优先级最高,P3上处理机。
8时刻( P2、P4 ) :P3运行完成,P2、P4优先级相同,由于P2先到达,因此P2优先上处理机。
12时刻(P4) :P2完成,就绪队列只剩P4,P4上处理机。
16时刻(NULL):P4完成,所有进程都结束。
- 抢占式优先级调度
抢占式的优先级调度算法:每次调度时选择当前已到达且优先级最高的进程。当前进程主动放弃处理机时发生调度。另外,当就绪队列发生改变时也需要检查是会发生抢占。
注:以下括号内表示当前处于就绪队列的进程。
0时刻(P1):只有P1到达,P1上处理机。
2时刻(P2):P2到达就绪队列,优先级比P1更高,发生抢占。P1回到就绪队列,P2上处理机。
4时刻(P1、P3) :P3到达,优先级比P2更高,P2回到就绪队列,P3抢占处理机。
5时刻(P1、P2、P4):P3完成,主动释放处理机,同时,P4也到达,由于P2比P4更先进入就绪队列,因此选择P2上处理机。
7时刻(P1、P4) :P2完成,就绪队列只剩P1、P4,P4上处理机。11时刻(P1) :P4完成,P1上处理机。
1.6.4 优先级的类型、静态优先级、动态优先级
根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种。
优先级是利用某一范围内的一个整数来表示的,例如0~255中的某一整数,又把该整数称为优先数。确定进程优先级大小的依据有如下三个:
(1) 进程类型。
(2) 进程对资源的需求。
(3) 用户要求。
- 静态优先级是在创建进程时确定的,在进程的整个运行期间保持不变。
- 动态优先级是指在创建进程之初,先赋予其一个优先级,然后其值随进程的推进或等待时间的增加而改变,以便获得更好的调度性能。
如何合理地设置各进程的优先级?
通常:
系统进程优先级高于用户进程(系统作为管理者,优先级高也是必然的);
前台进程优先级高于后台进程;
操作系统更偏好I/O型进程(或称I/O繁忙型进程)【I/O设备和CPU可以并行工作。如果优先让I/O繁忙型进程优先运行的话,则越有可能让I/O设备尽早地投入工作,则资源利用率、系统吞吐量都
会得到提升】;
注:与I/O型进程相对的是计算型进程(或称CPU繁忙型进程)。
如果采用的是动态优先级,什么时候应该调整?
可以从追求公平、提升资源利用率等角度考虑
- 如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级
- 如果某进程占用处理机运行了很长时间,则可适当降低其优先级
- 如果发现一个进程频繁地进行I/O操作,则可适当提升其优先级
就绪队列未必只有一个,可以按照不同优先级来组织。另外,也可以把优先级高的进程排在更靠近队头的位置。
1.6.5 总结
1.7 多级反馈队列调度算法(Multileved Feedback Queue,MFQ)
1.7.1 多级反馈队列调度算法的由来
- FCFS算法的优点是公平
- SJF算法的优点是能尽快处理完短作业,平均等待/周转时间等参数很优秀
- 时间片轮转调度算法可以让各个进程得到及时的响应
- 优先级调度算法可以灵活地调整各种进程被服务的机会
- 如前所述的各种调度算法,尤其在应用于进程调度时,由于系统中仅设置一个进程的就绪队列,即低级调度算法是固定的、单一的,无法满足系统中不同用户对进程调度策略的不同要求,在多处理机系统中,这种单一调度策略实现机制的缺点更显突出,由此,多级队列调度算法能够在一定程度上弥补这一缺点。
能否对其他算法做个折中权衡?得到一个综合表现优秀平衡的算法呢?
这个算法就是我们在本节要学习的多级反馈队列调度算法。
1.7.2 多级反馈队列调度算法基本原理
- 调度机制
多级反馈队列调度算法的调度机制可描述如下:
(1) 设置多个就绪队列。 下图是多级反馈队列算法的示意图。
(2) 每个队列都采用FCFS算法。
当新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。否则,即它在一个时间片结束时尚未完成,调度程序将其转入第二队列的末尾等待调度;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,依此类推。当进程最后被降到第n队列后,在第n队列中便采取按RR方式运行。
(3) 按队列优先级调度。
调度程序首先调度最高优先级队列中的诸进程运行,仅当第一队列空闲时才调度第二队列中的进程运行;换言之,仅当第1~(i-1)所有队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第i队列的末尾,而把处理机分配给新到的高优先级进程。
1.7.3 例题
各进程到达就绪队列的时间、需要的运行时间如下表所示。使用多级反馈队列调度算法,分析进程运行的过程。
分析:
假设我们设计一个具有三个层级的多级就绪队列,各级队列优先级遵循从高到底,时间片遵循从小到大,如下图所示,第一级队列中的进程可获得1个时间片大小的时间上CPU运行,第二级队列中的进程可获得2个时间片大小的时间上CPU运行,第三级队列中的进程可获得4个时间片大小的时间上CPU运行。
刚开始0这个时刻,P1先到达,因此P1进入第一级队列。
由于该进程是先到达的,此时也没有其他的进程到达,因此P1进程上处理机运行(运行时间为1个时间片)。
P1进程需要运行的时间为8个时间片的时间,但是P1目前只能够运行1个时间片的时间【用完时间片的进程还未结束,则进程进入下一级队列队尾】,所以当P1执行了1个时间片之后,会被放入到第2级队列队尾,如下图所示。
与此同时,P2进程会进入第1级队列,如下图所示:
由于此时更高级别的就绪队列还有一个进程(P2)没有上处理机运行,所以CPU暂时不会处理P1进程,P2进程会上CPU运行。同样的,P2进程运行的时间也为1个时间片。
因此,P2进程在运行完1个时间片后会被放置在第2级队列,如下图所示:
接下来由于第1级队列中已经没有进程了,那么CPU就会给第2级队列分配时间片,在这里分配了2个时间片。紧接着,CPU处理第2级队列的进程,则P1进程上CPU运行,运行时间为2个时间片。
当P1进程在CPU运行两个时间片后,由于运行时间还没有结束,那么P3进程会被放置在第3级队列队尾。
而此时,第2级队列中还有没处理完的进程P2,P2将会上CPU运行。
在这里要注意:P2进程运行完1个时间片后,也就是说P2进程没有用完CPU所分配的2个时间片时,在5这个时刻,P3进程要进入第1级队列。
由于此时有一个更高优先级的进程,因此会有:P2进程会被剥夺处理机资源被放入原队列队尾(注意:不是放入下一级队列,而是原队列),P3进程会上CPU运行。
P3进程运行了CPU所分配的1个时间片之后,由于P3进程运行时间也为1个时间片,那么P3将会被调出内存。
接下来,P2会上处理机继续运行,由于之前P2已经运行了2个时间片的时间,剩余要运行的时间为4-2=2个时间片的时间,而CPU为第2级队列分配的时间片大小为2,因此P2进程上处理机运行完2个时间片之后会被调出内存。
那么此时,第2级队列为空,CPU就会为第3级队列分配时间片,在这里分配了4个时间片。P1上处理机运行4个时间片。
当P1进程运行了4个大小的时间片之后,由于在之前P1已经运行3个时间片,那么到这里P1已经运行了7个大小的时间片时间了,但P1运行时间为8个大小的时间片,这样P1本该继续进入下一级队列进行等待,但由于我们只设计了三级队列,P1已经在最下一级的队列之中,因此P1会被放置原队列队尾。
接下来P1上处理机运行,在这个过程中P1只需运行1个时间片即可被调出内存。
以上就是各个进程的执行过程。
P1(1)一>P2(1)一>P1(2)一>P2(1)一>P3(1)—>P2(2)—>P1(4)
总结:
- 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
- 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片。若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经在最下级的队列,则重新放回最下级队列队尾。
- 只有第k级队列为空时,才会为k+1级队头的进程分配时间片
- 被抢占处理机的进程重新放回原队列队尾
1.7.4 总结
1.8 时间片轮转、优先级调度、多级反馈队列调度小结
注:比起早期的批处理操作系统来说,由于计算机造价大幅降低,因此之后出现的交互式操作系统(包括分时操作系统、实时操作系统等)更注重系统的响应时间、公平性、平衡性等指标。而这几种算法恰好也能较好地满足交互式系统的需求。因此这三种算法适合用于交互式系统。(比如UNIX使用的就是多级反馈队列调度算法)。
1.9 多级队列调度算法
系统中按进程类型设置多个队列,进程创建成功后插入某个队列
队列之间可采取固定优先级,或时间片划分
- 固定优先级:高优先级空时低优先级进程才能被调度
- 时间片划分:如三个队列分配时间50%、40%、10%
各队列可采用不同的调度策略,如:
- 系统进程队列采用优先级调度
- 交互式队列采用RR
- 批处理队列采用FCFS