操作系统论文-----多级反馈队列调度算法
【操作系统】多级反馈队列算法
【操作系统】多级反馈队列算法1. 原理介绍1. RR时间⽚轮转原理 在采⽤时间⽚轮转算法中,所有的就绪进程按FCFS策略排成⼀个就绪队列。
系统可设置每隔⼀定时间便产⽣⼀次中断,去激活进程调度程序进⾏调度,把CPU分配给队⾸进程,并令其执⾏⼀个时间⽚。
当它运⾏完毕后,⼜把处理机分配给就绪队列中新的队⾸进程,也让它执⾏⼀个时间⽚。
这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得⼀个时间⽚的处理机时间。
在RR调度算法中进程的切换,可分为两种情况:①若⼀个时间⽚尚未⽤完,正在运⾏的进程便已经完成,就⽴即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队⾸的进程运⾏,并启动⼀个新的时间⽚。
②在⼀个时间⽚⽤完时,计时器中断处理程序被激活。
如果进程尚未运⾏完毕,调度程序将把它送往就绪队列的末尾。
2.多级反馈队列调度机制 设置多个就绪队列。
在系统中设置多个就绪队列,并为每个队列赋予不同的优先。
第⼀个队列的优先级最⾼,第⼆个次之,其余队列的优先级逐个降低。
该算法为不同列中的进程所赋予的执⾏时间⽚的⼤⼩也各不相同,在优先级愈⾼的队列中,其时间⽚愈⼩。
每个队列都采⽤FCFS算法。
当新进程进⼊内存后,⾸先将它放⼊第⼀队列的末尾,按FCFS原则等待调度。
当轮到该进程执⾏时,如它能在该时间⽚内完成,便可撤离系统。
否则,即它在⼀个时间⽚结束时尚未完成,调度程序将其转⼊第⼆队列的末尾等待调度;如果它在第⼆队列中运⾏个时间⽚后仍未完成,再依次将它放⼊第三队列...依此类推。
当进程最后被降到第n队列后,在第n队列中便采取按RR⽅式运⾏。
按队列优先级调度。
调度程序⾸先调度最⾼优先级队列中的诸进程运⾏,仅当第⼀队列空闲时才调度第⼆队列中的进程运⾏;仅当第1到(i-1)所有队列均空时,才会调度第i队列中的进程运⾏。
如果处理机正在第i队列中为某进程服务时⼜有新进程进⼊任⼀优先级较⾼的队列,此时须⽴即把正在运⾏的进程放回到第i队列的末尾,⽽把处理机分配给新到的⾼优先级进程。
多级反馈队列调度算法的原理 -回复
多级反馈队列调度算法的原理-回复什么是多级反馈队列调度算法?多级反馈队列调度算法是一种进程调度算法,根据进程的优先级和执行时间,将进程分配到不同的处理队列中,并进行轮转执行。
该算法采用了多个队列和反馈机制,使得进程能够相对公平地竞争CPU资源,并且具有较高的响应速度和吞吐量。
多级反馈队列调度算法的原理是什么?多级反馈队列调度算法的原理主要包括以下几个方面:1. 多个队列:多级反馈队列调度算法采用多个队列来存放进程。
一般来说,队列的数量不固定,可以根据实际情况进行调整。
每个队列都有一个不同的优先级,每个优先级代表了不同的执行时间片长度。
2. 进程分配:当一个进程被提交到系统中时,多级反馈队列调度算法会首先将它分配到最高优先级的队列中。
如果该进程在一个时间片内无法完成,那么它就会被移到下一级队列中,并且等待下一次执行。
同样的,进程在下一级队列中也无法完成时,就会被移到更低优先级的队列中。
这个过程会一直持续到该进程执行完成或被终止。
3. 时间片分配:每个队列中的进程都按照其优先级分配时间片。
优先级较高的队列拥有短的时间片,优先级较低的队列拥有长的时间片。
这个机制可以保证高优先级的进程更快地获得CPU资源,从而提高系统的响应速度。
4. 反馈机制:多级反馈队列调度算法还采用了反馈机制,即当进程在一个队列中等待了一定时间之后,它会被移到一个更高优先级的队列中。
这个机制可以有效地解决进程长时间处于低优先级队列中的问题,从而提高处理效率和响应速度。
多级反馈队列调度算法的实现步骤是什么?多级反馈队列调度算法的实现步骤包括以下几个方面:1. 初始化:初始化多个队列,每个队列都有一个不同的优先级,同时初始化时间片大小和进程调度参数。
2. 进程分配:当一个进程被提交到系统中时,将其分配到最高优先级的队列中。
3. 时间片分配:按照优先级分配时间片,优先级较高的队列拥有较短的时间片,优先级较低的队列拥有较长的时间片。
4. 进程执行:从最高优先级的队列中取出一个进程执行,在一个时间片内完成或被抢占后,将进程移到下一级队列中等待执行。
多级调度算法
多级调度算法什么是多级调度算法?多级调度算法(Multi-Level Feedback Queue,MLFQ)是一种操作系统中的进程调度算法。
它将进程队列分成多个级别,每个级别都有不同的时间片大小和优先级。
当一个进程被加入队列时,它被放置在最高优先级的队列中,如果它在该队列中运行了一段时间后仍未完成,则被降低到较低优先级的队列中继续运行。
这样可以使长时间运行的进程获得更多的CPU时间,并且能够保证短时间运行的进程能够快速响应用户请求。
多级调度算法的特点1. 多个队列:多级调度算法将进程队列分成多个级别,每个级别都有不同的时间片大小和优先级。
2. 时间片轮转:每个队列使用时间片轮转方式进行调度。
3. 优先级:每个队列都有自己的优先级,高优先级的队列会被更频繁地执行。
4. 抢占式:如果一个高优先级进程加入了队列,则当前正在执行的低优先级进程会被抢占。
5. 动态变化:根据当前系统负载情况动态改变各个队列之间切换所需的时间片大小。
多级调度算法的实现步骤1. 初始化队列:将所有进程按照优先级放入不同的队列中,每个队列都有自己的时间片大小。
2. 运行进程:从最高优先级队列开始运行进程,如果该进程在时间片内完成,则被移出队列,否则被降低到较低优先级的队列中继续运行。
3. 抢占式调度:如果一个高优先级进程加入了队列,则当前正在执行的低优先级进程会被抢占。
4. 动态变化:根据当前系统负载情况动态改变各个队列之间切换所需的时间片大小。
5. 结束进程:当一个进程完成或被杀死时,从相应的队列中移出该进程。
多级调度算法存在的问题1. 饥饿问题:如果系统中有大量长时间运行的高优先级进程,则低优先级进程可能会一直等待,导致饥饿问题。
2. 时间片大小选择问题:选择合适的时间片大小非常重要,如果时间片过小,则会导致频繁切换而浪费CPU资源;如果时间片过大,则会导致响应速度变慢。
3. 进程数目过多:当系统中存在大量进程时,多级调度算法的效率会降低。
修改名词:多级反馈队列调度算法的优化方案
修改名词:多级反馈队列调度算法的优化方案摘要本文提出了一种优化多级反馈队列调度算法的方案。
多级反馈队列调度算法是一种常用的进程调度算法,但是在实际应用中存在一些问题,比如优先级的调节和队列的划分等。
为了解决这些问题,我们提出了以下优化方案。
问题描述在多级反馈队列调度算法中,优先级的调节是一个关键问题。
现有的算法中,优先级的调节方式有限,往往无法满足实际需求。
另外,队列的划分也存在一些问题,比如队列的大小不合理,导致某些进程无法被及时调度。
优化方案为了解决上述问题,我们提出了以下优化方案:1. 动态调节优先级:我们引入了一个算法来动态调节进程的优先级。
这个算法可以根据进程的状态和系统负载情况来调整进程的优先级,从而更加合理地进行进程调度。
2. 动态调整队列大小:我们提出了一种方法来动态调整队列的大小。
这个方法可以根据当前进程的数量和优先级情况来调整队列的大小,从而更好地利用系统资源,提高进程的调度效率。
3. 考虑I/O等待时间:我们在调度算法中考虑了进程的I/O等待时间。
当某个进程在等待I/O时,我们会降低其优先级,以便系统可以更好地利用可用的CPU资源。
实施计划为了实施以上优化方案,我们需要以下几个步骤:1. 实现动态调节优先级的算法,并将其整合到多级反馈队列调度算法中。
2. 实现动态调整队列大小的方法,并将其应用到队列划分的过程中。
3. 修改现有的调度算法,加入对I/O等待时间的考虑。
4. 进行实验和测试,评估优化方案的效果和性能。
结论通过以上的优化方案,我们可以改进多级反馈队列调度算法,在实际应用中更好地满足进程调度的需求。
然而,为了确保方案的可行性和有效性,我们需要进一步的实验和测试来验证。
希望这些优化方案能为进程调度算法的优化和改进提供一些参考。
简述多级反馈队列调度算法的基本算法思想
简述多级反馈队列调度算法的基本算法思想
多级反馈队列调度算法是一种常见的实时调度算法。
它是指在一个有多个优先
等级的队列系统中,当同一优先等级的队列有多个作业时,以一定的比率决定任务的执行顺序,并且把任务分配立即分发给不同优先级队列。
这是一种多级反馈算法,可以有效提高服务质量,提高系统可靠性。
多级反馈队列调度算法的基本算法思想是,有一个系统,包括N个等级的队列,其中等级越高,优先级越高,表示该队列累积的作业时间越多,越需要优先处理。
它们交错的排列,以各自的抢占优先的方式竞争,使得优先级最高的等级的队列可以尽可能快地被处理,以减少工作的积压。
多级反馈队列调度算法采用一定的比率在不同等级的队列中循环操作,称为
“反馈”,这样就可以使得不同等级队列中的作业得到相应的处理。
在每次循环中,根据反馈的比率,在优先级高的队列中有一定的任务被处理,然后把该作业转到优先级低的队列中,这样,即使优先级低的队列中的作业量大,也可以保证其在一定的阈值内得到处理。
总之,多级反馈队列调度算法的基本思想是:将有多个优先级的队列系统中的
作业按照一定的比率在不同等级的队列中循环操作,从而把优先级高的队列中的作业尽可能快地处理完,以减少工作的积压,提升服务质量和可靠性。
多级反馈队列调度算法的原理
多级反馈队列调度算法的原理1.多级反馈队列调度算法是一种常见的进程调度算法,旨在平衡系统的吞吐量、响应时间和公平性。
它采用多个队列,每个队列有不同的优先级,进程根据其行为在这些队列之间移动。
本文将详细介绍多级反馈队列调度算法的原理和工作方式。
2. 算法概述多级反馈队列调度算法的核心思想是通过不同优先级的队列来对进程进行调度。
每个队列有不同的时间片大小,高优先级队列的时间片较小,低优先级队列的时间片较大。
当一个进程在当前队列中运行完时间片,它将被移动到下一优先级的队列。
如果一个进程在某个队列运行完时间片后还没有执行完,它将继续在当前队列等待,以便有更多的机会执行。
3. 多级队列结构典型的多级反馈队列调度算法包括多个队列,通常包括三个或更多级别。
每个队列的优先级不同,如高、中、低。
时间片大小逐渐增大,高优先级队列的时间片小于中优先级,中优先级小于低优先级。
4. 调度过程4.1 进程到达当一个新进程到达系统时,它被分配到最高优先级队列。
4.2 运行和时间片耗尽进程在当前队列中运行,如果它的时间片耗尽,它将被移动到下一优先级的队列。
如果进程在当前队列没有完成执行,它将在下一次调度时继续运行。
4.3 优先级提升如果一个进程在低优先级队列等待了很长时间,系统可能会将其提升到高优先级队列,以确保长时间等待的进程有机会获得更多的CPU 时间。
5. 优点5.1 响应时间短由于高优先级队列的时间片较小,进程在高优先级队列中能够更快地执行,因此系统的响应时间相对较短。
5.2 吞吐量高对于短时间运行的进程,能够快速地在高优先级队列中完成执行,有助于提高系统的吞吐量。
5.3 公平性低优先级队列的时间片较大,长时间运行的进程有足够的机会在低优先级队列中执行,增加了系统的公平性。
6. 缺点6.1 管理复杂性多级反馈队列调度算法需要维护多个队列,涉及到队列的调度和进程的迁移,因此管理和实现相对复杂。
6.2 死锁可能如果系统中的进程都是长时间运行的,并且高优先级队列的时间片较小,可能导致低优先级队列中的进程长时间等待,进而引发死锁问题。
多级反馈队列调度算法
多级反馈队列调度算法:(FB算法)(1)设置多个不同优先级的就绪队列,并赋予各个队列大小不同时间片,使得优先级愈高的队列时间片愈小。
(2)新就绪进程总是先进入第一级(即最高优先级)队列的末尾,并按FIFO原则等待调度;当轮到该进程执行时,如它能在规定时间片内完成,便可准备撤离系统,否则将它转入第二级队列末尾,再同样按FIFO原则等待调度;如果它在第二级队列上运行一个时间片后仍未完成,再依次将它转入第三极队列。
如此下去,当一个长作业从第一级队列降到最后一级队列时,便在该队列中采取时间片轮转方式运行。
(3)系统总是调度第一级队列上的进程执行;仅当第一级队列为空时,才调度第二级队列上的进程执行‘类推之,仅当第1~(i-1)为空时,才调度第i级队列上的进程执行。
多级反馈队列算法可有很多变形,如当处理机正在为第I级队列上的进程服务时,又有新进程进入优先级最高的队列,此时,既可采用立即抢占的方式,将正在执行的进程插入第i级队列的末尾,并将处理机分配给新进程;也可以只按时间片进行抢占,等正在执行的进程时间片用完或它不需要CPU时再进行CPU调度。
例题如下:进程到达和需服务时间进程到达时间服务时间A 0 3B 2 6C 4 4D 6 5E 8 2RR算法中,就绪进程按FIFO方式排列,CPU总是分配给队首的进程,并只能执行一个时间片;FB算法将就绪进程排成多个不同优先权及时间片的队列,就绪进程总是按FIFO方式先进入优先权最高的队列,CPU也总是分配给较高优先权队列上的队首进程,若执行一个时间片仍未完成,则转入下一级队列的末尾,最后一级队列采用时间片轮转方式进行调度。
5101520A B ED C A B ED C A B ED C 05101520RR (q=1)FB (q=2i-1)FB (q=2i-1)立即抢占说明:q=2i-1,其中的i表示是在哪个级的队列上,所以,优先级愈高的队列时间片愈小(原理)(1)q=21-1=1执行A,然后放入到第二级队列末尾(2)q=22-1=2A执行结束此时B已经在2秒时到达,放在第一队列的末尾。
操作系统原理课程设计报告多级反馈队列调度算法
目录一.课程设计的目的 (2)二.课程设计的内容及要求 (2)三.实现原理 (2)四.关键算法实现流程图 (3)4.1 多级反馈队列调度算法实现流程图 (3)4.2 文件详细 (3)五.软件运行环境及限制 (4)六.结果输出及分析 (4)初始界面 (4)6.1 主程序界面 (5)执行界面 (6)执行完成 (7)6.4 其他功能 (8)6.5 算法结果说明 (9)6.6 算法核心代码 (9)七.心得体会 (11)八.参考文献 (11)一.课程设计的目的本课程设计是学生学习完《计算机操作系统(第三版)》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二.课程设计的内容及要求设计一个虚拟处理机,编程序演示堆积反馈队列调度算法的具体实现过程三.实现原理该程序基于计算机调度算法中的多级反馈队列算法,使用JA V A语言描述,通过线程和对象的调用来实现该算法的演示。
在多级反馈队列算法中,当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。
当轮到该进程执行时,如它能在该时间片内完成,变可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,在同样地按FCFS原则等待调度执行;如果它在第二个队列中运行一个时间片后仍未完成,在一次将它放入第三队列,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n队列中便采取按时间片转轮的方式运行。
仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均为空时,才会调度第i队列中的进程运行。
如果处理机正常第i队列中的某个进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程返回第i队列的末尾,把处理机分配给新到的高优先权进程。
多级反馈队列调度算法_C语言
多级反馈队列调度算法C语言模拟实现多级反馈队列调度算法:1、设置多个就绪队列,并给队列赋予不同的优先级数,第一个最高,依次递减。
2、赋予各个队列中进程执行时间片的大小,优先级越高的队列,时间片越小。
3、当一个新进程进入内存后,首先将其放入一个对列末尾,如果在一个时间片结束时尚未完成,将其转入第二队列末尾。
4、当一个进程从一个对列移至第n个队列后,便在第n个队列中采用时间片轮转执行完。
5、仅当时间片空闲时,才调度第二个队列中的进程。
(1~i-1)空闲时,才调度i,如果处理机正在第i队列中运行,又有新进程进入优先权较高队列,则新进程抢占处理机,将正在运行的进程放入第i队列队尾,将处理机分给新进程。
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node /*进程节点信息*/{char name[20]; /*进程的名字*/int prio; /*进程的优先级*/int round; /*分配CPU的时间片*/int cputime; /*CPU执行时间*/int needtime; /*进程执行所需要的时间*/char state; /*进程的状态,W——就绪态,R——执行态,F——完成态*/int count; /*记录执行的次数*/struct node *next; /*链表指针*/}PCB;typedef struct Queue /*多级就绪队列节点信息*/{PCB *LinkPCB; /*就绪队列中的进程队列指针*/int prio; /*本就绪队列的优先级*/int round; /*本就绪队列所分配的时间片*/struct Queue *next; /*指向下一个就绪队列的链表指针*/}ReadyQueue;PCB *run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/ReadyQueue *Head = NULL; /*定义第一个就绪队列*/int num; /*进程个数*/int ReadyNum; /*就绪队列个数*/void Output(); /*进程信息输出函数*/void InsertFinish(PCB *in); /*将进程插入到完成队列尾部*/void InsertPrio(ReadyQueue *in); /*创建就绪队列,规定优先数越小,优先级越低*/ void PrioCreate(); /*创建就绪队列输入函数*/void GetFirst(ReadyQueue *queue); /*取得某一个就绪队列中的队头进程*/void InsertLast(PCB *in,ReadyQueue *queue); /*将进程插入到就绪队列尾部*/void ProcessCreate(); /*进程创建函数*/void RoundRun(ReadyQueue *timechip); /*时间片轮转调度算法*/void MultiDispatch(); /*多级调度算法,每次执行一个时间片*/int main(void){PrioCreate(); /*创建就绪队列*/ProcessCreate();/*创建就绪进程队列*/MultiDispatch();/*算法开始*/Output(); /*输出最终的调度序列*/return 0;}void Output() /*进程信息输出函数*/{ReadyQueue *print = Head;PCB *p;printf("进程名\t优先级\t轮数\tcpu时间\t需要时间\t进程状态\t计数器\n");while(print){if(print ->LinkPCB != NULL){p=print ->LinkPCB;while(p){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}}print = print->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}p = run;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}}void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/{PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void InsertPrio(ReadyQueue *in) /*创建就绪队列,规定优先数越小,优先级越低*/{ReadyQueue *fst,*nxt;fst = nxt = Head;if(Head == NULL) /*如果没有队列,则为第一个元素*/{in->next = Head;Head = in;}else /*查到合适的位置进行插入*/{if(in ->prio >= fst ->prio) /*比第一个还要大,则插入到队头*/{in->next = Head;Head = in;}else{while(fst->next != NULL) /*移动指针查找第一个别它小的元素的位置进行插入*/{nxt = fst;fst = fst->next;}if(fst ->next == NULL) /*已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/{in ->next = fst ->next;fst ->next = in;}else /*插入到队列中*/{nxt = in;in ->next = fst;}}}}void PrioCreate() /*创建就绪队列输入函数*/{ReadyQueue *tmp;int i;printf("输入就绪队列的个数:\n");scanf("%d",&ReadyNum);printf("输入每个就绪队列的CPU时间片:\n");for(i = 0;i < ReadyNum; i++){if((tmp = (ReadyQueue *)malloc(sizeof(ReadyQueue)))==NULL){perror("malloc");exit(1);}scanf("%d",&(tmp->round)); /*输入此就绪队列中给每个进程所分配的CPU时间片*/tmp ->prio = 50 - tmp->round; /*设置其优先级,时间片越高,其优先级越低*/tmp ->LinkPCB = NULL; /*初始化其连接的进程队列为空*/tmp ->next = NULL;InsertPrio(tmp); /*按照优先级从高到低,建立多个就绪队列*/}}void GetFirst(ReadyQueue *queue) /*取得某一个就绪队列中的队头进程*/{run = queue ->LinkPCB;if(queue ->LinkPCB != NULL){run ->state = 'R';queue ->LinkPCB = queue ->LinkPCB ->next;run ->next = NULL;}}void InsertLast(PCB *in,ReadyQueue *queue) /*将进程插入到就绪队列尾部*/{PCB *fst;fst = queue->LinkPCB;if( queue->LinkPCB == NULL){in->next = queue->LinkPCB;queue->LinkPCB = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void ProcessCreate() /*进程创建函数*/{PCB *tmp;int i;printf("输入进程的个数:\n");scanf("%d",&num);printf("输入进程名字和进程所需时间:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar(); /*吸收回车符号*/scanf("%d",&(tmp->needtime));tmp ->cputime = 0;tmp ->state ='W';tmp ->prio = 50 - tmp->needtime; /*设置其优先级,需要的时间越多,优先级越低*/tmp ->round = Head ->round;tmp ->count = 0;InsertLast(tmp,Head); /*按照优先级从高到低,插入到就绪队列*/ }}void RoundRun(ReadyQueue *timechip) /*时间片轮转调度算法*/{int flag = 1;GetFirst(timechip);while(run != NULL){while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime == 0) /*进程执行完毕*/{run ->state = 'F';InsertFinish(run);flag = 0;}else if(run->count == timechip ->round)/*时间片用完*/{run->state = 'W';run->count = 0; /*计数器清零,为下次做准备*/InsertLast(run,timechip);flag = 0;}}flag = 1;GetFirst(timechip);}}void MultiDispatch() /*多级调度算法,每次执行一个时间片*/{int flag = 1;int k = 0;ReadyQueue *point;point = Head;GetFirst(point);while(run != NULL){Output();if(Head ->LinkPCB!=NULL)point = Head;while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime == 0) /*进程执行完毕*/{run ->state = 'F';InsertFinish(run);flag = 0;}else if(run->count == run->round)/*时间片用完*/{run->state = 'W';run->count = 0; /*计数器清零,为下次做准备*/if(point ->next!=NULL){run ->round = point->next ->round;/*设置其时间片是下一个就绪队列的时间片*/InsertLast(run,point->next); /*将进程插入到下一个就绪队列中*/flag = 0;}else{RoundRun(point); /*如果为最后一个就绪队列就调用时间片轮转算法*/break;}}++k;if(k == 3){ProcessCreate();}}flag = 1;if(point ->LinkPCB == NULL)/*就绪队列指针下移*/point =point->next;if(point ->next ==NULL){RoundRun(point);break;}GetFirst(point);}}。
多级反馈队列调度算法
多级反馈队列调度算法多级反馈队列调度算法一实验内容以链式结构组成空闲PCB栈,以双向链式结构组成进程的就绪队列和睡眠队列,模拟UNIX的进程管理程序,实现以下操作(可用键盘命令、命令文件或由产生的随机数决定操作和参数)。
(1)创建一个新进程:如pid=newp(pri,size,time),申请空闲PCB和所需内存,填写PCB的各项初始数据,将该PCB送入就绪队列。
(2)调度和执行:自己设计多级反馈队列调度算法,在就绪队列中选择一个优先级最高的进程,使其运行若干单位时间。
要求在运行期间进程的p_cpu、p_pri和p_time要变化,并在适当的时机重新调度。
(3)进程睡眠:进程运行时可调用自编的睡眠函数,主动进入睡眠状态,并转调度程序。
也可由操作使进程强迫挂起,睡眠适当时间。
进程睡眠时要在PCB中记录睡眠原因和优先数。
(4)进程的唤醒:根据睡眠原因,将相应的进程从睡眠队列中调出,转入就绪队列。
如果该进程优先级比现在运行的优先级高,则转调度程序。
(5)进程的终止:如果一个进程运行完作业所需的时间,该进程就终止,释放所占用的内存和PCB资源,转调度程序。
二、设计思想实现多级犯规队列调度算法,多级调度队列分别高优先级(H或h)队列、中优先级(M或m)队列和低优先级的(L或l)队列。
(1)当一个进程在一次运行中用完了时间片(100单位时间)还未完成任务或没有进入阻塞状态,降低其优先级,进入低一级的调度队列。
(2)进程没用完的时间片,就因为I/O等原因转变为阻塞状态。
等到阻塞原因解除,转变为就绪状态后,仍回到原先队列。
(3)当一个进程正在运行时,在更高的优先级的队列中到来了一个进程,那么高优先级的进程可以抢占当前进程的处理机。
被抢占的进程已运行了一定的时间(但没到达100单位时间),仍留在原先的队列中。
(4)进程在时间片内完成了任务,被撤离系统。
三、函数和算法(1)建议使用的PCB数据结构struct mypcb {char p_pid; //进程标志数char p_pstat; //进程状态void *p_addr; //进程映像在内存中的首址int p_size; //进程映像的长度char p_pri; //进程优先数int p_cpu; //进程当前运行的时间int p_time; //作业运行的(剩余)总时间char p_wchan; //进程睡眠原因struct mypcb *p_next,*p_prior; //进程mypcb的双向链指针};(2)主程序:初始化变量和队列从输入文件中读入进程信息,创建进程打印初始的3个调度队列进程调度主循环首先调度高优先级队列进程IF 有进行苏醒设定当前进程运行一段时间,进程剩余时间减去该时间打印当前进程的信息和将要唤醒的进程在睡眠队列唤醒进程,回到调度主循环IF当前进程满足睡眠条件打印当前进程的信息进程移出调度队列加入睡眠队列,回到调度主循环IF 当前进程不满足睡眠条件IF 进程总剩余时间>100运行并用掉时间片中的剩余时间从高优先级队列中移出,加入中优先级队列ELSE用掉全部剩余时间,从队列中删去其次调度次高优先级队列进程(略)最后调度低优先级队列进程(略)如果3个调度队列和睡眠队列皆空,调度循环终止(3)函数i. int init()初始化变量、初始化调度队列和睡眠队列ii. int printlist(struct list *List)打印调度队列中的进程和剩余运行时间iii. int gotosleep(struct mypcb *process)根据进程的剩余运行时间p_time,使其运行一段时间,并设置睡眠状态iv. struct proc *wakeup(struct list *List)判断是否有进程苏醒,本程序设计调用5次,唤醒队列首进程v. int wakeup_work(struct mypcb *p,struct list *List)苏醒进程插进原先优先级队列vi. int newp(char pri,int size,int time)根据优先数、进程大小和运行时间的参数创建一个新进程,为新进程分配内存空间,睡眠原因为空,如进入睡眠,状态为‘s’;vii. int addlist(struct list *List,struct mypcb *process)将进程添加到队列的尾部,包括睡眠队列;四、测试与分析程序输入格式为:./sched <输入文件名>输入文件内容为:优先级内存大小分配时间H 1000 301H 1000 200M 1000 203M 1000 200H 1000 100M 1000 102L 1000 200五、总结和思考1、总结自己实验过程中的心得体会;2、思考以下问题:(1)如何用简单的方法模拟I/O中断或其他事件,使进程睡眠若干时间。
多级队列调度算法
多级队列调度算法
多级队列调度算法是一种多级反馈队列调度算法,是操作系统中用于
调度进程的一种算法。
该算法将进程划分为多个队列,每个队列有不同的
优先级。
进程首先被放入最高优先级的队列中运行,如果执行时间超过了
一个时间片(时间片是操作系统中用于分配给每个进程的固定时间段),
则将进程移到下一个较低优先级的队列中运行。
这个过程会一直进行下去,直到进程最终在最低优先级的队列中结束。
1.初始化多级队列:根据进程的优先级划分多个队列,并为每个队列
分配一个时间片大小。
2.将就绪队列中的进程按照优先级放入相应的队列中。
3.从最高优先级的队列中选取一个进程执行,如果执行时间超过了一
个时间片,则将进程移到下一个较低优先级的队列中。
4.如果进程在当前队列中执行完毕,则从队列中删除。
5.如果所有队列中都没有进程在执行,则算法结束。
然而,多级队列调度算法也存在一些缺点。
首先,该算法需要事先确
定每个队列的优先级和时间片大小,这对于实际应用中的系统是比较困难的。
其次,由于进程会在不同队列之间移动,会导致上下文切换的开销增加,降低系统的效率。
此外,该算法对于长时间运行的进程可能表现出不
公平性,因为长时间运行的进程会不断移动到较低优先级的队列中,导致
执行时间更长。
综上所述,多级队列调度算法是一种灵活的调度算法,可以根据进程的执行情况动态调整优先级。
然而,在实际应用中需要考虑算法的性能开销和公平性等问题,才能更好地发挥多级队列调度算法的优势。
多级队列调度算法和多级反馈队列调度算法
多级队列调度算法和多级反馈队列调度算法在计算机操作系统中,进程调度是指根据一定的策略从就绪队列中选择一个进程分配CPU时间片,使得多个进程能够合理高效地共享CPU资源。
多级队列调度算法和多级反馈队列调度算法是两种常见的进程调度算法。
本文将分别介绍这两种调度算法的原理和特点。
一、多级队列调度算法多级队列调度算法是一种基于优先级的调度算法,将就绪进程划分为多个队列,每个队列具有不同的优先级,其中优先级高的队列具有更高的调度优先级。
调度器按照优先级从高到低的顺序选择进程执行,同一优先级的进程按照先到先服务的原则进行调度。
多级队列调度算法的主要特点如下:1. 简单高效:多级队列调度算法简单直观,易于实现和理解。
由于进程被划分到不同的队列中,能够更好地满足不同进程的调度需求。
2. 公平性:多级队列调度算法可以根据进程的优先级来确定调度顺序,优先级高的进程能够更早地被执行,提高了进程的响应速度。
3. 适应性:多级队列调度算法可以根据不同进程的调度需求来设置不同的优先级,能够更好地满足不同进程的执行要求。
然而,多级队列调度算法也存在一些问题。
例如,如果某个队列中的进程过多,可能会导致低优先级队列的进程长时间得不到执行,影响系统的整体性能。
为了解决这个问题,引入了多级反馈队列调度算法。
二、多级反馈队列调度算法多级反馈队列调度算法是在多级队列调度算法的基础上进行改进的一种调度算法。
它引入了时间片的概念,并允许进程在不同的队列之间移动。
每个队列具有不同的时间片大小和优先级,当一个进程的时间片用完后,它会被移到下一个优先级更低的队列中。
多级反馈队列调度算法的主要特点如下:1. 公平性:多级反馈队列调度算法兼顾了优先级和时间片的概念,能够更加公平地分配CPU时间片,避免某个队列中的进程长时间得不到执行。
2. 弹性:多级反馈队列调度算法能够根据进程的执行情况灵活地调整进程的优先级和时间片大小,提高系统的响应速度和吞吐量。
非抢占式多级反馈队列调度算法
非抢占式多级反馈队列调度算法非抢占式多级反馈队列调度算法是一种常用的进程调度算法,也是操作系统领域中非常经典和重要的一个概念。
在操作系统中,进程调度是指操作系统对进程进行选择和分配处理器的过程,而多级反馈队列调度算法是其中一种常见的调度策略。
一、多级反馈队列调度算法的基本原理1.1 多级反馈队列的设置多级反馈队列调度算法通过设置多个队列,每个队列具有不同的优先级,来实现对进程的调度。
一般来说,优先级高的队列具有更高的调度优先级,而优先级低的队列具有较低的调度优先级。
当一个进程到达系统时,首先被放入最高优先级的队列中,如果在一个时间片内没有执行完毕,则将其移动到优先级稍低的队列中,以此类推,直到进程执行完毕或者被放入最低优先级的队列中。
1.2 时间片的设定在多级反馈队列调度算法中,不同队列具有不同的时间片大小,一般来说,优先级高的队列具有较短的时间片,而优先级低的队列具有较长的时间片。
这样设计的好处是,能够兼顾高优先级进程的及时响应和低优先级进程的长时间执行。
1.3 调度策略多级反馈队列调度算法的核心在于其调度策略。
一般来说,即使在同一优先级的队列中,也采用先来先服务的策略,即按照进程到达的顺序进行调度。
而在不同优先级的队列之间,则按照各自的调度策略来执行。
二、多级反馈队列调度算法的实现在实际的操作系统中,多级反馈队列调度算法的实现需要考虑诸多因素。
首先是如何设置各个队列的优先级和时间片大小,需要根据具体的系统特点和需求来进行调整。
其次是如何具体实现调度策略,包括进程的进入队列和离开队列的条件、时间片的划分和分配等细节问题。
针对不同的操作系统,可能会有不同的实现方式和优化方法。
三、对非抢占式多级反馈队列调度算法的个人理解和观点在我看来,非抢占式多级反馈队列调度算法是一种非常灵活和高效的调度策略。
它能够兼顾到各个进程的优先级和执行时间,既能够保证高优先级进程的及时响应,又能够充分利用处理器资源,提高系统的整体吞吐量。
操作系统论文处理机调度及算法
操作系统论文处理机调度及算法处理机调度及算法摘要:在多道程序环境中,进程数往往多于处理机数,这必然引起多个程序对处理机的竞争问题,分配处理机的任务是由处理机调度程序完成的。
处理机调度是操作系统核心的重要组成部分。
一个作业从提交到执行,要经过三级调度。
处理机常用的调度算法有先来先服务调度算法、短作业或短进程优先调度算法(SJF/SPF)、时间片论转调度算法(RR)、最高优先权优先调度算法(HPF)、最高响应比优先调度算法(HRP)多级反馈队列调度算法。
在实时系统中存在若干实时任务,这些任务对时间有严格要求,并带有某种程度的紧迫性。
关键词:处理机调度算法实时系统处理机调度即进程调度。
在多道程序环境中,进程数往往多于处理机数,这必然引起多个程序对处理机的竞争问题,分配处理机的任务是由处理机调度程序完成的。
如何提高处理机的利用率,在很大程度上取决于调度算法性能的好坏。
处理机调度的目的是满足系统响应时间、吞吐量、处理机的效率等要求,一个作业被提交后,必须经处理机调度后,才能获得执行权力。
一个作业从提交到执行,往往要经过三级调度。
一般情况下,当占用处理机的进程因为某种请求得不到满足而不得不放弃CPU进入等待状态时,或者当时间片到,系统不得不将CPU分配给就绪队列中另一进程的时候,都要引起处理机调度。
除此之外,进程正常结束、中断处理等也可能引起处理机的调度。
处理机调度是操作系统核心的重要组成部分。
要记住进程的状态,如进程名称、指令计数器、程序状态寄存器以及所有通用寄存器等现场信息,将这些信息记录在相应的进程控制块中。
然后根据一定的算法,决定哪个进程能获得处理机,以及占用多长时间。
最后收回处理机,即正在执行的进程因为时间片用完或因为某种原因不能再执行的时候,保存该进程的现场,并收回处理机。
处理机调度的功能中,很重要的一项就是根据一定算法,从就绪队列中选出一个进程占用CPU运行。
可见,算法是处理机调度的关键。
一个作业从提交到执行,往往要经过三级调度,即高级调度、低级调度和中级调度。
多级反馈队列调度算法
如果一个队列中的所有进程都已 完成,则该队列将被移至最低优 先级的队列。
多级反馈队列调度算法是一种先 进的调度算法,它结合了优先级 调度和轮转调度的优点。
在每个时间片内,调度算法会根 据队列的优先级选择一个队列进 行服务。
这种算法能够有效地处理短进程 和长进程,并确保公平性和优先 级。
多级反馈队列调度算法的优缺点
02 03
介绍
多级反馈队列调度算法是计算机操作系统中的一种重要调 度算法,具有灵活性和公平性的特点。该论文主要介绍了 多级反馈队列调度算法的基本原理、实现方法、性能评估 以及在计算机操作系统中的应用。
材料与方法
该论文采用理论分析和实证研究相结合的方法,首先介绍 了多级反馈队列调度算法的基本原理和实现方法,然后通 过模拟实验和性能评估,分析了多级反馈队列调度算法的 性能表现。
多级反馈队列调度算法的优缺点
缺点
实现复杂度:多级反馈队列调度算法的实现复 杂度较高,需要维护多个队列和相应的数据结 构。
优先级反转:在某些情况下,低优先级的进程 可能会占用CPU时间过长,导致高优先级的进 程等待过长时间,这被称为优先级反转问题。
03
多级反馈队列调度算法的设计与实现
算法设计思路和流程
讨论未来工作
尽管多级反馈队列调度算法在性能评估和分析中表现出 了较好的性能,但仍有许多问题需要进一步研究和改进 。例如,我们可以考虑如何优化任务分配策略,使得系 统能够更好地处理大规模和复杂的任务;我们还可以探 讨如何设计更加智能的任务调度策略,以更好地满足实 时性和可靠性等需求。此外,我们也可以将多级反馈队 列调度算法与其他优化算法相结合,以实现更好的系统 性能。
进行排序
03
定期检查队列中的进程是否需要升级或降级,根据其
《操作系统导论》第8章多级反馈队列
《操作系统导论》第8章多级反馈队列多级反馈队列(Multi-level Feedback Queue,简称MLFQ)需要解决两⽅⾯的问题。
⾸先它要优化周转时间,这可以通过优先执⾏较短的⼯作来实现。
然⽽,操作系统常常不知道⼯作要运⾏多久,⽽这⼜是SJF等算法所必需的。
其次,MLFQ希望给⽤户提供较好的交互体验,因此需要降低响应时间。
然⽽,轮转调度虽然降低了响应时间,周转时间却很差。
所以这⾥的问题是:通常我们对进程⼀⽆所知,应该如何构建调度程序来实现这些⽬标?调度程序如何在运⾏过程中学习进程的特征,从⽽做出更好的调度决策?多级反馈队列:基本规则为了构建这样的调度程序,本章将介绍多级消息队列背后的基本算法。
MLFQ中有许多独⽴的队列,每个队列有不同的优先级。
任何时刻,⼀个⼯作只能存在于⼀个队列中。
MLFQ总是优先执⾏较⾼优先级的⼯作(即那些在较⾼级队列中的⼯作)。
每个队列中可能会有多个⼯作,它们具有同样的优先级。
在这种情况下,我们就对这些⼯作采⽤轮转调度。
⾄此,我们得到了MLFQ的两条基本规则:规则1:如果A的优先级⼤于B的优先级,运⾏A不运⾏B规则2:如果A的优先级等于B的优先级,轮转运⾏A和B上图中,最⾼优先级有两个⼯作(A和B),⼯作C位于中等优先级,⽽D的优先级最低。
按刚才介绍的基本规则,由于A和B有最⾼优先级,调度程序将交替的调度他们,⽽C和D永远都没有机会运⾏,除⾮A和B已经完成。
如何改变优先级显然,在⼀个⼯作的⽣命周期中,MLFQ必须按照⼀定的策略改变其优先级。
例如,如果⼀个⼯作不断放弃CPU去等待键盘输⼊,这是交互型进程的可能⾏为,MLFQ因此会让它保持⾼优先级。
相反,如果⼀个⼯作长时间地占⽤CPU,MLFQ会降低其优先级。
通过这种⽅式,MLFQ在进程运⾏过程中学习其⾏为,从⽽利⽤⼯作的历史来预测它未来的⾏为。
下⾯是我们第⼀次尝试优先级调整算法。
规则3:⼯作进⼊系统时,放在最⾼优先级(最上层)队列规则4a:⼯作⽤完整个时间⽚后,降低其优先级(移⼊低⼀级队列)规则4b:如果⼯作在其时间⽚以内主动释放CPU,则优先级不变单个长⼯作假如系统中有⼀个需要长时间运⾏的⼯作,我们看看使⽤当前的MLFQ调度会发⽣什么。
多级反馈调度算法
多级反馈调度算法多级反馈调度算法是一种常见的调度算法,主要用于操作系统中的进程调度。
它的设计思想是根据进程的行为特征和优先级进行动态调整,能够平衡系统的响应时间和吞吐量,提高系统的性能和效率。
在多级反馈调度算法中,进程被分为多个队列,每个队列有不同的优先级。
进程首先进入最高优先级的队列,当队列为空或者时间片到期时,进程被移动到下一级队列中,直到进程执行完毕或者达到最低优先级的队列。
这种调度算法的优点之一是能够根据进程的行为特征进行动态调整。
当进程需要长时间运行,如计算密集型任务时,它会被移动到低优先级的队列,以便给其他需要更快响应的进程提供机会。
反之,当一个进程需要频繁地进行I/O操作,它会被移动到高优先级的队列,以尽快得到处理。
另一个优点是多级反馈调度算法能够提供良好的响应时间和吞吐量。
由于时间片的设定,每个进程在同一级队列中获得的执行时间有限,因此可以迅速切换到其他进程,减少了等待时间,提高了响应速度。
同时,不同优先级的队列可以并行地处理进程,提高了系统的吞吐量。
然而,多级反馈调度算法也存在一些不足之处。
首先,时间片的设置需要合理,如果时间片过短,会增加进程切换的开销;如果时间片过长,会降低系统的响应速度。
其次,算法的性能高度依赖于进程的行为特征,如果进程的行为与预期不符,调度算法可能无法达到最佳效果。
此外,如果进程的数量过多或者队列的数量过少,也会影响调度算法的性能。
在实际应用中,多级反馈调度算法已经得到了广泛的应用。
例如,在操作系统中,可以使用这种调度算法来控制进程的执行顺序,保证系统的稳定性和效率。
此外,在分布式系统中,也可以使用多级反馈调度算法来协调不同节点上的任务执行,提高整个系统的性能。
综上所述,多级反馈调度算法是一种灵活、高效的调度算法,具有良好的响应时间和吞吐量。
虽然它存在一些不足之处,但在合适的场景下能够发挥出优势。
因此,在设计操作系统或者分布式系统时,可以考虑采用多级反馈调度算法来优化系统的性能和效率。
优先级的时间片轮转调度算法和多级反馈队列轮转调度算法
优先级的时间片轮转调度算法和多级反馈队列轮转调
度算法
首先,我们来了解一下操作系统中常用的调度算法——优先级的时
间片轮转调度算法和多级反馈队列轮转调度算法。
优先级的时间片轮转调度算法是操作系统中最早的调度算法之一。
该
算法具有较高的灵活性,能够根据不同任务的不同优先级设置相应的
时间片,实现高优先级任务优先执行的目的。
同时,该算法还具有较
好的公平性,能够保证低优先级任务不会饥饿。
多级反馈队列轮转调度算法是一种先进的调度算法,它能够更好地适
应现代多任务处理的需求。
与优先级的时间片轮转调度算法不同,多
级反馈队列轮转调度算法可以为不同任务设置不同的时间片和优先级,同时还可以根据任务的执行情况自动调整任务的时间片和优先级。
除此之外,它还具有以下一些特点:
1. 支持动态任务数量的变化,并自动调整任务的优先级和时间片大小。
2. 支持任务的抢占,即高优先级任务可以随时抢占低优先级任务的执行,并立即得到处理器资源的分配。
3. 具有较强的适应性和灵活性,能够适应不同的任务负载和系统负荷。
4. 可以实现高效的任务调度和资源调配,优化系统的整体性能。
总的来说,无论是优先级的时间片轮转调度算法还是多级反馈队列轮转调度算法,都是操作系统中重要的调度算法,各具特点,可根据不同的应用场景选择合适的算法以优化系统性能。
操作系统论文-----多级反馈队列调度算法
在多道程序环境下,主存中有着多个进程,其数目往往多过于处理机数目。
这就要求系统能按某种算法,动态的把处理机分配给就绪队列中的一个进程,使之执行。
在OS中的调度的实质是一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。
对于不同的系统和系统目标,通常采用不同的调度算法,目前存在的多种调度算法中,有的算法适用于作业电镀,有的算法适用于进程调度;但也有些调度算法即可用于作业调度,也可用于进程调度。
多级反馈队列调度算法是一种CPU处理机调度算法,它不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。
多级反馈队列调度算法的思想设置多个就绪队列,并为各个队列赋予不同的优先级和不同长度的时间片;第一个队列的优先级最高,进程所执行时间片最小。
新创建的进程挂到第一优先级的队列后,然后按FCFS 原则排队等待调度。
当轮到其执行时,如它能在时间片内完成,便撤离系统;如果不能完成,便被挂入第二级队列后,……;仅当第一级队列空闲时,调度程序才调度第二级队列中的进程运行,依次类推……;新进程可抢占低级进程的处理机。
多级(假设为N级)反馈队列调度算法可以如下原理:1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。
一般来说,优先级Priority(Q1) > Priority(Q2) > ... >Priority(QN)。
怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。
2、对于某个特定的队列来说,里面是遵循时间片轮转法。
也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。
多级反馈队列调度算法的研究与实现
新到进程
时 间 片 用 完
就绪队列一 就绪队列二 就绪队列三
CPU
进
至完成队列
程
调
度
4.详细设计与实现
时间片轮转调
度 图 1 多级反馈队列调度算法示意图
4.1 算法设计流程图 在设计多级反馈队列调度算法流程图的过程中,因为篇幅原因,对该算法的设
计思想中的重要部分进行了详细的描绘,比如一个就绪队列中的多个进程应如何调 度以及进程如何在不同就绪队列之间移动,至于其他部分如创建队列﹑创建进程﹑
5
块,对应模块编程,最后实现整个算法。该算法的主要函数如下所示:
void Creat_Que(void);
/*1 创建就绪队列函数*/
void Give_Prior(Queue *que);
/*2 队列排序函数 */
void Creat_Proc(void);
/*3 创建进程函数*/
void Insert_Rea(PCB *pc,Queue *que); /*4 将进程插入到就绪队列尾部*/
void Get_Fir(Queue *que);
/*5 取得就绪队列中的队头进程*/
详细设计与实现141算法设计流程图在设计多级反馈队列调度算法流程图的过程中因为篇幅原因对该算法的设计思想中的重要部分进行了详细的描绘比如一个就绪队列中的多个进程应如何调度以及进程如何在不同就绪队列之间移动至于其他部分如创建队列创建进程时间片轮转调新到进程时间片用完至完成队列进程调度cpu就绪队列三就绪队列二就绪队列一4新进程到达等一笔带过但在算法实现中将会实现所有的设计思想该算法详细设计流程图如2所示
(6).除 最 低 优 先 权 队 列 外 的 所 有 其 他 队 列 , 均 采 用 相 同 的 进 程 调 度 算 法 ,即 按 时 间 片 轮 转 的 FCFS 算 法 ,最 后 一 个 队 列 中 的 进 程 按 按 时 间 片 轮 转 算 法 进 行 调 度 , 该算法的中的进程调度如图 1 所示:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在多道程序环境下,主存中有着多个进程,其数目往往多过于处理机数目。
这就要求系统能按某种算法,动态的把处理机分配给就绪队列中的一个进程,使之执行。
在OS中的调度的实质是一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。
对于不同的系统和系统目标,通常采用不同的调度算法,目前存在的多种调度算法中,有的算法适用于作业电镀,有的算法适用于进程调度;但也有些调度算法即可用于作业调度,也可用于进程调度。
多级反馈队列调度算法是一种CPU处理机调度算法,它不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。
多级反馈队列调度算法的思想设置多个就绪队列,并为各个队列赋予不同的优先级和不同长度的时间片;第一个队列的优先级最高,进程所执行时间片最小。
新创建的进程挂到第一优先级的队列后,然后按FCFS 原则排队等待调度。
当轮到其执行时,如它能在时间片内完成,便撤离系统;如果不能完成,便被挂入第二级队列后,……;仅当第一级队列空闲时,调度程序才调度第二级队列中的进程运行,依次类推……;新进程可抢占低级进程的处理机。
多级(假设为N级)反馈队列调度算法可以如下原理:1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。
一般来说,优先级Priority(Q1) > Priority(Q2) > ... >Priority(QN)。
怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。
2、对于某个特定的队列来说,里面是遵循时间片轮转法。
也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。
3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。
各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。
同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最低的队列)的时间片一般很大(不需要考虑这个问题)。
多级反馈队列调度算法描述:1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。
2、首先调度优先级高的队列中的进程。
若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。
例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。
3、对于同一个队列中的各个进程,按照时间片轮转法调度。
比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。
4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。
我们来看一下该算法是如何运作的:假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。
现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。
而它们所需要的CPU时间分别是3,2,1个时间片。
1、时刻0 J1到达。
于是进入到队列1 ,运行1个时间片,时间片还未到,此时J2到达。
2、时刻1 J2到达。
由于时间片仍然由J1掌控,于是等待。
J1在运行了1个时间片后,已经完成了在Q1中的2个时间片的限制,于是J1置于Q2等待被调度。
现在处理机分配给J2。
3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。
4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。
5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。
6、时刻5 J3经过1个时间片,完成。
7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。
8、时刻7 J1再经过一个时间片,完成了任务。
于是整个调度过程结束。
从上面的例子看,在多级反馈队列中,后进的作业不一定慢完成。
FCFS、SJF和优先级调度算法仅对某一类作业有利,相比之下,它能全面满足不同类型作业的需求,较好实现公平性与资源利用率之间的平衡。
对交互型作业,由于通常较短,这些作业在第一队列规定的时间片内完成,可使用户感到满意;对短批作业,开始时在第一队列中执行一个时间片就可完成,便可与交互型作业一样获得快速晌应,否则通常也仅需在第二、第三队列中各执行一个时间片即可完成,其周转时间仍较短;对长批作业,它们依次在第一至第n个队列中轮番执行,不必担心长时间得不到处理。
多级队列调度算法的性能终端型用户:由于终端型用户所提交的作业大多属于交互型作业,作业通常都比较小,系统只要能够使这些作业在第一队列所规定的时间片内完成,便可以使终端型用户感到满意。
短批处理作业用户:对于很短的批处理型作业,开始时象终端型作业一样,如果仅在第一队列中执行一个时间片即可完成,便可以获得与终端型作业一样的响应时间。
对于稍长的作业,通常也只需要在第二队列和第三队列各执行一个时间片即可完成,周转时间还是比较短。
长批处理作业用户:对于长作业,他将依次在n个队列中运行,然后按照轮转的方法运行,用户不必担心其作业长期得不到处理。
多级反馈队列调度实现思想允许进程在队列之间移动。
在系统中设置多个就绪队列,每个队列对应一个优先级,第一个队列的优先级最高,第二队列次之。
以下各队列的优先级逐步低。
各就绪队列中的进程的运行时间片不同,高优先级队列的时间片小,低优先级队列的时间片大。
进程并非总是固定在某一队列中,新进程进入系统后,被存放在第一个队列的末尾。
如果某个进程在规定的时间片内没有完成工作,则把它转入到下一个队列的末尾,直至进入最后一个队列。
系统先运行第一个队列中的进程。
当第一队列为空时,才运行第二个队列中的进程。
依此类推,仅当前面所有的队列都为空时,才运行最后一个队列中的进程。
当处理器正在第i个队列中为某个进程服务时,又有新进程进入优先级最高的队列(第1—(i-1)中的任何一个对列),则此新进程要抢占正在运行进程的处理器,即由调度程序把正在运行的进程放回第i队列的末尾,把处理器分配给新到的高优先级进程。
除最低优先权队列外的所有其他队列,均采用相同的进程调度算法,即按时间片轮转的FIFO(先进先出)算法。
最后一个队列中的进程按按时间片轮转或FCFS策略进行调度。
它是综合了FIFO、RR和剥夺式HPF的一种进程调度算法#include <stdio.h>#include <stdlib.h>#define M 3//队列总数#define N 5//进程总数typedef struct pcb{int id;//进程号int intime;//提交时间int priority;//优先级int starttime;//开始执行时间int length;//进程长度大小int endtime;//结束时间char state;//状态int ptime;//时间片struct pcb *next;}*PCB,pcb;//进程控制块PCB CreatReady(PCB R,int i){R=(PCB)malloc(sizeof(pcb));R->id=i+1;R->priority=5-i;R->ptime=i+1;R->state='R';R->next=NULL;printf("第%d级:\t%d\t%d\n",R->id,R->priority,R->ptime);return R;}PCB CreatWait(PCB W){int i;pcb *p,*q;q=W;printf("给进程初始化如下(tab键隔开):\n");printf("进程\tin时间\t优先级\t长度\n");for(i=0;i<N;i++){p=(PCB)malloc(sizeof(pcb));p->next=NULL;p->id=i+1;printf("P%d\t",p->id);scanf("%d\t%d\t%d",&p->intime,&p->priority,&p->length);q->next=p;q=p;}return W;}void Insert(PCB R,pcb *cp){pcb *tail;tail=R;while(tail->next){tail=tail->next;}tail->next=cp;cp->next=NULL;}int FindQuery(PCB R[M]){int i,j;for(i=0;i<M;i++){if(R[i]->next){j=i;break;}elseprintf("第%d级就绪队列为空\n",R[i]->id);}return j;}int Dispatch(PCB R,pcb *cp,PCB W,int time,pcb *tp){int s;pcb *p,*phead;phead=W;p=W->next;cp->starttime=time;cp->length-=R->ptime;cp->endtime=cp->starttime+R->ptime;if(cp->length<=0){s=1;//表示完成cp->endtime+=cp->length;}else{if(p){while(p){if((p->intime<cp->endtime)&&(p->priority>cp->priority)){tp->id=p->id;tp->intime=p->intime;tp->length=p->length;tp->priority=p->priority;tp->state=p->state;//将抢占进程p备份到tp中phead->next=p->next;//从后备队列中删除抢占的进程cp->length +=cp->endtime-tp->intime;cp->endtime-=cp->endtime-tp->intime;s=-1;//表示被抢占break;}elseif(p->intime>=cp->endtime){s=0;//在后备队列中没有可以抢占的进程时break;}p=p->next;phead=phead->next;}//查找可以抢占cpu的优先级高的进程tp}else s=0;//在后备队列没有进程时}return s;}void Print(PCB F){pcb *p;p=F->next;while(p){printf("P%d\t结束时间:%d\n",p->id,p->endtime);p=p->next;}}PCB MFQ(PCB W,PCB R[M],PCB F){pcb *cp;//当前系统操作的进程pcb *tp;//抢占cpu的进程tp=(PCB)malloc(sizeof(pcb));tp->priority=0;tp->next=NULL;int time=0;//time表示系统当前时间int Finish=0;int i,have,j;int s;while(Finish<N){cp=W->next;if(cp&&cp->intime<=time){have=1;}elsehave=0;//判断当前时刻有无进程被提交if(have){i=0;W->next=cp->next;//从后备队列中删除cpInsert(R[0],cp);cp->priority=R[0]->priority;cp->state=R[0]->state;cp=R[0]->next;printf("%d时,P%d被提交入就绪队列%d\n",time,cp->id,R[0]->id);}//将新进程入第一级就绪队列else{i=FindQuery(R);//循环查找不为空的就绪队列cp=R[i]->next;printf("%d时,无可以提交的进程,因此转到就绪队列%d执行P%d\n",time,R[i]->id,cp->id);}s=Dispatch(R[i],cp,W,time,tp);//cpu执行进程,并生成三种结果if(s==1){R[i]->next=cp->next;//从就绪队列中删除已完成的进程Insert(F,cp);Finish++;printf("%d时,P%d处理完成!\n",cp->endtime,cp->id);}if(s==0){if(i<2) j=i+1;else j=i;R[i]->next=cp->next;//从就绪队列中删除时间片耗尽的进程Insert(R[j],cp);cp->priority=R[j]->priority;printf("%d时,P%d因时间片耗尽进入下一级就绪队列%d!\n",cp->endtime,cp->id,R[j]->id);}if(s==-1){R[i]->next=cp->next;Insert(R[i],cp);tp->next=R[0]->next;R[0]->next=tp;tp->priority=R[0]->priority;tp->state=R[0]->state;//将抢占cpu的进程进入第一级就绪队列并首先执行printf("%d时,P%d被P%d抢占cpu并转入就绪队列%d队尾!\n",cp->endtime,cp->id,tp->id,R[i]->id);}time=cp->endtime;}return F;}void main (){PCB W;//后备队列PCB R[M];//就绪队列PCB F;//完成队列int i;printf("就绪队\t优先级\t时间片\n");for(i=0;i<M;i++){R[i]=CreatReady(R[i],i);}//创建就绪队列W=(PCB)malloc(sizeof(pcb));W->state='W';W->next=NULL;W=CreatWait(W);//创建后备队列F=(PCB)malloc(sizeof(pcb));F->state='F';F->next=NULL;//创建完成队列F=MFQ(W,R,F);//MFQ算法调度printf("完成队列如下:\n");Print(F);}。