非抢占式多级反馈队列优先级调度算法 C++实现

article/2025/8/15 4:17:40

 

 

介绍

        前段时间比较忙,没有更新,这次的也是操作系统的一个实践作业 C++实现非抢占式多级反馈队列优先级调度算法,希望可以帮到你们。

问题介绍

这里我用课件里的内容

        1.应设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。

 

        2.新进程进入内存后,首先将其放在第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,…如此下去,最后一个队列中采取时间片轮转的方式运行。

       3.仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。

代码

        下面是我写的代码,由于时间仓促,如果在运行过程中有错误的地方,请在评论区私信我。

#include<iostream>
#include<string>
#include<queue>
#include<algorithm>
#include<iomanip>
using namespace std;
/* 分别定义三个队列时间片长度 */ 
#define firstCpu 1
#define secondCpu 2
#define thirdCpu 3class Process //定义进程类,包含进程名,到达时间,执行时间 
{public:Process();Process(string n, int time1, int time2,int time3); string name;int arrive_time;int Need_time;int need_time;int begin_time;int run_time;int end_time;bool first_run;
};Process::Process(string n, int time1, int time2,int time3)
{name = n;arrive_time = time1;need_time = time2;Need_time = time3;run_time =  -1;begin_time= -1;end_time = -1;first_run=0;
}Process::Process()
{name = "none";arrive_time= 200;need_time = -1; begin_time = 0;Need_time = 0;end_time = 0;run_time =0;first_run=0;
}Process process[100];
Process finish[100];
int c=0;
int num;
bool cmp(Process p1,Process p2)
{return p1.arrive_time<p2.arrive_time;
}void printP(Process &p)
{cout<<p.name<<"          "<<p.begin_time<<"          "<<p.end_time<<"          "<<p.run_time<<"          "<<setprecision(2)<<fixed<<double(p.end_time-p.arrive_time)/double(p.Need_time)<<endl;
}void Input() //输入函数 
{cout<<"请输入进程总数(小于100):";cin>>num;cout<<endl;string n;int time1;int time2;for(int i=0;i<num;i++){cout<<"请依次输入进程信息"<<endl;cout<<"请输入进程代号:";cin>>n;cout<<"请输入到达时间:";cin>>time1;cout<<"请输入服务时间:";cin>>time2;process[i]=Process(n,time1,time2,time2);	cout<<endl;} 
}void Running(queue<Process>line_1,queue<Process>line_2,queue<Process>line_3) //执行函数 
{int number = 0;int currentTime = 0; int firstTime = firstCpu;int secondTime = secondCpu;int thirdTime = thirdCpu;if(process[0].arrive_time>0){currentTime=process[0].arrive_time;}while(number<num||!line_1.empty()||!line_2.empty()||!line_3.empty()) //结束条件队列为空而且所有进程都加入队列 {while(number<num&&process[number].arrive_time==currentTime) //莫一时刻进程到来,加入第一队列 {line_1.push(process[number++]);
//			printP(line_1.back());}if(!line_1.empty())        //在第一个队列执行 {if(line_1.front().first_run==0){line_1.front().first_run=1;line_1.front().begin_time=currentTime;}line_1.front().need_time-=1;firstTime--;currentTime++;if(line_1.front().need_time>0){if(firstTime==0){   line_2.push(line_1.front());line_1.pop();firstTime = firstCpu;}}	else if(line_1.front().need_time==0){
//				cout<<"当前时刻:"<<currentTime<<"进程结束:"<<endl;line_1.front().run_time=currentTime - line_1.front().begin_time;line_1.front().end_time=currentTime;finish[c]=line_1.front();
//				printP(line_1.front());c++;line_1.pop();firstTime = firstCpu;}}else if(!line_2.empty())  //第一队列为空,第二队列不为空 {while(secondTime>0){line_2.front().need_time--;secondTime--;currentTime++;while(number<num&&process[number].arrive_time==currentTime){line_1.push(process[number++]);}if(line_2.front().need_time==0)break;}	if(line_2.front().need_time>0){line_3.push(line_2.front());line_2.pop();secondTime = secondCpu;}	else if(line_2.front().need_time==0){line_2.front().run_time=currentTime - line_2.front().begin_time;line_2.front().end_time=currentTime;finish[c]=line_2.front();
//				printP(line_2.front());c++;line_2.pop();secondTime = secondCpu;}}	else if(!line_3.empty()) //在第三个队列执行 {while(secondTime>0){line_3.front().need_time--;thirdTime--;currentTime++;while(number<num&&process[number].arrive_time==currentTime){line_1.push(process[number++]);}if(line_3.front().need_time==0)break;}	if(line_3.front().need_time>0){line_3.push(line_3.front());line_3.pop();thirdTime = thirdCpu;}else{firstTime = firstCpu;line_3.front().run_time=currentTime - line_3.front().begin_time;line_3.front().end_time=currentTime;finish[c]=line_3.front();c++;line_3.pop();}}cout<<line_1.empty()<<line_2.empty()<<line_3.empty()<<endl;if (line_1.empty()&&line_2.empty()&&line_3.empty()&&currentTime<process[number].arrive_time){currentTime = process[number].arrive_time;}				}	
}int main()
{queue<Process> line_1; //定义第一个优先级队列queue<Process> line_2; //定义第二个优先级队列queue<Process> line_3; //定义第三个优先级队列Input();sort(process,process+num,cmp);Running(line_1,line_2,line_3);double sum=0;double sum2=0;cout<<"进程名称"<<" 开始时间"<<" 结束时间"<<" 运行时间"<<" 带权周转时间"<<endl;for(int i=0;i<num;i++){sum+=double(finish[i].end_time-finish[i].arrive_time)/double(finish[i].Need_time);sum2+=double(finish[i].end_time-finish[i].arrive_time);printP(finish[i]);}cout<<"平均周转时间:"<<sum2/num;cout<<"平均带权周转时间:"<<sum/num<<endl;cout<<"written by zzdxls"<<endl;
}

运行结果


http://chatgpt.dhexx.cn/article/4DRT6bUZ.shtml

相关文章

多级反馈队列算法补充

http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-sched-mlfq.pdf 本文是多级反馈队列&#xff08;multi-level feedback queue&#xff0c;MLFQ&#xff09;算法的一些小补充&#xff08;两个缺陷与修改方法&#xff09;&#xff0c;参考了上面链接。因为自己用中文没有搜到想要的…

操作系统-多级反馈队列

概述 1962年&#xff0c;Corbato首次提出多级反馈队列&#xff0c;应用于兼容时分共享系统(CTSS)。Corbato因在CTSS中的贡献和后来在Multics中的贡献&#xff0c;获得了ACM颁发的图灵奖(Turing Award)。该调度程序经过多年的一系列优化&#xff0c;出现在许多现代操作系统中。 …

操作系统学习(二):浅析多级反馈队列MLFQ

目录 0、引言 1、多级反馈队列&#xff08;MLFQ&#xff09;的基本规则 2、MLFQ的规则具体说明 3、MLFQ调优及其他问题 4、总结 0、引言 在上篇文章操作系统学习&#xff08;一&#xff09;&#xff1a;浅析操作系统进程调度算法中讲到&#xff0c;在一个通用的操作系统中…

多级反馈队列调度算法(附Python3实现代码)

一、多级反馈队列调度算法 多级反馈队列调度算法是进程调度的一种算法&#xff0c;该调度算法可以不用事先知道各种进程所需的执行时间&#xff0c;还可以较好的满足各种类型进程的需要&#xff0c;是目前共认的一种较好的进程调度算法。 那你可能马上就要问了&#xff0c;多…

调度:多级反馈队列

多级反馈队列&#xff08;Multi-level Feedback Queue, MLFQ&#xff09;是有Corbato在1962年提出的&#xff0c;用于兼容时分共享系统。现在其经过多年的优化&#xff0c;已经被应用于很多现代操作系统中。多级反馈队列是为了解决两方面问题。一&#xff1a;优化周转时间。在之…

多级队列调度和多级反馈队列调度算法的实现

多级队列调度算法 操作系统实验导航 实验一&#xff1a;银行家算法 https://blog.csdn.net/weixin_46291251/article/details/115384510 实验二&#xff1a;多级队列调度和多级反馈队列调度算法 https://blog.csdn.net/weixin_46291251/article/details/115530582 实验三&…

多级反馈队列调度算法模拟实现

实验一 多级反馈队列调度算法 一. 主要实现方法和代码介绍 ​ 1.编写进程类,其只包含所需的运行时间和进程编号两个属性,还有一个运行方法,此方法就是将所需的运行时间属性减去.传入的运行时间. ​ 2.创建进程函数:创建maxp个进程,(应该不超过10,在此创建九个,即暂时不进行进…

计操实验 多级反馈队列C语言

计操实验 多级反馈队列C语言 需求&#xff1a; 1.队列4级&#xff0c;每一级的队列长度均为10&#xff1b;第一级的时间片为T&#xff0c;第二级的时间片为2T&#xff0c;第三级的时间片为4T&#xff0c;第四级的时间片为8T&#xff1b;&#xff08;T的大小自己定&#xff09; …

【操作系统】轮转和多级反馈队列

随着计算机的技术逐渐步入家用后&#xff0c;新的调度指标接踵而来&#xff0c;周转时间已经不能满足人们日常工作的需求&#xff0c;更多时候人们更希望计算机能有更好的交互性&#xff0c;使其能更快地去响应任务&#xff0c;由此针对优化响应时间的调度策略也遍地开花&#…

多级反馈队列调度算法(c++)

如果对你有帮助&#xff0c;可以给卑微的博主留个赞、关注、收藏 (不是) (骗一下数据&#xff0c;说不定以后面试就过了&#xff0c;拜谢) 操作系统基本调度算法&#xff0c;多级反馈队列调度算法。在划分时间片的调度算法中&#xff0c;多级反馈队列算法兼顾提高系统吞吐…

多级反馈队列调度算法

实验目的&#xff1a; 在Linux下编程实现多级反馈队列调度算法&#xff0c;采用三级调度策略&#xff0c;所有进程先按到达顺序进入一级队列&#xff0c;按照时间片为2轮转一次&#xff0c;一个时间片内未完成的进程被依次移入二队列尾部。当一级队列中没有进程时&#xff0c;开…

多级反馈队列调度

多级反馈队列 ​ 多级反馈队列&#xff08;Multi-level Feedback Queue&#xff0c; MLFQ&#xff09;&#xff0c;与上个世纪70年代提出&#xff0c;主要应用于时分共享系统。主要解决两方面问题&#xff1a;一个是优化周转时间&#xff0c;一个是要给用户很好的交互体验。ML…

多级反馈队列算法

步骤&#xff1a; 0时刻&#xff0c;P1到达就绪队列&#xff08;时间片为4的&#xff09;P1先执行2ms&#xff0c;P2到达还未到时间片&#xff0c;P1继续执行2ms后&#xff0c;时间片到达了&#xff0c;P1滑到下一个就绪队列&#xff08;时间片为6的&#xff09;此时&#xff…

linux多级反馈队列的实现,多级反馈队列调度算法详解

通常在使用多级队列调度算法时&#xff0c;进程进入系统时被永久地分配到某个队列。例如&#xff0c;如果前台和后台进程分别具有单独队列&#xff0c;那么进程并不从一个队列移到另一个队列&#xff0c;这是因为进程不会改变前台或后台的性质。这种设置的优点是调度开销低&…

对数线性模型

http://blog.csdn.net/pipisorry/article/details/52788947 特征和指示特征 对数线性模型log linear model 对数线性模型有&#xff1a;最大熵模型和逻辑斯谛回归。 [概率图模型原理与技术] [PGM&#xff1a;无向图模型&#xff1a;马尔可夫网 ] 皮皮blog 最大熵模型的一般形式…

广义线性模型(Generalized Linear Model)之三:Poisson回归

广义线性模型&#xff08;Generalized Linear Model&#xff09;之三&#xff1a;Poisson回归 一、泊松回归&#xff08;Poisson regression&#xff09;简介&#xff08;一&#xff09;泊松回归&#xff08;二&#xff09;计数数据&#xff08;三&#xff09;泊松分布1&#x…

MIT自然语言处理第五讲:最大熵和对数线性模型

MIT自然语言处理第五讲&#xff1a;最大熵和对数线性模型&#xff08;第一部分&#xff09; 自然语言处理&#xff1a;最大熵和对数线性模型 Natural Language Processing: Maximum Entropy and Log-linear Models 作者&#xff1a;Regina Barzilay&#xff08;MIT,EECS Depar…

机器学习教程 之 线性模型:线性回归、对数几率回归、线性判别分析

常用的三个线性模型的原理及python实现——线性回归&#xff08;Linear Regression&#xff09;、对数几率回归&#xff08;Logostic Regression&#xff09;、线性判别分析&#xff08;Linear Discriminant&#xff09;。 这可能会是对线性模型介绍最全面的博客 文章目录 一、…

机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析

一、线性回归 线性回归&#xff08;linear regression&#xff1a;试图学得一个线性模型以尽可能准确地预测实值输出标记。 1.最简单的形式&#xff1a;输入属性的数且只有一个&#xff0c; 最小二乘法&#xff1a;基于均方差误差最小化来进行模型的求解&#xff0c;在线性回…

对数线性模型:逻辑斯谛回归和最大熵模型

http://blog.csdn.net/pipisorry/article/details/52788947 对数线性模型log linear model 对数线性模型有&#xff1a;最大熵模型和逻辑斯谛回归。 特征和指示特征 对数线性模型的一般形式 [概率图模型原理与技术] 某小皮 对数线性模型的不同形式 因子图 将因子转换到对…