#include<iostream>
using namespace std;
#include <string>
#include<queue>
static const int MaxNum=100;
deque<char>item;
int ArrivalTime[MaxNum];
int ServiceTime[MaxNum];
int PServiceTime[100];//还需要服务的时间
int FinishTime[MaxNum];
int WholeTime[MaxNum];//周转时间;
double WeightWholeTime[MaxNum];//带权周转时间
bool Finished[MaxNum];
int n,q,insert=0,pass_time=0;
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void get_run_time(){
//求周转时间;
for(int i=0;i<n;i++)
{
WholeTime[i]=FinishTime[i]- ArrivalTime[i];
//周转时间=完成时间-到达时间;
}
//求带权周转时间
for(i=0;i<n;i++)
{
WeightWholeTime[i]=WholeTime[i]/(ServiceTime[i]*1.0);
}
}
double AverageWT(){
//平均周转时间
double sum=0;
for(int i=0;i<n;i++)
{
sum+=WholeTime[i];
}
return sum/(n*1.0);
}
double AverageWWT(){
//FCFS平均带权周转时间
double sum=0;
for(int i=0;i<n;i++)
{
sum+=WeightWholeTime[i];
}
return sum/(n*1.0);
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@调度函数@@@@@@@@@@@@@@@@@@@@@@
int getitem()
{ //获取进程的下标
if(pass_time>=ArrivalTime[insert])
return insert++; //如果有就绪进程存在,返回下标
else return -1;//否则返回-1;
}
void additem()
{ //将就绪进程加进队列
char str='A'+insert-1;//通过下标取得元素
item.push_back(str);
}
void main(){
freopen("text.txt","rt",stdin);
int i=0;
//cout<<"请输入进程个数"<<endl;
cin>>n;
if(n==0)return;
// cout<<"进程到达系统时刻分别为"<<endl;
for(i=0;i<n;cin>>ArrivalTime[i++]);
// cout<<"进程需要服务时间分别为:"<<endl;
for(i=0;i<n;i++)
{
cin>>ServiceTime[i];
PServiceTime[i]=ServiceTime[i];
}
//输入时间片的大小
cin>>q;
if(q==0)return;//如果时间片等于0,就不必进行操作了。属于非法参数。
item.push_back('A');//先将第一个请求服务的进程入队。
insert++;//下次即将入队的下标
char temp='A';//中间变量,存放队列首元素。
int j=0;//队列首元素的下标
while(!item.empty())//求各个进程完成的系统时间
{
temp=item.front(); //得到队列首元素的值;
j=temp-'A'; //得到队列首元素的下标;
if(PServiceTime[j]>q)//如果队列首元素剩余服务时间>时间片轮转的时间,进行的操作
{
PServiceTime[j]-=q;//得到此次服务后还需要服务的时间
pass_time+=q;//得到系统时间=当前时间+时间片轮转的时间
//将首个就绪请求服务进程加进对尾,再将队列首元素移位到队尾;
item.pop_front();
if(insert!=n)
{
while(-1!=getitem() && insert<=n) additem();//将已申请的进程进入就绪队列。注意前面的insert参数在调用getitem()函数时,都会比原先的下标超1;
}
item.push_back(temp);
}
else//如果队列首元素的剩余服务时间<时间片的轮转时间,进行如下操作
{
item.pop_front();//对头直接出对列;
pass_time+=PServiceTime[j];//得到系统时间=当前时间+当前进程还需要服务的时间
PServiceTime[j]=0;//将当前进程还要服务的时间清零
FinishTime[j]=pass_time;//记录当前进程服务完成的系统时间
//将首个就绪请求服务进程加进对尾
if(insert!=n)
{
while(-1!=getitem() && insert<=n) additem();//将已申请的进程进入就绪队列。注意前面的insert参数在调用getitem()函数时,都会比原先的下标超1;
}
}
/*cout<<"@@@@@@@@@@@@@@@@@@@@@@@"<<endl;
int num=item.size();
while(num--){cout<<item.front()<<" ";item.push_back(item.front());item.pop_front();}
cout<<endl; */
}
cout<<"时间片轮转时间为:"<<q<<endl;
get_run_time(); //求周转时间;
cout<<"FCFS平均周转时间"<<AverageWT()<<endl;
cout<<"FCFS平均带权周转时间"<<AverageWWT()<<endl;
}
来源:https://www.cnblogs.com/hqu-ye/archive/2012/10/29/2745191.html