操作系统论文-----多级反馈队列调度算法
【操作系统】多级反馈队列算法

【操作系统】多级反馈队列算法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队列的末尾,把处理机分配给新到的高优先权进程。
- 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);}。