#include<iostream>
#include<iomanip>
using namespace std;
static const int MaxNum=100;
int ArrivalTime[MaxNum];//到达时间
int ServiceTime[MaxNum];//服务时间
int FinishTime[MaxNum];//完成时间
int WholeTime[MaxNum];//周转时间
double WeightWholeTime[MaxNum];//帯权周转时间
double AverageWT_FCFS,AverageWT_SJF; //平均周转时间
double AverageWWT_FCFS,AverageWWT_SJF;//平均帯权周转时间
int ServiceTime_SJF[MaxNum];//SJF算法需要
int Num=0;
int NowTime=0;//记录当前时间
double SumWT=0,SumWWT=0;//SumWT用来计算总的周转时间,SumWWT用来计算总的帯权周转时间
int i;
int a;//记录选择
int b[MaxNum];//记录进程的编号
void paixu();//根据进程的到达时间排序
void FCFS();
void SJF();
void run();
void output(double x,double y);//定义输出函数
//主函数
void main()
{
run();//开始运行
}
// 运行函数
void run()
{
cout<<"请输入进程个数:(进程个数必须大于0且小于等于100!)\n";
cin>>Num;
while(Num>100||Num<=0)
{
cout<<"输入有误!请重新输入\n";
cin>>Num;
}
cout<<"请依次输入每个进程的到达时间\n";
for(i=0;i<Num;i++)
{
b[i]=i;//给数组b赋值
cin>>ArrivalTime[i];
}
cout<<"请依次输入每个进程的服务时间\n";
for(i=0;i<Num;i++)
{
int data=0;
cin>>data;
ServiceTime[i]=data;
ServiceTime_SJF[i]=data;
}
paixu();
cout<<"\n";
cout<<"请选择要使用的算法(1-FCFS,2-SJF,3-FCFS&SJF): \n";
cin>>a;
while(a<1||a>3)
{
cout<<"输入有误,请重新输入,1或2或3!\n";
cin>>a;
}
if(a==1)
FCFS();
else if(a==2)
SJF();
else
{
FCFS();
SJF();
}
}
//排序函数,将进程按到达先后进行排序
void paixu()
{
for(i=0;i<Num-1;i++)
for(int j=i;j<Num;j++)
if(ArrivalTime[i]>ArrivalTime[j])
{
swap(ArrivalTime[i],ArrivalTime[j]);
swap(ServiceTime[i],ServiceTime[j]);
swap(ServiceTime_SJF[i],ServiceTime_SJF[j]);
swap(b[i],b[j]);
}
}
//先到先服务算法
void FCFS()
{
cout<<" "<<endl;
cout<<" FCFS "<<endl;
cout<<" "<<endl;
NowTime=ArrivalTime[0];
for(i=0;i<Num;i++)
{
NowTime+=ServiceTime[i];//把进程的服务时间加到NowTime上
FinishTime[i]=NowTime;
WholeTime[i]=FinishTime[i]-ArrivalTime[i];//计算周转时间=完成时间-到达时间
WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i];//计算带权周转时间=周转时间/服务时间
SumWT+=WholeTime[i];
SumWWT+=WeightWholeTime[i];
}
AverageWT_FCFS=SumWT/Num;
AverageWWT_FCFS=SumWWT/Num;
output(AverageWT_FCFS,AverageWWT_FCFS);//调用输出函数,输出结果
}
//短进程优先算法
void SJF()
{
cout<<" "<<endl;
cout<<" SJF "<<endl;
cout<<" "<<endl;
int min=0;
NowTime=ArrivalTime[0]+ServiceTime[0];//计算第一次的NowTIme
FinishTime[0]=NowTime;//计算第一个进程的完成时间
ServiceTime_SJF[0]=1000;//赋初值。
int allin=0,j,k;
for(i=1;i<Num;i++)//进入循环,从第二个到达的进程开始
{
k=1;min=1;
if(allin==0)//找到已经到达的进程个数
{
j=0;
while(ArrivalTime[j]<=NowTime && j<Num)//已经到达的进程
{
j++;
if(j>=Num)
{
allin=1;
}
}
}
else
{
j=Num;
}
//j是已经到达的进程数
while(k<j)//从已经到达的进程里找到服务时间最短的进程
{
if(ServiceTime_SJF[k]==0)//进程的服务时间如果等于0,则跳过该进程
k++;
else
{
if(ServiceTime_SJF[min]>ServiceTime_SJF[k])//比较,找到服务时间最短的进程
min=k;
k++;
}
}
ServiceTime_SJF[min]=0;//找完后置零,便于下一次循环时使用
NowTime+=ServiceTime[min];//累加当前时间
FinishTime[min]=NowTime;//完成时间
}
for(i=0;i<Num;i++)//计算周转时间,带权周转时间,总的周转时间和总的带权周转时间
{
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i];
SumWT+=WholeTime[i];
SumWWT+=WeightWholeTime[i];
}
AverageWT_SJF=SumWT/Num;
AverageWWT_SJF=SumWWT/Num;
output(AverageWT_SJF,AverageWWT_SJF);//调用输出函数,输出结果
}
//输出函数
void output(double x,double y)
{
for(i=0;i<Num;i++)//输出结果
{
cout<<"时刻"<<FinishTime[i]-ServiceTime[i]<<": 进程"<<b[i]+1<<"开始运行。"<<endl;
}
cout<<setw(10)<<"进程号"<<" "<<setw(10)<<"完成时间"<<" "<<setw(10)<<"周转时间"<<" "<<setw(10)<<"带权周转时间"<<endl;
for(i=0;i<Num;i++)//输出结果
{
cout<<setw(10)<<b[i]+1<<" "<<setw(10)<<FinishTime[i]<<" "<<setw(10)<<WholeTime[i]<<setprecision(3)<<" "<<setw(10)<<WeightWholeTime[i]<<setprecision(3)<<endl;
}
cout<<"平均周转时间:"<<x<<endl;
cout<<"平均帯权周转时间:"<<y<<endl;
}
FCFS和SJF进程调度算法
需积分: 9 116 浏览量
2013-05-29
11:20:33
上传
评论 1
收藏 1.07MB ZIP 举报
yillp
- 粉丝: 0
- 资源: 1
最新资源
- delphi实现DBGrid全选和反选功能
- 25C11F41-2B2A-4D1A-AAA8-7C654526B129.pdf
- Android Studio Jellyfish(android-studio-2023.3.1.18-cros.deb)
- MVC+EF框架+EasyUI实现权限管理源码程序
- python第66-75天,Day66-75.rar
- python后端服务project-of-tornado.rar
- python测验,hello-tornado.rar
- 基于SpringBoot+Vue3快速开发平台、自研工作流引擎源码设计.zip
- docker安装部署全流程
- 基于树莓派的人脸识别系统python源码+项目部署说明+超详细代码注释.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈