进程调度算法--先来先服务算法-短进程优先算法

发布时间 2023-10-20 16:54:40作者: lwj_2023_lwj

常用的调度算法

  1. 先来先服务调度算法(FCFS):先到达先执行,非抢占式的,同时就绪时仲裁规则是随机的。

  2. 短进程优先调度算法(SPF):从就绪队列中找运行时间最短的进程,非抢占式的,仲裁规则是按照时间先后顺序或随机方式。

    先来先服务调度算法(FCFS)

#include<stdio.h>
#include<stdlib.h>
struct work{
   char name[10]; //作业名称
   int Atime;     //到达时间
   int Stime;     //服务时间
   int Ftime;     //完成时间
   int Rtime;     //周转时间
   double DRtime; //带权周转时间
};
int main(void){
   int N,num;                              //输入N个作业
printf("请输入总共的进程数:\n");
   scanf("%d",&N);
   struct work s[N];
   printf("请输入作业名:\n");
   for(int i=0; i<N; i++)              //输入作业名字
       scanf("%s",&s[i].name);
   printf("请输入作业到达时间:\n") ;
   for(int i=0; i<N; i++)              //输入作业到达时间
       scanf("%d",&s[i].Atime);  
   printf("请输入作业服务时间:\n") ;    
   for(int i=0; i<N; i++)              //输入作业服务时间
       scanf("%d",&s[i].Stime);
   for(int i=0; i<N-1; i++)            //按到达时间排序
  {
       struct work temp;
       for(int j=i+1; j<N; j++)
      {
           if(s[i].Atime>s[j].Atime)
          {
               temp=s[i];
               s[i]=s[j];
               s[j]=temp;
          }
      }
  }
   for(int i=0; i<N; i++)             //计算完成时间
  {
       if(i==0)
           s[0].Ftime=s[0].Atime+s[0].Stime;
       else{
      if(s[i].Atime>s[i-1].Ftime)//后一个程序的到达时间比前一个程序的完成时间
      s[i].Ftime=s[i].Atime+s[i].Stime;
      else
      s[i].Ftime=s[i-1].Ftime+s[i].Stime;
}
}
   for(int i=0; i<N; i++)            //计算周转时间
       s[i].Rtime=s[i].Ftime-s[i].Atime;
   for(int i=0; i<N; i++)            //计算带权周转时间
       s[i].DRtime=1.0*s[i].Rtime/s[i].Stime;
   printf("作 业 名:");              //输出
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%s",s[N-1].name);
           printf("\n");
      }
       else
       printf("%s ",s[i].name);
  }
   printf("到达时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%d",s[N-1].Atime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Atime);
  }
   printf("服务时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%d",s[N-1].Stime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Stime);
  }
   printf("完成时间:");
   for(int i=0; i<N; i++)
  {
        if(i==N-1)
      {
           printf("%d",s[N-1].Ftime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Ftime);
  }
   printf("周转时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%d",s[N-1].Rtime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Rtime);
  }
   printf("带权周转时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%.2f",s[N-1].DRtime);
           printf("\n");
      }
       else
       printf("%.2f ",s[i].DRtime);
  }
double sumRtime=0;
double sumDRtime=0;
for(int i=0; i<N; i++)  //平均周转时间
sumRtime+=s[i].Rtime;
   for(int i=0;i<N;i++)    //平均带权周转时间
sumDRtime+=s[i].DRtime;
double Vrtime=sumRtime/N;
   double Vdrtime=sumDRtime/N;
printf("平均周转时间为%f",Vrtime);
printf("平均带权周转时间为%f",Vdrtime);
   return 0;
}

短进程优先调度算法(SPF)

#include<stdio.h>
#include<stdlib.h>
struct work{
   char name[10]; //作业名称
   int Atime;     //到达时间
   int Stime;     //服务时间
   int Ftime;     //完成时间
   int Rtime;     //周转时间
   double DRtime; //带权周转时间
};
int main(void){
   int N,num;                              //输入N个作业
printf("请输入总共的进程数:\n");
   scanf("%d",&N);
   struct work s[N];
   printf("请输入作业名:\n");
   for(int i=0; i<N; i++)              //输入作业名字
       scanf("%s",&s[i].name);
   printf("请输入作业到达时间:\n") ;
   for(int i=0; i<N; i++)              //输入作业到达时间
       scanf("%d",&s[i].Atime);  
   printf("请输入作业服务时间:\n") ;    
   for(int i=0; i<N; i++)              //输入作业服务时间
       scanf("%d",&s[i].Stime);
   for(int i=0; i<N-1; i++)            //按进程最短时间排序
  {
       struct work temp;
       for(int j=i+1; j<N; j++)
      {
           if(s[i].Stime>s[j].Stime)
          {
               temp=s[i];
               s[i]=s[j];
               s[j]=temp;
          }
      }
  }
   //查看第一个到达的进程,利用冒泡排序法,把最先到达进程放在第一个
   for(int i=N-1;i>0;i--)
  {
struct work temp;
       if(s[i].Atime<s[i-1].Atime)
{
temp=s[i];
s[i]=s[i-1];
s[i-1]=temp;
}
}  
//计算完成时间
s[0].Ftime=s[0].Atime+s[0].Stime;
   for(int i=1; i<N; i++)            
  {
if(s[i-1].Ftime>=s[i].Atime)// 前一个程序的完成时间 比   后一个程序的到达时间  
      s[i].Ftime=s[i-1].Ftime+s[i].Stime;
      else
          {
for(int j=N-1;j>i;j--) //利用冒泡排序法原理,把最先到达进程放在索引为i的结构体中
{
struct work temp;
       if(s[j].Atime<s[j-1].Atime)
{
temp=s[j];
s[j]=s[j-1];
s[j-1]=temp;
}
}
               s[i].Ftime=s[i].Atime+s[i].Stime;
}
}
   for(int i=0; i<N; i++)            //计算周转时间
       s[i].Rtime=s[i].Ftime-s[i].Atime;
   for(int i=0; i<N; i++)            //计算带权周转时间
       s[i].DRtime=1.0*s[i].Rtime/s[i].Stime;
   printf("作 业 名:");              //输出
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%s",s[N-1].name);
           printf("\n");
      }
       else
       printf("%s ",s[i].name);
  }
   printf("到达时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%d",s[N-1].Atime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Atime);
  }
   printf("服务时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%d",s[N-1].Stime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Stime);
  }
   printf("完成时间:");
   for(int i=0; i<N; i++)
  {
        if(i==N-1)
      {
           printf("%d",s[N-1].Ftime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Ftime);
  }
   printf("周转时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%d",s[N-1].Rtime);
           printf("\n");
      }
       else
       printf("%d ",s[i].Rtime);
  }
   printf("带权周转时间:");
   for(int i=0; i<N; i++)
  {
       if(i==N-1)
      {
           printf("%.2f",s[N-1].DRtime);
           printf("\n");
      }
       else
       printf("%.2f ",s[i].DRtime);
  }
   double sumRtime=0;
double sumDRtime=0;
for(int i=0; i<N; i++)  //平均周转时间
sumRtime+=s[i].Rtime;
   for(int i=0;i<N;i++)    //平均带权周转时间
sumDRtime+=s[i].DRtime;
double Vrtime=sumRtime/N;
   double Vdrtime=sumDRtime/N;
printf("平均周转时间为%f",Vrtime);
printf("平均带权周转时间为%f",Vdrtime);
   return 0;
}