多级反馈队列_实验_操作系统
【操作系统】多级反馈队列算法

【操作系统】多级反馈队列算法1. 原理介绍1. RR时间⽚轮转原理 在采⽤时间⽚轮转算法中,所有的就绪进程按FCFS策略排成⼀个就绪队列。
系统可设置每隔⼀定时间便产⽣⼀次中断,去激活进程调度程序进⾏调度,把CPU分配给队⾸进程,并令其执⾏⼀个时间⽚。
当它运⾏完毕后,⼜把处理机分配给就绪队列中新的队⾸进程,也让它执⾏⼀个时间⽚。
这样,就可以保证就绪队列中的所有进程在确定的时间段内,都能获得⼀个时间⽚的处理机时间。
在RR调度算法中进程的切换,可分为两种情况:①若⼀个时间⽚尚未⽤完,正在运⾏的进程便已经完成,就⽴即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队⾸的进程运⾏,并启动⼀个新的时间⽚。
②在⼀个时间⽚⽤完时,计时器中断处理程序被激活。
如果进程尚未运⾏完毕,调度程序将把它送往就绪队列的末尾。
2.多级反馈队列调度机制 设置多个就绪队列。
在系统中设置多个就绪队列,并为每个队列赋予不同的优先。
第⼀个队列的优先级最⾼,第⼆个次之,其余队列的优先级逐个降低。
该算法为不同列中的进程所赋予的执⾏时间⽚的⼤⼩也各不相同,在优先级愈⾼的队列中,其时间⽚愈⼩。
每个队列都采⽤FCFS算法。
当新进程进⼊内存后,⾸先将它放⼊第⼀队列的末尾,按FCFS原则等待调度。
当轮到该进程执⾏时,如它能在该时间⽚内完成,便可撤离系统。
否则,即它在⼀个时间⽚结束时尚未完成,调度程序将其转⼊第⼆队列的末尾等待调度;如果它在第⼆队列中运⾏个时间⽚后仍未完成,再依次将它放⼊第三队列...依此类推。
当进程最后被降到第n队列后,在第n队列中便采取按RR⽅式运⾏。
按队列优先级调度。
调度程序⾸先调度最⾼优先级队列中的诸进程运⾏,仅当第⼀队列空闲时才调度第⼆队列中的进程运⾏;仅当第1到(i-1)所有队列均空时,才会调度第i队列中的进程运⾏。
如果处理机正在第i队列中为某进程服务时⼜有新进程进⼊任⼀优先级较⾼的队列,此时须⽴即把正在运⾏的进程放回到第i队列的末尾,⽽把处理机分配给新到的⾼优先级进程。
操作系统中常用作业调度算法的分析

操作系统中常用作业调度算法的分析作业调度算法是操作系统中非常重要的一部分,它负责决定哪个进程应该被调度执行、以及在什么时候执行。
不同的作业调度算法会对系统的性能和资源利用率产生不同的影响,因此了解和分析常用的作业调度算法对于优化系统性能至关重要。
在操作系统中,常用的作业调度算法包括先来先服务(FCFS)、短作业优先(SJF)、最高响应比优先(HRRN)、优先级调度、轮转调度和多级反馈队列调度等。
下面对这些常见的作业调度算法进行详细分析。
1. 先来先服务(FCFS)先来先服务是最简单的作业调度算法之一,它按照作业到达的先后顺序来进行调度。
当一个作业到达系统后,系统会将其放入就绪队列,然后按照先来先服务的原则,依次执行队列中的作业。
FCFS算法的优点是实现简单、公平性好,但缺点也非常明显。
由于该算法没有考虑作业的执行时间,因此可能导致长作业等待时间过长,影响系统的响应时间和吞吐量。
2. 短作业优先(SJF)短作业优先算法是一种非抢占式作业调度算法,它会根据作业的执行时间来进行调度。
当一个作业到达系统后,系统会根据其执行时间与就绪队列中其他作业的执行时间进行比较,选取执行时间最短的作业进行执行。
SJF算法的优点是能够最大程度地减少平均等待时间,提高系统的响应速度和吞吐量。
但这种算法也存在缺陷,即当有长作业不断地进入系统时,可能导致短作业一直得不到执行,进而影响系统的公平性。
3. 最高响应比优先(HRRN)最高响应比优先算法是一种动态优先级调度算法,它根据作业的响应比来进行调度。
作业的响应比定义为(等待时间+服务时间)/ 服务时间,响应比越高的作业被优先调度执行。
HRRN算法的优点是能够最大程度地提高系统的响应速度,同时保持较高的公平性。
但由于需要不断地计算和更新作业的响应比,因此算法的复杂度较高。
4. 优先级调度优先级调度算法是一种静态优先级调度算法,它根据作业的优先级来进行调度。
每个作业在进入系统时就会被赋予一个优先级,系统会按照作业的优先级来决定执行顺序。
操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。
二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。
常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、轮转法(Round Robin)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。
1.先来先服务(FCFS)算法:按照进程到达的先后顺序进行调度,被调度的进程一直执行直到结束或主动阻塞。
2.最短作业优先(SJF)算法:按照进程需要的执行时间的短长程度进行调度,执行时间越短的进程越优先被调度。
3. 优先级调度(Priority Scheduling)算法:为每个进程分配一个优先级,按照优先级从高到低进行调度。
4. 轮转法(Round Robin)算法:将进程按照到达顺序排列成一个队列,每个进程被分配一个时间片(时间量度),当时间片结束时,将进程从队列头取出放置到队列尾。
5.多级反馈队列调度算法:将进程队列分为多个优先级队列,每个队列时间片大小依次递减。
当一个队列中的进程全部执行完毕或者发生阻塞时,将其转移到下一个优先级队列。
三、实验步骤与结果1.实验环境:- 操作系统:Windows 10- 编译器:gcc2.实验过程:(1)首先,设计一组测试数据,包括进程到达时间、需要的执行时间和优先级等参数。
(2)根据不同的调度算法编写相应的调度函数,实现对测试数据的调度操作。
(3)通过模拟实验,观察不同调度算法之间的区别,比较平均等待时间、完成时间和响应时间的差异。
(4)将实验过程和结果进行记录整理,撰写实验报告。
3.实验结果:这里列举了一组测试数据和不同调度算法的结果,以便对比分析:进程,到达时间,执行时间,优先------,----------,----------,-------P1,0,10,P2,1,1,P3,2,2,P4,3,1,P5,4,5,a.先来先服务(FCFS)算法:平均等待时间:3.8完成时间:15b.最短作业优先(SJF)算法:平均等待时间:1.6完成时间:11c. 优先级调度(Priority Scheduling)算法:平均等待时间:2.8完成时间:14d. 轮转法(Round Robin)算法:时间片大小:2平均等待时间:4.8完成时间:17e.多级反馈队列调度算法:第一级队列时间片大小:2第二级队列时间片大小:4平均等待时间:3.8完成时间:17四、实验总结通过上述的实验结果可以得出以下结论:1.在上述测试数据中,最短作业优先(SJF)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。
操作系统 多级反馈队列算法例题

操作系统:多级反馈队列算法例题在操作系统中,调度算法是用来管理和执行进程的重要工具。
其中,多级反馈队列调度算法是一种经典的调度算法,它能够根据进程的优先级和执行情况动态地调整进程的执行顺序,以达到更高效的资源利用和更快速的响应时间。
接下来,我们将通过一个例题来深入探讨多级反馈队列调度算法的原理和应用。
假设有5个进程,它们的执行时间分别为3、5、2、7和4个单位。
我们可以构建一个具有3个队列的多级反馈队列调度算法,每个队列的优先级不同,分别为高、中、低。
在这个例题中,我们将以此为例,进行具体的调度过程。
将这5个进程按照它们的到达时间依次加入到第一个队列中,然后按照先来先服务的原则进行调度。
假设第一个队列的时间片为2个单位。
在第一个队列中,我们依次执行进程1和进程2,并在时间片用完之后将它们移到第二个队列中。
此时,这两个进程还有未完成的执行时间,因此它们进入第二个队列的队尾。
接下来,轮到第三个进程加入到第一个队列中,并按照相同的规则进行调度。
在第一个队列中,我们执行进程3的两个时间片,然后将它移到第二个队列中。
此时,第一个队列已经没有进程,因此我们开始执行第二个队列中的进程。
依次类推,直到所有的进程执行完毕。
通过这个例题,我们可以清楚地看到多级反馈队列调度算法是如何根据进程的优先级和执行情况进行动态调整的。
它能够兼顾短作业和长作业,保证了系统的公平性和响应速度。
总结起来,多级反馈队列调度算法是一种高效的进程调度算法,它能够根据进程的优先级和执行情况动态地调整执行顺序,以提高系统的资源利用和响应速度。
通过深入地理解和应用这个调度算法,我们能够更好地优化系统性能,提升用户体验。
在我看来,多级反馈队列调度算法是非常值得学习和掌握的一种调度算法。
它不仅能够帮助我们更好地理解操作系统的工作原理,还能够在实际的系统设计和优化中发挥重要作用。
我会继续深入研究这个算法,并将其应用到实际的项目中去。
希望本文能够帮助您更深入地理解多级反馈队列调度算法,并对操作系统有更全面、深刻和灵活的理解。
线程调度的三种方法

线程调度的三种方法
线程调度是操作系统中的重要概念之一,它指的是操作系统如何在多个线程之间分配处理器资源。
在实际的操作系统中,有三种常用的线程调度方法,分别是时间片轮转法、优先级调度法和多级反馈队列调度法。
时间片轮转法是一种基于时间片的调度方法。
操作系统将每个线程分配一个固定长度的时间片,当时间片用完后,操作系统会自动切换到下一个线程。
这种调度方法实现简单,能保证公平性,但是在高负载的情况下容易出现饥饿现象。
优先级调度法是一种基于线程优先级的调度方法。
每个线程都会被赋予一个优先级,优先级高的线程被优先调度。
这种调度方法可以保证高优先级线程的及时响应,但是如果优先级过于低的线程可能会被长期阻塞。
多级反馈队列调度法是一种综合了时间片轮转和优先级调度的
方法。
操作系统将线程按照优先级分成多个队列,并为每个队列分配不同的时间片。
当一个线程在一个队列中运行的时间超过了时间片,它就会被移到下一个队列中,直到运行完毕。
这种调度方法可以保证高优先级线程的及时响应,同时避免低优先级线程的饥饿现象。
总之,不同的线程调度方法适用于不同的场景,操作系统可以根据实际情况选择恰当的调度策略。
- 1 -。
多级反馈队列调度算法的实现

学生实习报告课程名称_ 数据结构与数据处理应用训练题目名称多级反馈队列调度算法的实现学生学院计算机与计算科学专业班级学号学生姓名指导教师2012年 2月 16 日多级反馈队列调度算法的实现【摘要】多级反馈队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成。
UNIX操作系统便采取这种算法,而本次试验就是试用C语言模拟某多级反馈队列调度算法。
本次试验中前三级就绪队列采用时间片轮转法,时间片大小分别为2、4和8,最后一级就绪队列采用FIFO调度,将任务进入多级队列进行模拟,任务从优先级高的队列到优先级地的队列的顺序逐一进入,还用了算法支持抢占式,最后完成模拟,得到各个任务先后完成的顺序,还有得到各个任务的响应时间、离开时间、周转时间。
【关键词】队列优先级任务时间1 内容与要求【内容】多级反馈队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成。
UNIX操作系统便采取这种算法,本次试验就是试用C语言模拟某多级反馈队列调度算法,通过输入任务号、到达时间、运行时间,求出任务完成的先后顺序以及各个任务的响应时间、离开时间、周转时间。
【要求】多级反馈队列调度算法描述:1、该调度算法设置四级就绪队列:前三级就绪队列采用时间片轮转法,时间片大小分别为2、4和8;最后一级就绪队列采用FIFO调度。
2、任务在进入待调度的队列等待时,首先进入优先级最高的队列等待。
3、首先调度优先级高的队列中的任务。
若高优先级中队列中已没有调度的任务,则调度次优先级队列中的任务,依次类推。
4、对于同一个队列中的各个任务,按照队列指定调度方法调度。
每次任务调度执行后,若没有完成任务,就被降到下一个低优先级队列中。
5、在低优先级的队列中的任务在运行时,又有新到达的任务,CPU马上分配给新到达的任务。
(注:与原来的题目不同,原题是在低优先级的队列中的任务在运行时,又有新到达的任务时,要在运行完这个时间片后,CPU马上分配给新到达的任务,而本题不需要在运行完这个时间片,即正在进行的任务立刻停止,CPU 马上分配给新到达的任务)6、为方便实现,时间以1为单位,用整数数据表示;且每个时间点,最多只有一个任务请求服务(即输入)。
反馈调度算法实验报告

一、实验目的本次实验旨在通过模拟操作系统中的反馈调度算法,加深对进程调度过程的理解,掌握不同调度算法的原理和实现方法,并分析其优缺点。
实验内容包括实现三种反馈调度算法:先来先服务(FCFS)、时间片轮转(RR)和多级反馈队列(MFQ)。
二、实验内容1. 数据结构设计本实验采用进程控制块(PCB)来表示进程,PCB包含以下信息:- 进程名- 到达时间- 需要运行时间- 已运行时间- 进程状态(就绪、运行、完成)2. 调度算法实现(1)先来先服务(FCFS)调度算法FCFS算法按照进程到达就绪队列的顺序进行调度,即先到达的进程先执行。
具体实现步骤如下:- 将所有进程按到达时间排序,形成就绪队列。
- 当CPU空闲时,从就绪队列中取出第一个进程执行,执行完毕后,再取出下一个进程执行。
(2)时间片轮转(RR)调度算法RR算法将CPU时间划分为时间片,每个进程轮流占用CPU执行一个时间片。
具体实现步骤如下:- 将所有进程按到达时间排序,形成就绪队列。
- 当CPU空闲时,从就绪队列中取出第一个进程执行,执行一个时间片。
- 如果进程执行完毕,则将其状态设置为完成;如果进程未执行完毕,则将其状态设置为就绪,并插入就绪队列末尾。
- 继续执行下一个进程,直到所有进程执行完毕。
(3)多级反馈队列(MFQ)调度算法MFQ算法将就绪队列分为多个优先级队列,每个队列具有不同的时间片长度。
具体实现步骤如下:- 将所有进程按到达时间排序,形成就绪队列。
- 将就绪队列分为多个优先级队列,优先级越高,时间片越短。
- 当CPU空闲时,从最高优先级队列中取出第一个进程执行,执行一个时间片。
- 如果进程执行完毕,则将其状态设置为完成;如果进程未执行完毕,则将其状态设置为就绪,并插入下一个优先级队列的末尾。
- 如果当前优先级队列中的所有进程都执行完毕,则降低优先级,继续执行下一个优先级队列的进程。
三、实验结果分析1. FCFS算法FCFS算法简单易实现,但存在“饥饿”现象,即低优先级进程可能长时间得不到调度。
几种操作系统调度算法

几种操作系统调度算法操作系统调度算法是操作系统中用于确定进程执行的顺序和优先级的一种方法。
不同的调度算法有不同的优缺点,适用于不同的场景和需求。
下面将介绍几种常见的操作系统调度算法:1.先来先服务(FCFS)调度算法:先来先服务调度算法是最简单的调度算法之一、按照进程到达的顺序进行调度,首先到达的进程先执行,在CPU空闲时执行下一个进程。
这种算法实现简单,并且公平。
但是,由于没有考虑进程的执行时间,可能会导致长作业时间的进程占用CPU资源较长时间,从而影响其他进程的响应时间。
2.短作业优先(SJF)调度算法:短作业优先调度算法是根据进程的执行时间进行排序,并按照执行时间最短的进程优先执行。
这种算法可以减少平均等待时间,提高系统的吞吐量。
然而,对于长作业时间的进程来说,等待时间会相对较长。
3.优先级调度算法:优先级调度算法是根据每个进程的优先级来决定执行顺序的。
优先级可以由用户设置或者是根据进程的重要性、紧迫程度等因素自动确定。
具有较高优先级的进程将具有更高的执行优先级。
这种算法可以根据不同情况进行灵活调度,但是如果不恰当地设置优先级,可能会导致低优先级的进程长时间等待。
4.时间片轮转(RR)调度算法:时间片轮转调度算法将一个固定的时间片分配给每个进程,当一个进程的时间片用完时,将该进程挂起,调度下一个进程运行。
这种算法可以确保每个进程获得一定的CPU时间,提高系统的公平性和响应速度。
但是,对于长时间运行的进程来说,可能会引起频繁的上下文切换,导致额外的开销。
5.多级反馈队列(MFQ)调度算法:多级反馈队列调度算法将进程队列划分为多个优先级队列,每个队列有不同的时间片大小和优先级。
新到达的进程被插入到最高优先级队列,如果进程在时间片内没有完成,则被移到下一个较低优先级队列。
这种算法可以根据进程的执行表现自动调整优先级和时间片,更好地适应动态变化的环境。
以上是几种常见的操作系统调度算法,每种算法都有其优缺点和适用场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称:多级反馈队列调度09091201丁奎荣一、实验目的:1、综合应用下列知识点设计并实现操作系统的进程调度,进程状态转换,多组级反馈队列进程调度算法。
2、加深理解操作系统进程调度的过程。
3、加深理解多级反馈队列进程调度算法。
二、实验内容:1、采用一种熟悉的语言,编制程序,最好采用C/C++,界面设计可采用其它自己喜欢的语言。
2、采用多级反馈队列进程调度算法进行进程调度。
3、每个进程对应一个PCB。
在PCB中包括进程标识符pid、进程的状态标志status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。
4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid时在1到100范围的一个整数。
可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程号是空闲的,“假”表示下标对应的进程号已分配给某个进程。
5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。
被进程调度程序选中后变为“run”。
6、进程优先级priority是0到49范围内的一个随机整数。
7、生命周期life是1到5范围内的一个随机整数。
8、初始化时,创建一个邻接表,包含50各就绪队列,各就绪队列的进程优先级priority分别是0到49。
9、为了模拟用户动态提交任务的过程,要求动态创建进程。
进入进程调度循环后,每次按ctrl+f即动态创建一个过程,然后将该PCB插入就绪队列中。
按ctrl+q 退出进程调度循环。
10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。
将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。
设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。
如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪对列中;否则该进程执行完成,撤销其PCB。
以上为一次进程调度循环。
四、程序主要流程图:进程调度流程图实验源程序:#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;}elsewhile(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);}}五、实验中遇到的问题和实验中的重点1.使用C++对于多级反馈模拟过程进行描述,需要对计数器KillTimer();ONTIMER();进行设计。