先来先服务算法(FCFS)
FCFS是最简单的调度算法,既可以用作作业调度,也可以用作进程调度
这种算法优先考虑系统中等待时间最长的作业(进程),而不管作业所需执行时间长短,
做法是从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后放入就绪队列
进程调度中使用此算法时,每次都从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程会一直运行到完成或者因发生某事件而阻塞后,进程调度程序才会把处理机分配给其他进程
短作业优先算法(SJF)
由于在实际情况中短作业(进程)所占比例很大,为了让它们比长作业优先执行,就有了此算法
SJF顾名思义以作业长短来确定优先级,作业越短优先级越高,作业的长短用作业所需的运行时间来衡量,此算法一样也可以用做进程调度,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行
#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,AverageWWT;
double WT , WWT;
//-------------------------------------------------------------------
//先来先服务调度算法
//------------------------------------------------------------------
void FCFS(int n)
{
cout<<endl;
cout<<"FCFS:"<<endl;
cout<<" 进程ID"<<" 完成时间"<<" 周转时间"<<" 带权周转时间"<<endl;
//完成时间计算
for(int i = 0 ; i < n ; i++)
{
if(i==0){
FinishTime[0] = ArrivalTime[0] + ServiceTime[0];
}else{
FinishTime[i] = FinishTime[i-1] + ServiceTime[i];
}
WholeTime[i] = FinishTime[i] - ArrivalTime[i];
WeightWholeTime[i] = (float)WholeTime[i] / (float)ServiceTime[i];
WT = WT + WholeTime[i];
WWT = WWT + WeightWholeTime[i];
cout<<"\t"<<setprecision(3)<<i+1<<"\t\t"<<setprecision(3)<<FinishTime[i]<<"\t\t"<<setprecision(3)<<WholeTime[i]<<"\t\t"<<setprecision(3)<<WeightWholeTime[i];
cout<<endl;
}
AverageWWT = WWT / n;
AverageWT = WT / n;
cout<<"平均周转时间为: "<<setprecision(3)<<AverageWT<<endl; //保留三位有效数字
cout<<"平均带权周转时间为: "<<setprecision(3)<<AverageWWT;
WT = 0; //WT和WWT最后要置零,因为我单独把计算周转时间等作为一个函数
WWT = 0; //如果不置零将导致后续引用该函数的出错
cout<<endl;
}
//---------------------------------------------------------------------------
//短作业(进程)优先调度算法
//-----------------------------------------------------------------------------
void SJF(int n)
{
cout<<endl;
cout<<"SJF:"<<endl;
cout<<" 进程ID"<<" 完成时间"<<" 周转时间"<<" 带权周转时间"<<endl;
int finish = 0;
int min,k;
int m[MaxNum] = {0};
//完成时间计算
/** FinishTime[0] = ArrivalTime[0] + ServiceTime[0];
finish = FinishTime[0];
WholeTime[0] = FinishTime[0] - ArrivalTime[0];
WeightWholeTime[0] = (float)WholeTime[0] / (float)ServiceTime[0];
WT = WT + WholeTime[0];
WWT = WWT + WeightWholeTime[0];
cout<<"\t"<<setprecision(3)<<1<<"\t\t"<<setprecision(3)<<FinishTime[0]<<"\t\t"<<setprecision(3)<<WholeTime[0]<<"\t\t"<<setprecision(3)<<WeightWholeTime[0];
cout<<endl;
*/
for (int j = 0 ; j < n ; j++)
{
min = 5000; //将最小值设置的比较大,服务时间不可能能达到如此大
for (int i = 0 ; i < n; i++) //找到最短服务时间
if(m[i]==0 && ServiceTime[i]<min&&ArrivalTime[i]<=finish)
{
min = ServiceTime[i];
k = i;
}
m[k] = 1;
FinishTime[k] = finish + min; //计算该进程的完成时间
finish = FinishTime[k]; //标记该进程
}
for(int i = 0 ; i < n ; i++)
{
WholeTime[i] = FinishTime[i] - ArrivalTime[i];
WeightWholeTime[i] = (float)WholeTime[i] / (float)ServiceTime[i];
WT = WT + WholeTime[i];
WWT = WWT + WeightWholeTime[i];
cout<<"\t"<<setprecision(3)<<i+1<<"\t\t"<<setprecision(3)<<FinishTime[i]<<"\t\t"<<setprecision(3)<<WholeTime[i]<<"\t\t"<<setprecision(3)<<WeightWholeTime[i];
cout<<endl;
}
AverageWWT = WWT / n;
AverageWT = WT / n;
cout<<"平均周转时间为: "<<setprecision(3)<<AverageWT<<endl; //保留三位有效数字
cout<<"平均带权周转时间为: "<<setprecision(3)<<AverageWWT;
WT = 0; //WT和WWT最后要置零,因为我单独把计算周转时间等作为一个函数
WWT = 0; //如果不置零将导致后续引用该函数的出错
cout<<endl;
}
int main()
{
int n;
int input;
cout<<"请输入进程的数量n:";
cin>>n;
for(int i = 0 ; i < n ; i++)
{
cout<<"请输入进程"<<i+1<<"的到达时间和服务时间,并以空格间隔:";
cin>>ArrivalTime[i];
cin>>ServiceTime[i];
}
FCFS(n);
SJF(n);
return 0;
}