短作业优先算法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);

}


  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include //定义一个结构体 struct sjf{ char name[10]; //进程名 float arrivetime; //到达时间 float servicetime;//服务时间 float starttime; //开始时间 float finishtime;//完成时间 float zztime;//周转时间 float dqzztime;//带权周转 }; //定义一个结构体数组 sjf a[100]; //定义一个输入函数 void input(sjf *p,int N) { int i; printf("intput the process's name & arrivetime & servicetime:\nfor exmple: a 0 100\n"); for(i=0;i<=N-1;i++) { printf("input the %dth process's information:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); } } //定义一个输出函数 void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) { int k; printf("run order:");//执行顺序 printf("%s",p[0].name); for(k=1;k%s",p[k].name); } printf("\nthe process's information:\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n"); for(k=0;k<=N-1;k++) { printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime); } } //按到达时间排序 void sort(sjf *p,int N) { for(int i=0;i<=N-1;i++) for(int j=0;j<=i;j++) if(p[i].arrivetime<p[j].arrivetime) { sjf temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } //运行阶段 void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) { int k; for(k=0;k=p[k].arrivetime) { p[k].starttime=p[k-1].finishtime;} else { p[k].starttime =p[k].arrivetime;} p[k].finishtime=p[k].starttime+p[k].servicetime; } } for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间 p[k].dqzztime=p[k].zzti

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值