CPP/计算机组成原理实验代码/RR_V2.0.cpp
2023-05-12 00:34:15 +08:00

98 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<iostream>
using namespace std;
const int N=10;
double daoda[N];//存储到达时间的数组
double fuwu[N]; //存储服务时间的数组
double fuwu_[N];//服务时间的副本
double wancheng[N]={0};//存储完成时间的数组 ,完成时间先都赋值为0
double zhouzhuan[N];//存储周转时间的数组
double daiquanz[N];//存储带权周转时间的数组
string name[N];//每个进程的名字
int main()
{
//RR 时间片轮转算法
cout<<"请输入进程数:"<<endl;
int n;//作业数
cin>>n;
cout<<"请输入"<<n<<"个进程的名字、到达时间和运行时间:"<<endl;
for(int i=0;i<n;i++)
{
cin>>name[i];//进程的名字 比如A B C 之类的
cin>>daoda[i]>>fuwu[i];//初始条件 存入到达时间和运行时间
fuwu_[i]=fuwu[i];//备份
}
double q;
cout<<"请输入时间片q:"<<endl;
cin>>q;
for(int i=0;i<n;i++)//选择排序法 根据到达时间从小到大进行排序
{
for(int j=0;j<n;j++)
{
if(daoda[i]<daoda[j])
{
swap(daoda[i],daoda[j]);//这下面这几步是为了同一个进程的这些时间对应的保持一致
swap(fuwu[i],fuwu[j]);//当到达时间交换了,对应的其他时间也应该交换
swap(fuwu_[i],fuwu_[j]);
swap(zhouzhuan[i],zhouzhuan[j]);
swap(daiquanz[i],daiquanz[i]);
swap(name[i],name[j]);//进程的名字也要跟着作业排序的变化而变化
}
}
}
//成时间
double addfuwu=0;//累计服务时间初始值设为0
int count=n;//为了不改变进程总数n的值令count=n
int count1=0;//在某一轮轮转中完成的进程
while(count!=0)//当进程数不为0的时候
{
count=count-count1;//还剩下没有完成的进程数目
for(int i=0;i<n;i++)
{
if(fuwu[i]<=q)//如果还剩下的服务时间小于时间片
{
if(wancheng[i]!=0)//这里是防止在进行新一轮的轮转时,会重复把已经完成的进程算进去
{
addfuwu=addfuwu+0;//算进去累计时间加0
}
else
{
addfuwu=addfuwu+fuwu[i];//累计时间就等于之前的累计时间+最后这一轮的真正服务服务时间反正小于q
wancheng[i]=addfuwu;//则完成时间=目前累计服务时间
count1++;//计算这一次轮转结束的进程数目
}
}
else
{
fuwu[i]=fuwu[i]-q;//剩余的服务时间就是服务时间-时间片q
addfuwu=addfuwu+q;//累计服务时间=之前服务时间+时间片q(这一轮这个进程的服务时间)
}
}
}
// ----------------------
//计算周转时间和带权周转时间
for(int i=0;i<n;i++)
{
zhouzhuan[i]=wancheng[i]-daoda[i];//周转时间=完成时间-到达时间
daiquanz[i]=zhouzhuan[i]/fuwu_[i];//带权周转时间=周转时间/服务时间
}
cout<<"RR调度算法执行后,进程相关信息如下:"<<endl;
cout<<"进程"<<" "<<"到达时间"<<" "<<"服务时间"<<" "<<"完成时间"<<" "<<"周转时间"<<" "<<"带权周转时间"<<endl;
for(int i=0;i<n;i++)
{
cout<<name[i]<<" \t";
cout<<daoda[i]<<" \t"<<fuwu_[i]<<" \t";
cout<<wancheng[i]<<" \t";
cout<<zhouzhuan[i]<<"\t"<<daiquanz[i]<<"\t"<<endl;
}
double sum1=0;
double sum2=0;
for(int i=0;i<n;i++)
{
sum1+=zhouzhuan[i];//计算周转时间的和
sum2+=daiquanz[i]; //计算带权周转时间的和
}
cout<<"平均周转时间:"<<sum1/n<<endl;//平均周转时间=周转时间/进程数量
cout<<"平均带权周转时间:"<<sum2/n<<endl;//平均带权周转时间=带权周转时间/进程数量
return 0;
}