短作业优先算法c++实现

短作业优先: 短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);这是对FCFS算法的改进,其目标是减少平均周转时间.
定义

对预计执行时间短的作业(进程)优先分派处理机.通常后来的短作业不抢先正在执行的作业.

代码为:

#include<stdio.h> 

#include <iostream>

#include<iomanip> 

using namespace std; 

 

struct PCB

   char name[10];//进程名 

   float arrivetime;//标志进程到达时间 

   float needtime;//进程所需的时间 

   float starttime;//开始时间

         floatfinishtime;//完成时间

   float alltime;//总共所用的时间,即周转时间 

         floatdqalltime;//带权周转时间

};  

PCB a[200];

void Pinput(PCB *p,int N)

{

cout<<"*-----------------------输入部分------------------------*"<<endl; 

cout<<"进程名称"<<"\t"<<"到达时间"<<"\t"<<"所需时间"<<endl; 

   for(int i=0;i<N;i++)

         {

                  cout<<"输入第"<<i<<"个进程的信息"<<endl;

       cin>>p[i].name;

                  cin>>p[i].arrivetime;

                  cin>>p[i].needtime;

         }

}

 

void Poutput(PCB *p,int N)

{

float arrivetime;

float needtime;

float starttime;

float finishtime;

float alltime;

float dqalltime;

         intj;

   cout<<"*------------------输出部分-------------------*"<<endl; 

         cout<<"具体进程调度信息:"<<endl;

         cout<<"进程名  到达时间  所需时间  开始时间  结束时间  周转时间  带权周转时间"<<endl;

    for(j=0;j<N;j++)

          {

       cout<<setw(4)<<p[j].name<<setw(8)<<p[j].arrivetime<<setw(10)<<p[j].needtime<<setw(10)

                           <<p[j].starttime<<setw(10)<<p[j].finishtime<<setw(10)<<p[j].alltime<<setw(10)

                   <<p[j].dqalltime<<endl;

          }

     

}

//排序

void Psort(PCB *p,int N)

{

         for(inti=0;i<N;i++)

                  for(int j=0;j<i;j++)

                           if(p[i].arrivetime<p[j].arrivetime)

                  {

                           PCBtemp;

                           temp=p[i];

                           p[i]=p[j];

                           p[j]=temp;

                  }

                           intk;

         for(k=0;k<N-1;k++)

         {

                  if(k==0)

                  {

                           p[k].starttime=p[k].arrivetime;

                           p[k].finishtime=p[k].arrivetime+p[k].needtime;

                  }

                  else

                  {

                           p[k].starttime=p[k-1].finishtime;

                           p[k].finishtime=p[k].starttime+p[k].needtime;

                  }

        

         //选择最短作业执行

         intm=0;

         for(intt=k+1;t<=N-1;t++)

         {

                  if(p[t].arrivetime<=p[k].finishtime)

                           m++;

         }

         floatmin=p[k+1].needtime;

         intnext=k+1;

for(int q=k+1;q<k+m;q++)

{

         if(p[q+1].needtime<min)

         {

                  min=p[q+1].needtime;

                  next=q+1;

         }

         PCBtemp;

         temp=p[k+1];

         p[k+1]=p[next];

   p[next]=temp;

}

}

}

//运行,计算周转时间和带权周转时间

void Pdeal(PCB *p,float arrivetime,floatneedtime,float starttime,float finishtime,float &alltime,float&dqalltime,int N)

{

         intk;

         for(k=0;k<N;k++)

         {

                  if(k==0)

                  {

                           p[k].starttime=p[k].arrivetime;

                           p[k].finishtime=p[k].arrivetime+p[k].needtime;

                  }

                  else

                  {

                           p[k].starttime=p[k-1].finishtime;

                           p[k].finishtime=p[k].starttime+p[k].needtime;

                  }

         }

         for(k=0;k<N;k++)

         {

                  p[k].alltime=p[k].finishtime-p[k].arrivetime;

                  p[k].dqalltime=p[k].alltime/p[k].needtime;

         }

}

         voidPCB(PCB *p,int N)

         {

                  float arrivetime=0;

                  float needtime=0;

                  float starttime=0;

                  float finishtime=0;

       float alltime=0;

                  float dqalltime=0;

       Psort(p,N);

                  Pdeal(p,arrivetime,needtime,starttime,finishtime,alltime,dqalltime,N);

       Poutput(p,N);

         }

int main()

{

         intm;

         cout<<"*------------------短作业优先-------------------*"<<endl;

         cout<<"输入进程数:"<<endl;

         cin>>m;

         Pinput(a,m);

         PCB(a,m);

}


猜你喜欢

转载自blog.csdn.net/zrx1832/article/details/80279859