多级反馈队列_实验_操作系统
【操作系统】多级反馈队列算法
【操作系统】多级反馈队列算法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. 创建多级反馈队列在实验中,我们创建了多级反馈队列,用于处理不同优先级的作业。
队列的优先级由高到低依次为1、2、3,其中优先级1的队列时间片最短,而优先级3的队列时间片最长。
3. 调度作业在实验中,我们按照作业的优先级将作业放入相应的队列。
每个队列根据时间片长度进行轮转调度,即每个作业执行一段时间后会被暂停,并放入下一个优先级更低的队列继续执行。
如果作业的执行时间超过了当前队列的时间片长度,作业会被放入优先级更高的队列继续执行。
4. 结果分析通过观察每个作业的执行情况,我们可以比较多级反馈队列调度算法与其他调度算法的优劣。
如果某个作业的执行时间较长,但优先级较低,那么它会在多个队列中轮转执行,从而获得更多的CPU时间。
同时,优先级较高的作业能够更快地被处理,提高整个系统的响应速度。
实验结果经过多次实验,我们得出了以下实验结果:1. 多级反馈队列调度算法能够较好地处理不同类型的作业。
优先级较高的作业能够被更快地处理,而优先级较低的作业也能有机会获得更多的CPU时间。
2. 多级反馈队列调度算法对短作业具有较好的响应速度。
由于时间片较短,短作业能够迅速完成,不会被长作业长时间占用。
3. 多级反馈队列调度算法较其他简单的调度算法更加灵活。
相比于先来先服务调度算法或短作业优先调度算法,多级反馈队列调度算法能够更合理地分配CPU资源,提高整体性能。
多级队列调度算法和多级反馈队列调度算法
多级队列调度算法和多级反馈队列调度算法在计算机操作系统中,进程调度是指根据一定的策略从就绪队列中选择一个进程分配CPU时间片,使得多个进程能够合理高效地共享CPU资源。
多级队列调度算法和多级反馈队列调度算法是两种常见的进程调度算法。
本文将分别介绍这两种调度算法的原理和特点。
一、多级队列调度算法多级队列调度算法是一种基于优先级的调度算法,将就绪进程划分为多个队列,每个队列具有不同的优先级,其中优先级高的队列具有更高的调度优先级。
调度器按照优先级从高到低的顺序选择进程执行,同一优先级的进程按照先到先服务的原则进行调度。
多级队列调度算法的主要特点如下:1. 简单高效:多级队列调度算法简单直观,易于实现和理解。
由于进程被划分到不同的队列中,能够更好地满足不同进程的调度需求。
2. 公平性:多级队列调度算法可以根据进程的优先级来确定调度顺序,优先级高的进程能够更早地被执行,提高了进程的响应速度。
3. 适应性:多级队列调度算法可以根据不同进程的调度需求来设置不同的优先级,能够更好地满足不同进程的执行要求。
然而,多级队列调度算法也存在一些问题。
例如,如果某个队列中的进程过多,可能会导致低优先级队列的进程长时间得不到执行,影响系统的整体性能。
为了解决这个问题,引入了多级反馈队列调度算法。
二、多级反馈队列调度算法多级反馈队列调度算法是在多级队列调度算法的基础上进行改进的一种调度算法。
它引入了时间片的概念,并允许进程在不同的队列之间移动。
每个队列具有不同的时间片大小和优先级,当一个进程的时间片用完后,它会被移到下一个优先级更低的队列中。
多级反馈队列调度算法的主要特点如下:1. 公平性:多级反馈队列调度算法兼顾了优先级和时间片的概念,能够更加公平地分配CPU时间片,避免某个队列中的进程长时间得不到执行。
2. 弹性:多级反馈队列调度算法能够根据进程的执行情况灵活地调整进程的优先级和时间片大小,提高系统的响应速度和吞吐量。
操作系统各种调度算法
操作系统各种调度算法操作系统的调度算法是操作系统中的重要组成部分,它决定了进程在CPU上的执行顺序和调度策略。
不同的调度算法应用于不同的场景和需求,目的是提高CPU利用率、降低响应时间、提高吞吐量等。
本文将介绍几种常见的调度算法,包括先来先服务调度算法(FCFS)、最短作业优先调度算法(SJF)、时间片轮转调度算法(RR)和多级反馈队列调度算法(MFQ)。
先来先服务调度算法(FCFS)是最简单的调度算法之一,该算法按照进程到达的先后顺序分配CPU资源。
当一个进程在CPU上执行时,其他进程需要等待,直到该进程完成。
FCFS调度算法具有易于实现和公平性的优点,但是由于没有考虑进程的执行时间,可能导致长作业的久等和短作业的饥饿问题。
最短作业优先调度算法(SJF)根据进程的预计执行时间来调度。
该算法假设可以获得每个进程的执行时间,并选择执行时间最短的进程执行。
SJF调度算法可以最小化平均等待时间和响应时间,但是由于无法准确预测进程的执行时间,可能导致长作业的饥饿问题。
时间片轮转调度算法(RR)将CPU时间切分成固定长度的时间片,每个进程在一个时间片中执行。
当一个进程的时间片用完后,系统将该进程重新加入到就绪队列的末尾,让其他就绪进程获得CPU执行。
RR调度算法能够保证每个进程都能获得一定的CPU时间,但是当进程的执行时间过长时,可能需要频繁的上下文切换,导致系统开销增加。
多级反馈队列调度算法(MFQ)是一种结合了FCFS和RR的调度算法。
该算法将就绪队列划分成多个队列,每个队列有不同的优先级,并且每个队列采用RR调度算法。
进程首先进入高优先级队列,如果时间片用完仍未完成,则降低优先级进入下一级队列,直到最低优先级队列。
此时,进程将拥有更长的时间片并能够执行较长时间。
MFQ调度算法兼顾了短作业的优先执行和长作业的公平性,但是需要根据实际情况设置多个队列和时间片长度,较为复杂。
除了以上介绍的几种调度算法,还有其他一些调度算法可供选择,如最高响应比优先调度算法(HRRN)、最早截止时间优先调度算法(EDF)等。
非抢占式多级反馈队列调度算法
非抢占式多级反馈队列调度算法非抢占式多级反馈队列调度算法是一种常用的进程调度算法,也是操作系统领域中非常经典和重要的一个概念。
在操作系统中,进程调度是指操作系统对进程进行选择和分配处理器的过程,而多级反馈队列调度算法是其中一种常见的调度策略。
一、多级反馈队列调度算法的基本原理1.1 多级反馈队列的设置多级反馈队列调度算法通过设置多个队列,每个队列具有不同的优先级,来实现对进程的调度。
一般来说,优先级高的队列具有更高的调度优先级,而优先级低的队列具有较低的调度优先级。
当一个进程到达系统时,首先被放入最高优先级的队列中,如果在一个时间片内没有执行完毕,则将其移动到优先级稍低的队列中,以此类推,直到进程执行完毕或者被放入最低优先级的队列中。
1.2 时间片的设定在多级反馈队列调度算法中,不同队列具有不同的时间片大小,一般来说,优先级高的队列具有较短的时间片,而优先级低的队列具有较长的时间片。
这样设计的好处是,能够兼顾高优先级进程的及时响应和低优先级进程的长时间执行。
1.3 调度策略多级反馈队列调度算法的核心在于其调度策略。
一般来说,即使在同一优先级的队列中,也采用先来先服务的策略,即按照进程到达的顺序进行调度。
而在不同优先级的队列之间,则按照各自的调度策略来执行。
二、多级反馈队列调度算法的实现在实际的操作系统中,多级反馈队列调度算法的实现需要考虑诸多因素。
首先是如何设置各个队列的优先级和时间片大小,需要根据具体的系统特点和需求来进行调整。
其次是如何具体实现调度策略,包括进程的进入队列和离开队列的条件、时间片的划分和分配等细节问题。
针对不同的操作系统,可能会有不同的实现方式和优化方法。
三、对非抢占式多级反馈队列调度算法的个人理解和观点在我看来,非抢占式多级反馈队列调度算法是一种非常灵活和高效的调度策略。
它能够兼顾到各个进程的优先级和执行时间,既能够保证高优先级进程的及时响应,又能够充分利用处理器资源,提高系统的整体吞吐量。
操作系统实验报告-进程调度法的实现
操作系统实验报告进程调度算法的实现1.实验目的进程是操作系统最重要的概念之一,本实验通过对进程调度模拟程序的运行,学习运用时间片轮转法进行进程调度,加深对进程的基本调度状态以及进程调度算法的理解。
2.算法思想进程调度算法:采用多级反馈队列调度算法。
其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS原则排队等待高度。
当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。
4.算法。
5.程序代码程序的主要代码如下:#include<iostream.h>#include<stdlib.h>#include<time.h>#include<stdio.h>#include<string.h>const int MAXCOMMANDLEN =50;///////////////////////////////////////////////////////////////////////////////////////// PROCESS///////////////////////////////////////////////////////////////////////////////////////class Process{friend class CPU; //友元类protected:static int init_ID; //静态初始IDint ID; //进程IDchar runText[MAXCOMMANDLEN]; //进程指令数组int IP; //进程指令指针,保存进程指令执行到的具体位置bool ISuseSource; //进程是否使用资源(是或者否)bool ISblocked; //进程是否被阻塞(是或者否)int unitTime; //进程被cpu执行单位时间, 默认 1int blockTime; //进程被阻塞时间public:static void RandID(); //静态随机生成进程ID的函数Process(); //进程类的构造函数int getID(); //得到进程IDint getIP(); //获取进程指令指针IPvoid setIP(int); //设置IPvoid Runed(); //进程被执行int getUnittime(); //得到进程的单位执行时间2int getBlcoktime(); //得到进程被阻塞的时间void setBlocktime(int); //设置进程被阻塞的时间void setUnittime(int); //设置进程的单位执行时间char getResult(int); //得到进程被执行的结果char* getRuntext(); //得到进程执行的指令void setBlockstate(bool); //设置进程阻塞状态bool getBlockstate(); //得到进程阻塞状态bool getISusesource(); //得到资源的使用状态void setISusesource(bool); //设置资源的使用状态};int Process::init_ID; //初始化静态变量void Process::RandID() //随机产生一个进程ID{srand((unsigned)time(NULL)); //调用srand随机生成函数init_ID=rand();}Process::Process() //进程的构造函数{ID=init_ID++; //进程ID的初值为静态初始ID的值int commandLen; //命令行长度IP=0;cout<<"Please input the text which process runed by CPU [#command#] :>\\ ";cin>>runText; //输入命令if( (commandLen=strlen(runText) ) > MAXCOMMANDLEN )exit(0); //输入长度超出最大长度时退出,特殊情况处理3runText[commandLen]='#'; //初始指令结束标志 '#' runText[commandLen+1]='\0'; //字符串结束标志ISuseSource=false; //设置资源的使用状态为未使用ISblocked=false; //进程的初始状态-》未被阻塞unitTime=1; //进程被执行的单位时间为1 blockTime=0; //阻塞时间为0}void Process::Runed() //进程被CPU执行{cout<<getResult(IP++); //输出得到的进程执行结果}int Process::getID() //得到进程ID {return ID;}int Process::getIP() //得到进行IP {return IP;}void Process::setIP(int ip) //设置进程IP {IP=ip;}bool Process::getISusesource() //得到资源的使用状态{return ISuseSource;4}void Process::setISusesource(bool s) //设置资源的使用状态{ISuseSource=s;}char* Process::getRuntext() //得到进程执行的指令{return runText;}int Process::getUnittime() //得到进程的单位执行时间{return unitTime;}int Process::getBlcoktime() //得到进程阻塞状态{return blockTime;}void Process::setBlocktime(int BT) //设置进程阻塞时间{blockTime=BT;}void Process::setUnittime(int UT) //设置进程的单位执行时间{unitTime=UT;}5void Process::setBlockstate(bool state) //设置进程阻塞状态{ISblocked=state;}bool Process::getBlockstate() //得到进程阻塞状态{return ISblocked;}char Process::getResult(int k) //得到程序的运行结果{return runText[k];}///////////////////////////////////////////////////////////////////////////////////////// SOURCE///////////////////////////////////////////////////////////////////////////////////////class Source //资源类{protected:int ID; //资源 IDbool state; //资源是否被占用状态int pro_ID; //使用资源的进程id Process *pro; //使用资源的进程指针int time; //进程使用资源的时间6public:Source(int); //资源类构造函数bool getState(); //得到资源被使用状态void setState(bool); //设置资源被使用状态void setTime(int); //设置进程使用资源的时间void setPro(Process *); //设置使用该资源的进程int getID(); //得到资源idint getPorID(); //得到使用资源的进程id void setProID(int); //设置使用资源的进程id void runned(); //资源被cpu调用};Source::Source(int id) //资源类构造函数{ID=id; //资源ID初值为idpro=NULL; //指针赋为空值state=true; //状态为被使用状态}void Source::setProID(int id) //设置使用资源的进程id{pro_ID=id;}void Source::setTime(int t) //设置进程使用资源的时间{time=t;}void Source::setState(bool s) //设置资源使用状态{7state=s;}bool Source::getState() //得到资源使用状态{return state;}void Source::setPro(Process *p) //设置使用该资源的进程{pro=p;}void Source::runned() //资源被CPU调用{if(time>0) //时间充足继续运行输出资源信息并使时间减一{cout<<"( Source :"<<ID<<")";time--;}if(time<=0) //时间用完{pro->setISusesource(false); //资源的使用状态为未使用int ip=pro->getIP(); //得到进程的IPpro->setIP(++ip); //设置到下一个ipSource::setState(true); //设置资源的使用状态为正在使用cout<<endl<<"The process "<<pro->getID()<<" relase the source!"<<endl;pro=NULL; //输出资源被释放指针值赋值为空值}8}//////////////////////////////////////////////////////////// ///////////////////////////// CPU////////////////////////////////////////////////////////////// /////////////////////////typedef struct Block //阻塞队列结构{Process *p_BlockProcess; //被阻塞的进程队列int index; //被阻塞的进程在就绪队列中的位置}Block;class CPU{protected:Process *p_Process; //进程队列Process **pp_Process; //进程就绪队列Block *blockQueue ; //进程阻塞队列Source *p_Source; //资源指针int numOfprocess; //进程数量int numOfblock; //被阻塞的进程数int PC; //程序计数器int allTime; //cpu运行的总时间public :CPU(int); //cpu构造函数void Run(); //cpu运行进程bool _IC(Process&); //虚拟IC,进行进程指令翻译void useSource(Process&); //进程申请资源9void blockProcess(Process&); //阻塞进程void releaseBlockPro(); //释放阻塞进程int getAlltime(); //得到进程运行的总时间void displayPro(); //显示进程的基本信息,id,指令,运行时间等void blockTimeADD(); //阻塞时间加1 };CPU::CPU(int num){p_Source=new Source(379857);//创建一个id号为379857的资源numOfprocess=num; //进程数numOfblock=0; //阻塞数allTime=0; //cpu运行的总时间初始化为0p_Process=new Process[numOfprocess];//进程队列申请空间pp_Process=new Process*[numOfprocess];//进程就绪队列申请空间blockQueue=new Block[numOfprocess]; //阻塞队列申请空间for(int i=0;i<numOfprocess;i++){pp_Process[i]=&p_Process[i]; //用二维数组存放进程指针数组头指针blockQueue->p_BlockProcess=NULL; //阻塞队列的阻塞进程赋值为空blockQueue->index=-1; //阻塞队列的索引值置为1 }}int CPU::getAlltime() //得到进程运行的总时间{return allTime;}10void CPU::displayPro() //显示进程的基本信息{for(int i=0;i<numOfprocess;i++)//循环输出被执行的进程的信息{cout<<"\tProcess ID : "<<p_Process[i].getID()<<endl;cout<<" text of runned :"<<p_Process[i].getRuntext()<<endl;}}void CPU::Run() //cpu运行进程{int numPro=numOfprocess; //记录未被运行的进程个数do{for(int num=0;num < numOfprocess;num++){if(!pp_Process[num]) //就绪队列不空继续执行continue;for(int t=0;t<p_Process[num].getUnittime();t++){PC=p_Process[num].getIP();//得到进程Ipif(_IC(p_Process[num]))//判断进程的状态TURE进入{if(t==0) //时间为0运行完输出进程信息cout<<"the process ["<<p_Process[num].getID()<<"] runed : ";if(!p_Process[num].getISusesource())//如果该进程未被运行过,则调用run运行{p_Process[num].Runed();//}else{p_Source->runned(); //if( p_Source->getState() && numOfblock>0 ){releaseBlockPro();////如果进程运行过,现在但未运行,说明为阻塞。
c语言实现多级反馈队列调度的算法模拟进程的控制
c语言实现多级反馈队列调度的算法模拟进程的控制目录1. 引言1.1 背景和意义1.2 结构概述1.3 目的2. 多级反馈队列调度算法2.1 基本原理2.2 算法设计思路2.3 算法流程图3. C语言实现模拟进程控制3.1 数据结构定义3.2 进程创建与销毁3.3 进程调度与执行4. 实验结果与分析4.1 实验环境介绍4.2 实验结果展示4.3 结果分析与讨论5. 结论与展望5.1 结论总结5.2 存在问题与改进方向1. 引言1.1 背景和意义在计算机科学领域,进程调度是操作系统中非常重要的一个功能。
它负责决定哪个进程可以使用CPU并以何种顺序执行。
进程调度算法的优劣直接影响了系统的性能和效率。
多级反馈队列调度算法是一种常用的进程调度算法之一,它可以根据进程的类型和优先级将进程划分到不同的队列中,并根据优先级来决定进程的执行顺序。
该算法兼具公平性和高响应时间两个特点,适合应用于多任务环境下。
本文旨在使用C语言实现模拟多级反馈队列调度算法,并通过模拟进程控制过程,探讨其在实际应用中的表现。
通过实验结果与分析,我们将评估该算法在不同场景下的性能指标,并对其中存在问题提出改进方向。
1.2 结构概述本文共分为五个部分组成:•引言:介绍本文撰写目的、研究背景以及多级反馈队列调度算法在进程控制中的重要性。
•多级反馈队列调度算法:详细介绍多级反馈队列调度算法的基本原理、设计思路和算法流程图。
•C语言实现模拟进程控制:描述C语言中如何定义数据结构以及实现进程的创建、销毁以及调度和执行过程。
•实验结果与分析:介绍实验环境并展示实验结果,对结果进行分析和讨论。
•结论与展望:总结本文的研究成果,并提出该算法在应用过程中存在的问题以及改进方向。
通过以上结构安排,我们将全面深入地探讨多级反馈队列调度算法在模拟进程控制中的应用。
1.3 目的本文旨在通过使用C语言实现多级反馈队列调度算法,模拟进程控制过程。
通过对该算法进行分析和实验,目标如下:1.探讨多级反馈队列调度算法在不同场景下的优劣势,并对其性能指标进行评估。
进程调度实验报告源码
一、实验目的本次实验旨在通过模拟进程调度过程,加深对进程调度算法的理解,并掌握进程调度程序的设计与实现方法。
实验内容主要包括:创建进程、进程调度、进程执行、进程结束等。
二、实验环境操作系统:Linux编程语言:C/C++三、实验内容1. 进程调度算法本实验采用三种进程调度算法:FIFO(先进先出)、时间片轮转法、多级反馈队列调度算法。
2. 进程调度程序设计进程调度程序主要由以下部分组成:(1)进程控制块(PCB)PCB用于描述进程的基本信息,包括进程名、到达时间、需要运行时间、已运行时间、进程状态等。
(2)就绪队列就绪队列用于存储处于就绪状态的进程,按照进程的优先级或到达时间进行排序。
(3)进程调度函数进程调度函数负责从就绪队列中选择一个进程进行执行,并将CPU分配给该进程。
(4)进程执行函数进程执行函数负责模拟进程的执行过程,包括进程的创建、执行、结束等。
四、实验源码```c#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX_PROCESSES 10typedef struct PCB {int pid;int arrival_time;int need_time;int used_time;int priority;int state; // 0: 等待 1: 运行 2: 完成} PCB;PCB processes[MAX_PROCESSES];int process_count = 0;typedef struct Queue {PCB queue;int front;int rear;int size;} Queue;Queue ready_queue;void init_queue(Queue q) {q->queue = (PCB )malloc(sizeof(PCB) MAX_PROCESSES); q->front = q->rear = 0;q->size = 0;}void enqueue(Queue q, PCB p) {if (q->size == MAX_PROCESSES) {printf("Queue is full.\n");return;}q->queue[q->rear] = p;q->rear = (q->rear + 1) % MAX_PROCESSES; q->size++;}PCB dequeue(Queue q) {if (q->size == 0) {printf("Queue is empty.\n");return NULL;}PCB p = &q->queue[q->front];q->front = (q->front + 1) % MAX_PROCESSES; q->size--;return p;}int is_empty(Queue q) {return q->size == 0;}void print_queue(Queue q) {printf("Queue: ");for (int i = 0; i < q->size; i++) {PCB p = &q->queue[(q->front + i) % MAX_PROCESSES];printf("PID: %d, Arrival Time: %d, Need Time: %d, Used Time: %d, Priority: %d, State: %d\n",p->pid, p->arrival_time, p->need_time, p->used_time, p->priority, p->state);}}void init_processes() {for (int i = 0; i < MAX_PROCESSES; i++) {processes[i].pid = i;processes[i].arrival_time = rand() % 10;processes[i].need_time = rand() % 10 + 1;processes[i].used_time = 0;processes[i].priority = rand() % 3;processes[i].state = 0;}}void schedule() {int time = 0;while (process_count > 0) {for (int i = 0; i < process_count; i++) {PCB p = &processes[i];if (p->arrival_time == time) {enqueue(&ready_queue, p);p->state = 1;}}if (!is_empty(&ready_queue)) {PCB p = dequeue(&ready_queue);p->used_time++;printf("Process %d is running.\n", p->pid);if (p->used_time == p->need_time) {p->state = 2;printf("Process %d is finished.\n", p->pid); }}time++;}}int main() {srand(time(NULL));init_queue(&ready_queue);init_processes();process_count = rand() % MAX_PROCESSES + 1;schedule();print_queue(&ready_queue);return 0;}```五、实验结果与分析1. FIFO调度算法实验结果表明,FIFO调度算法按照进程的到达时间进行调度,可能导致短作业等待时间长,效率较低。
多级反馈队列调度算法
如果一个队列中的所有进程都已 完成,则该队列将被移至最低优 先级的队列。
多级反馈队列调度算法是一种先 进的调度算法,它结合了优先级 调度和轮转调度的优点。
在每个时间片内,调度算法会根 据队列的优先级选择一个队列进 行服务。
这种算法能够有效地处理短进程 和长进程,并确保公平性和优先 级。
多级反馈队列调度算法的优缺点
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调度会发⽣什么。
多级反馈队列课程设计
多级反馈队列课程设计一、教学目标本课程的教学目标是让学生掌握多级反馈队列的基本原理和应用,提高他们的问题解决能力和编程技能。
具体来说,知识目标包括了解多级反馈队列的定义、特点和适用场景;技能目标包括能够使用编程语言实现多级反馈队列算法,并分析其性能;情感态度价值观目标包括培养学生的团队合作意识、创新精神和对计算机科学的兴趣。
二、教学内容根据课程目标,本课程的教学内容主要包括多级反馈队列的原理和应用。
具体来说,教学大纲如下:1.引言:介绍多级反馈队列的概念和背景,引导学生了解课程的重要性和实际应用。
2.多级反馈队列的基本原理:讲解多级反馈队列的定义、特点和适用场景,帮助学生掌握基本概念。
3.多级反馈队列的实现:介绍多级反馈队列的算法实现,引导学生掌握编程技巧和性能分析方法。
4.多级反馈队列的应用:讲解多级反馈队列在操作系统和网络协议中的应用,帮助学生了解其在实际场景中的应用价值。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
具体来说:1.讲授法:通过讲解多级反馈队列的基本原理和应用,帮助学生掌握基本概念和知识点。
2.讨论法:学生进行小组讨论,引导学生主动思考和探索多级反馈队列的问题解决方法。
3.案例分析法:分析实际案例,让学生了解多级反馈队列在操作系统和网络协议中的应用。
4.实验法:安排实验课程,让学生动手实现多级反馈队列算法,培养其编程能力和问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选用权威、实用的教材,如《操作系统原理与应用》、《计算机网络》等。
2.参考书:提供相关的参考书籍,如《多级反馈队列算法研究》、《计算机网络技术与应用》等。
3.多媒体资料:制作PPT、教学视频等多媒体资料,帮助学生更直观地理解多级反馈队列的原理和应用。
4.实验设备:准备计算机、网络设备等实验器材,为学生提供实践操作的机会。
- 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();进行设计。