1. 程式人生 > >短作業優先演算法c++實現

短作業優先演算法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);

}