先来先服务算法(FCFS)和 短作业优先算法(SJF)

来源:互联网 发布:2016淘宝店好做吗 编辑:程序博客网 时间:2024/05/29 03:30

先来先服务算法(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;  }  



0 1