/**进程调度算法
1、先来先服务算法
2、短进程优先算法
**/
#include<cstdlib>
#include<iostream>
#include<iomanip>
using namespacestd;
//定义结构体,里面包含的有一个进程相关的信息
struct PCB{
char name[10];
float arrivetime;
float servicetime;
float starttime;
float finishtime;
float zztime;
float dqzztime;
};
PCB a[100];
/********************输入进程函数********************/
void input(PCB*p,int N)
{
int i;
cout<<endl;
cout<<"请输入进程的 名字 到达时间 服务时间: (例如: a 0 100)"<<endl;
for(i=0;i<=N-1;i++)
{
cout<<"请输入进程"<<i+1<<"的信息";
cin>>p[i].name;
cin>>p[i].arrivetime;
cin>>p[i].servicetime;
}
}
/********************先来先服务算法********************/
//排序
void sort_FCFS(PCB*p,int N)
{
for(int i=0;i<=N-1;i++)
for(int j=0;j<=i;j++)
if(p[i].arrivetime<p[j].arrivetime)
{
PCB temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
//运行
void run_FCFS(PCB*p,int N)
{
int k;
for(k=0;k<=N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}
}
for(k=0;k<=N-1;k++)
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].dqzztime=p[k].zztime/p[k].servicetime;
}
}
voidPrint_FCFS(PCB *p,int N)
{
int k;
cout<<"调用先来先服务算法以后进程运行的顺序是: ";
cout<<p[0].name;
for(k=1;k<N;k++)
{
cout<<"-->";
cout<<p[k].name;
}
cout<<endl;
cout<<"具体进程调度信息:"<<endl;
cout<<"进程名 到达时间 服务时间 开始时间 结束时间 周转时间 带权周转时间"<<endl;
for(k=0;k<=N-1;k++)
{
cout<<setw(4)<< p[k].name
<<setw(8)<< p[k].arrivetime
<<setw(10)<< p[k].servicetime
<<setw(10)<< p[k].starttime
<<setw(10)<< p[k].finishtime
<<setw(10)<< p[k].zztime
<<setw(10)<<p[k].dqzztime<<endl;
}
}
//先来先服务算法
void FCFS(PCB*p,int N)
{
sort_FCFS(p,N);
run_FCFS(p,N);
Print_FCFS(p,N);
int k;
float Attime=0;
float AQttime=0;
for(k=0;k<=N-1;k++)
{
Attime+=p[k].zztime;
AQttime+=p[k].dqzztime;
}
Attime=Attime/N;
AQttime=AQttime/N;
cout<<"调用先来先服务算法的平均周转时间为: ";
cout<<Attime<<endl;
cout<<"调用先来先服务算法的平均带权周转时间为: ";
cout<<AQttime<<endl;
}
/********************短进程优先算法********************/
//排序
void sort_SPF(PCB*p,int N)
{
/****按照到达时间排序****/
for(int i=0;i<N-1;i++)
for(intj=i+1;j<=N-1;j++)
if(p[i].arrivetime>p[j].arrivetime)
{
PCB temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
for(int m=0;m<N-1;m++)
{
if(m==0)
p[m].finishtime=p[m].arrivetime+p[m].servicetime;
else
p[m].finishtime=p[m-1].finishtime+p[m].servicetime;
/****查找当前进程执行过程中进入系统的进程****/
int i=0;
for(int n=m+1;n<=N-1;n++)
{
if(p[n].arrivetime<=p[m].finishtime)
i++;
}
/****选择最短的为接下来执行的****/
float min=p[m+1].servicetime;
int next=m+1;//m+1=n
for(int k=m+2;k<=m+i;k++)
{
if(p[k].servicetime<min)
{
min=p[k].servicetime;
next=k;}
}
PCB temp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
}
//运行
void run_SPF(PCB*p,int N)
{
int k;
for(k=0;k<=N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;
p[k].finishtime=p[k].arrivetime+p[k].servicetime;
}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].servicetime;
}
}
for(k=0;k<=N-1;k++)
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].dqzztime=p[k].zztime/p[k].servicetime;
}
}
//显示结果
void Print_SPF(PCB*p,int N)
{
int k;
cout<<"调用最短进程优先调度算法以后进程的调度顺序为: ";
cout<<p[0].name;
for(k=1;k<N;k++)
{
cout<<"-->";
cout<<p[k].name;
}
cout<<endl;
cout<<"具体进程调度信息:"<<endl;
cout<<"进程名 到达时间 运行时间 开始时间 完成时间"<<endl;
for(k=0;k<=N-1;k++)
{
cout<<setw(4)<< p[k].name
<<setw(8)<< p[k].arrivetime
<<setw(10)<< p[k].servicetime
<<setw(10)<< p[k].starttime
<<setw(10)<< p[k].finishtime
<<endl;
}
}
//最短进程优先算法
void SPF(PCB*p,int N)
{
sort_SPF(p,N);
run_SPF(p,N);
Print_SPF(p,N);
int k;
float Attime=0;
float AQttime=0;
for(k=0;k<=N-1;k++)
{
Attime+=p[k].zztime;
AQttime+=p[k].dqzztime;
}
Attime=Attime/N;
AQttime=AQttime/N;
cout<<"调用最短进程优先算法的平均周转时间为: ";
cout<<Attime<<endl;
cout<<"调用最短进程优先算法的平均带权周转时间为: ";
cout<<AQttime<<endl;
}
/********************主函数选择算法********************/
int main(void)
{
for(;;)
{
int N;
cout<<endl;
cout<<"输入进程数目:"<<endl;
cin>>N;
input(a,N);
char chose;
cout<<"请选择进程调度方法"<<endl;
cout<<"输入 f 或者 F 执行先来先服务算法:"<<endl;
cout<<"输入 s 或者 S 执行先来先服务算法:"<<endl;
cin>>chose;
switch(chose)
{
case 'f':
case 'F':
cout<<endl;
cout<<"<<----------!!!@@@先来先服务调度算法@@@!!!---------->>"<<endl;
cout<<endl;
FCFS(a,N);
break;
case 's':
case 'S':
cout<<endl;
cout<<"<<----------!!!@@@最短进程优先调度算法@@@!!!---------->>"<<endl;
cout<<endl;
SPF(a,N);
break;
}
}
}