170 lines
3.5 KiB
C++
170 lines
3.5 KiB
C++
#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;
|
||
}
|