• 实验三进程调度模拟程序


    实验三进程调度模拟程序2.0

    一、实验目的

    用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

    二、实验要求

    设计一个有 N个进程并发执行的进程调度模拟程序。

    1.模拟进程数据的生成

    允许用户指定作业的个数(2-24),默认值为5。

    允许用户选择输入每个进程的到达时间,所需运行时间,进程的运行时间以时间片为单位。

    2. 模拟调度程序的功能

    2.1 按照模拟数据的到达时间和所需运行时间,能分别执行以下调度算法。

    FCFS

    SJ

    HRRN

    RR

    2.2 显示每种算法下各进程的调度执行顺序。

    2.3计算各进程的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。

    2.4模拟数据结果分析:对同一组模拟数据,比较各算法的平均周转时间,周转系数。

    三、实验说明

    1)  先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

    2)  短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

    3)  响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间。

    4)  时间片轮转(RR)调度算法:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。

    四、实验环境

    可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。

     五、实验代码


    #include<stdio.h>
    #include<time.h>
    #include<windows.h>

    struct job
    {
     char name[10];
     char status;
     int id;
     int arrtime; 
     int reqtime; 
     int startime; 
     int finitime; 
     float TAtime,TAWtime;
     float rp;
    }job[24];


    int Pseudo_random_number()
    {
     int i,n;
     srand((unsigned)time(0)); 

     n=rand()%23+5;
     for(i=0; i<n; i++)
     {
      job[i].id=i+1;
      //作业到达时间
      job[i].arrtime=rand()%29+1;
      //作业运行时间
      job[i].reqtime=rand()%7+1;
     }
     printf(" id    作业到达时间     作业运行所需要时间 ");
     for(i=0; i<n; i++)
     {
      printf(" %3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime);
     }
     return n;
     
    }

    void sort(struct job temp[24],int num)
    {
     int i;
     int j;
     struct job k;
     for(i=0;i<num-1;i++)
     {
      for(j=i+1;j<num;j++)
      {
       if(temp[j].arrtime<temp[i].arrtime)
       {
        k = temp[j];
        temp[j] = temp[i];
        temp[i] = k;
       }
      }
     }
    }

    void FCFS(struct job temp[24],int num)
    {
     int i=0;
     printf("先来先服务算法FCFS ");
     float sumTAtime=0;
     float aveTAtime=0;
     sort(temp,num);
     temp[i].startime = temp[i].arrtime;
     temp[i].finitime = temp[i].startime + temp[i].reqtime;
     temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
     sumTAtime+=temp[i].TAtime;
     aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     for(i=1;i<num;i++)
     {
      temp[i].startime = temp[i-1].finitime;
      temp[i].finitime = temp[i].startime + temp[i].reqtime;
      temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
      temp[i].rp=temp[i].TAtime/temp[i].reqtime;
      sumTAtime+=temp[i].TAtime;
      aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     }
     
     
     printf("作业名  到达时间  CPU所需时间  开始时间  结束时间  周转时间 ");
     for(i=0;i<num;i++)   
     {
      printf("%s   %d      %d          %d    %d    %f ",temp[i].name,temp[i].arrtime,
       temp[i].reqtime,temp[i].startime,temp[i].finitime,temp[i].TAtime);
     }
     printf("平均周转时间=%f ",sumTAtime/num);
     printf("平均带权周转时间=%f ",aveTAtime/num);
     
    }

    void SJF(struct job temp[24],int num)
    {
     printf("最短作业优先算法SJF ");
     int i=0;
     int j;
     struct job k;
     float sumTAtime=0;
     float aveTAtime=0;
     sort(temp,num);
     temp[i].startime = temp[i].arrtime;
     temp[i].finitime = temp[i].startime + temp[i].reqtime;
     temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
     sumTAtime+=temp[i].TAtime;
     aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     for(i=1;i<num-1;i++)
     {
      for(j=i+1;j<num;j++)
      {
       if(temp[j].reqtime<temp[i].reqtime)
       {
        k=temp[j];
        temp[j]=temp[i];
        temp[i]=k;
       }
      }
     }
     for(i=1;i<num;i++)
     {
      temp[i].startime = temp[i-1].finitime;
      temp[i].finitime = temp[i].startime + temp[i].reqtime;
      temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
      sumTAtime+=temp[i].TAtime;
      aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     }
     
     
     printf("作业名  到达时间  CPU所需时间  开始时间  结束时间  周转时间 ");
     for(i=0;i<num;i++)   
     {
      printf("  %s   %d      %d          %d    %d    %f ",temp[i].name,temp[i].arrtime,
       temp[i].reqtime,temp[i].startime,temp[i].finitime,temp[i].TAtime);
     }
     printf("平均周转时间=%f ",sumTAtime/num);
     printf("平均带权周转时间=%f ",aveTAtime/num);
     
    }

    void HRRN(struct job temp[24],int num)
    {
     int i=0;
     int j;
     struct job k;
     printf("最短作业优先算法HRRF ");
     sort(temp,num);
     float sumTAtime=0;
     float aveTAtime=0;
     temp[i].startime = temp[i].arrtime;
     temp[i].finitime = temp[i].startime + temp[i].reqtime;
     temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
     sumTAtime+=temp[i].TAtime;
     aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     for(i=1;i<num;i++)
     {
      temp[i].startime = temp[i-1].finitime;
      temp[i].finitime = temp[i].startime + temp[i].reqtime;
      temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
      temp[i].rp=temp[i].TAtime/temp[i].reqtime;
      sumTAtime+=temp[i].TAtime;
      aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     }
     for(i=1;i<num-1;i++)
     {
      for(j=i+1;j<num;j++)
      {
       if(temp[j].rp<temp[i].rp)
       {
        k=temp[j];
        temp[j]=temp[i];
        temp[i]=k;
       }
      }
     }
     for(i=1;i<num;i++)
     {
      temp[i].startime = temp[i-1].finitime;
      temp[i].finitime = temp[i].startime + temp[i].reqtime;
      temp[i].TAtime = temp[i].finitime - temp[i].arrtime;
      temp[i].rp=temp[i].TAtime/temp[i].reqtime;
      sumTAtime+=temp[i].TAtime;
      aveTAtime+=temp[i].TAtime/temp[i].reqtime;
     }

     printf("作业名  到达时间  CPU所需时间  开始时间  结束时间  周转时间 ");
     for(i=0;i<num;i++)   
     {
      printf("  %s   %d      %d          %d    %d    %f ",temp[i].name,temp[i].arrtime,
       temp[i].reqtime,temp[i].startime,temp[i].finitime,temp[i].TAtime);
     }
     printf("平均周转时间=%f ",sumTAtime/num);
     printf("平均带权周转时间=%f ",aveTAtime/num);
    }

    int main()
    {
     int x;
     int num;
     int i;

     printf("1.随机数产生数据 ");
     printf("2.自己输入模拟数据 ");

     printf("请选择菜单项:");
     scanf("%d",&x);
        if(x==1)
     {
      num=Pseudo_random_number();
     }
     else if(x==2)
     {
      printf("作业个数:");
      scanf("%d",&num);
      printf(" ");
      for(i = 0;i<num;i++)
      {
       printf("第%d个作业: ",i+1);
       printf("输入作业名:");
       scanf("%s",&job[i].name);
       printf("到达时间:");
       scanf("%d",&job[i].arrtime);
       printf("要求服务时间:");
       scanf("%d",&job[i].reqtime);
       printf(" ");
      }
      printf("经按到达时间排序后,未达到队列是 ");
      printf("id 作业到达时间 作业运行所需要的时间 ");
      for(i=0;i<num;i++)   
      {
       printf("%s %d %d ",job[i].name,job[i].arrtime,job[i].reqtime);
      }
      
     }
     while(1)
     {
      printf(" ");

      printf("1.FCFS算法调度 ");
      printf("2.SJF算法调度 ");
      printf("3.HRRF算法调度 ");
      printf("0.退出算法调度 ");
     
      printf("请输入菜单项:");
      scanf("%d",&x);
      if(x==1)
      {
       FCFS(job,num);
      }
      else if(x==2)
      {
       SJF(job,num);
      }
      else if(x==3)
      {
       HRRN(job,num);
      }
      else if(x==0)
      {
       exit(0);
      }
      return 0;
     }
    }

     六、实验结果

  • 相关阅读:
    android EditText 软键盘 一些总结
    Activity的4种加载模式最佳解答及Intent常用标识
    Android App监听软键盘按键的三种方式
    解决ScrollView下嵌套ListView、GridView显示不全的问题(冲突)
    Android使用WindowManager实现悬浮窗口
    android 设置软键盘默认为26位软键盘
    android:configChanges属性总结
    空腹吃香蕉对身体好吗?哪些水果不宜空腹吃
    冒泡排序,选择排序,二分法
    Android:内存优化的一些总结
  • 原文地址:https://www.cnblogs.com/kang8823/p/5505527.html
Copyright © 2020-2023  润新知