98 lines
2.9 KiB
C++
98 lines
2.9 KiB
C++
#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;
|
||
}
|