- 1.算法简介
先来先服务(first-come first-served,FCFS)调度算法,FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
算法思想:当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。
- 2.代码模拟实现
#include<bits/stdc++.h>
using namespace std;
struct job
{
char name[10];//作业的名字
int starttime;//作业到达时间
int needtime;//作业服务时间
int runtime;//作业周转时间
int endtime;//作业结束时间
int flag=0;//作业完成标志
char state='w';//作业状态,一开始都默认为就绪
double dqzz_time;//带权周转时间
};
bool campare_start(struct job job1,struct job job2)//自定义排序方式
{
return job1.starttime<job2.starttime;
}
void FCFS(struct job jobs[50],int n)
{
sort(jobs,jobs+n,campare_start);//按作业到达时间从小到大排序
int nowtime=0;//系统时间
for(int i=0;i<n;i++)
{
if(nowtime<jobs[i].starttime)
{
nowtime=jobs[i].starttime;
}
jobs[i].state='R';//运行
jobs[i].endtime=nowtime+jobs[i].needtime;//作业结束时间
jobs[i].runtime=jobs[i].endtime-jobs[i].starttime;//作业周转时间
jobs[i].dqzz_time=double(jobs[i].runtime)/jobs[i].needtime;//带权周转时间
nowtime=jobs[i].endtime;
jobs[i].state='F';//作业完成
}
}
void print_FCFS(struct job jobs[50],int n)
{
double a_runtime=0;//平均周转时间
double a_dqzz_time=0;//平均带权周转时间
double sum_time1=0;//总周转时间
double sum_time2=0; //总带权周转时间
cout<<"作业名 到达时间 运行时间 完成时间 周转时间 带权周转时间:"<<endl;
for(int i=0;i<n;i++)
{
cout<<"作业名:"<<jobs[i].name<<"到达时间:"<<jobs[i].starttime<<"运行时间:"<<jobs[i].needtime<<"完成时间:"<<jobs[i].endtime<<"周转时间"<<jobs[i].runtime<<"带权周转时间:"<<jobs[i].dqzz_time<<endl;
sum_time1+=jobs[i].runtime;
sum_time2+=jobs[i].dqzz_time;
}
a_runtime=sum_time1/n;
a_dqzz_time=sum_time2/n;
cout<<"平均周转时间"<<a_runtime<<endl;
cout<<"平均带权周转时间"<<a_dqzz_time<<endl;
}
int main()
{
struct job jobs[50];
int n;//n个作业
cout<<"请输入作业个数"<<endl;
cin>>n;
cout<<"请输入各作业的信息(作业名 到达时间 服务时间):"<<endl;
for(int i=0;i<n;i++)
{ cin>>jobs[i].name;
cin>>jobs[i].starttime;
cin>>jobs[i].needtime;
}
FCFS(jobs,n);//调用FCFS算法
cout<<"FCFS调度算法运行结果:"<<endl;
print_FCFS(jobs,n); //打印FCFS运行结果
return 0;
}
- 3.运行结果
-