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

170 lines
3.5 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>
#include <queue>
#include <iomanip>
using namespace std;
typedef struct
{
char name;
int ArrivalTime;
int ServiceTime;
int FinishedTime;
int WholeTime;
double WeightWholeTime;
}RR;
static queue<RR>RRqueue; //声明一个队列
static double AverageWT =0,AverageWWT=0;
static int q; //时间片
static int n; //进程个数
static RR RRarray[100]; //进程结构
void Input()
{
//用户输入模式
cout<<"________________________________________________________"<<endl;
cout<<"请输入进程数:";
cin>>n;
cout<<"请输入时间片: ";
cin>>q;
cout<<"请输入进程名:"<<endl;
for (int i=0;i<n;i++)
{
cin>>RRarray[i].name;
}
cout<<"请输入各进程的到达时间:"<<endl;
for (int i=0;i<n;i++)
{
cin>>RRarray[i].ArrivalTime;
}
cout<<"请输入各进程的服务时间:"<<endl;
for (int i=0;i<n;i++)
{
cin>>RRarray[i].ServiceTime;
}
}
void RRAlgorithm()
{
char processMoment[100]; //存储每个时间片p对应的进程名称
RRqueue.push(RRarray[0]);
int processMomentPoint = 0;
int CurrentTime=0;
int tempTime;
int i=1; //指向还未处理的进程的下标
int finalProcessNumber = 0; //执行RR算法后进程的个数
int processTime[50];
//CurrentTime的初始化
if (RRarray[0].ServiceTime>=q)
{
CurrentTime = q;
}
else
{
CurrentTime = RRarray[0].ServiceTime;
}
while(!RRqueue.empty())
{
for (int j=i;j<n;j++) //使得满足进程的到达时间小于当前时间的进程都进入队列
{
if (RRarray[j].name!=NULL && CurrentTime >= RRarray[j].ArrivalTime)
{
RRqueue.push(RRarray[j]);
i++;
}
}
if (RRqueue.front().ServiceTime<q)
{
tempTime = RRqueue.front().ServiceTime;
}
else
{
tempTime = q;
}
RRqueue.front().ServiceTime -= q; //进程每执行一次,就将其服务时间 -q
//将队首进程的名称放入数组中
processMoment[processMomentPoint] = RRqueue.front().name;
processMomentPoint++;
processTime[finalProcessNumber] = tempTime;
finalProcessNumber++;
if (RRqueue.front().ServiceTime <= 0) //把执行完的进程退出队列
{
//RRqueue.front().FinishedTime = CurrentTime;
RRqueue.pop(); //如果进程的服务时间小于等于,即该进程已经服务完了,将其退栈
}
else
{
//将队首移到队尾
RRqueue.push(RRqueue.front());
RRqueue.pop();
}
CurrentTime += tempTime;
}
for (int i=0;i<n;i++)
{
RRarray[i].WholeTime = RRarray[i].FinishedTime - RRarray[i].ArrivalTime;
RRarray[i].WeightWholeTime = (double)RRarray[i].WholeTime/RRarray[i].ServiceTime;
}
double x=0,y=0;
for (int i=0;i<n;i++)
{
x += RRarray[i].WholeTime;
y += RRarray[i].WeightWholeTime;
}
AverageWT = x/n;
AverageWWT = y/n;
}
void display()
{
cout<<"________________________________________________________"<<endl;
cout<<"RR调度算法执行后进程相关信息如下"<<endl;
cout<<setw(10)<<"进程名ID"<<" ";
cout<<setw(10)<<"到达时间"<<" ";
cout<<setw(10)<<"服务时间"<<" ";
cout<<setw(10)<<"完成时间"<<" ";
cout<<setw(10)<<"周转时间"<<" ";
cout<<setw(10)<<"带权周转时间"<<endl;
for (int i = 0;i<n;i++)
{
cout<<setw(10)<<RRarray[i].name<<" ";
cout<<setw(10)<<RRarray[i].ArrivalTime<<" ";
cout<<setw(10)<<RRarray[i].ServiceTime<<" ";
cout<<setw(10)<<RRarray[i].FinishedTime<<" ";
cout<<setw(10)<<RRarray[i].WholeTime<<" ";
cout<<setw(10)<<RRarray[i].WeightWholeTime<<" "<<endl;;
}
cout<<"所有进程的平均周转时间 = "<<AverageWT<<endl;
cout<<"所有进程的平均带权周转时间 = "<<AverageWWT<<endl;
cout<<"________________________________________________________"<<endl;
}
int main()
{
Input();
RRAlgorithm();
display();
system("pause");
return 0;
}