时间片q
依次输入(进程名
进程到达时间
进程服务时间)
(2)输出的形式
进程名
到达时间
服务时间
完成时间
周转时间
带权周转时间
所有进程平均周转时间:
所有进程平均带权周转时间:
(3)程序所能达到的功能
1)进程个数n,输入时间片大小q,每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn。
2)要求时间片轮转法RR调度进程运行,计算每个进程的周转时间和带权周转时间,并且计算所有进程的平均周转时间和带权平均周转时间;
3)输出:
模拟整个调度过程,输出每个时刻的进程运行状态;
4)输出:
输出计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
正确输入:
错误输入:
2、概要设计
所有抽象数据类型的定义:
staticintMaxNum=100
intArrivalTime//到达时间
intServiceTime//服务时间
intFinishedTime//结束时间
intWholeTime//周转时间
doubleWeightWholeTime//带权周转时间
doubleAverageWT//平均周转时间
doubleAverageWWT//平均带权周转时间
主程序的流程:
●变量初始化
●接受用户输入的n,q,T1…..Tn,S1….Sn;
●进行进程调度,计算进程的开始运行时间、结束时间、执行顺序、周转时间、带权周转时间;
●计算所有进程的平均周转时间、平均带权周转时间;
●按照格式输出调度结果。
各程序模块之间的层次(调用)关系
Main函数通过对Input函数进行调用,对函数的成员变量进行赋值,再通过RRAlgorithm函数求出题目要求的各个数据结果,最后通过display函数对结果进行格式输出。
3、详细设计
实现程序模块的具体算法。
voidRRAlgorithm()
{
charprocessMoment[100];//存储每个时间片p对应的进程名称
RRqueue.push(RRarray[0]);
intprocessMomentPoint=0;
intCurrentTime=0;
inttempTime;//声明此变量控制CurrentTime的累加时间,当前进程的服务时间小于时间片q的时候,起到重要作用
inti=1;//指向还未处理的进程的下标
intfinalProcessNumber=0;//执行RR算法后,进程的个数
intprocessTime[50];
//CurrentTime的初始化
if(RRarray[0].ServiceTime>=q)
{
CurrentTime=q;
}
else
{
CurrentTime=RRarray[0].ServiceTime;
}
while(!
RRqueue.empty())
{
for(intj=i;j{
if(RRarray[j].name!
=NULL&&CurrentTime>=RRarray[j].ArrivalTime)
{
RRqueue.push(RRarray[j]);
i++;
}
}
if(RRqueue.front().ServiceTime{
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;
}
//进程输出处理每个时间段对应的执行的进程
cout<<"各进程的执行时刻信息:
"<cout<<""<<"0时刻-->"<(2)<processTime[finalProcessNumber]=0;
inttime=processTime[0];
intcount=0;
for(i=0;i{
count=0;
cout<while(RRarray[count].name!
=processMoment[i]&&count{
count++;
}
RRarray[count].FinishedTime=time;
if(i{
cout<"<(2)<