• 操作系统(实验二、作业调度模拟程序实验)


    实验二、作业调度模拟程序实验

    专业 商业软件工程   姓名 丘惠敏 学号 201406114203

    一、        实验目的

     

    (1)加深对作业调度算法的理解;

    (2)进行程序设计的训练。

    二、        实验内容和要求

    用高级语言编写一个或多个作业调度的模拟程序。

    单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。

    三、        实验方法、步骤及结果测试

     

    1.      源程序名:压缩包文件(rarzip)中源程序名 job3.c

    可执行程序名:job3.exe

    2.      原理分析及流程图

    主要通过数组和结构体存储各个作业信息,再用排序实现各个调度算法。

     1 struct jcb{
     2     int id;
     3     char status;
     4 
     5     int arrtime;
     6     int reqtime;
     7     int startime;
     8     int finitime;
     9 
    10     float TAtime,TAWtime;
    11     float prio;
    12 }   jobarr[24],jobfin[24],job[24];

    3.      主要程序段及其解释:

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<time.h>
      4 struct jcb{
      5     int id;
      6     char status;
      7 
      8     int arrtime;
      9     int reqtime;
     10     int startime;
     11     int finitime;
     12 
     13     float TAtime,TAWtime;
     14     float prio;
     15 }   jobarr[24],jobfin[24],job[24];
     16 int systime=0;
     17 //主菜单
     18 void menu()
     19 {
     20     printf("***************************************
    ");
     21     printf("      1.调用文本写入数据
    ");
     22     printf("      2.调用伪随机数的产生数据
    ");
     23     printf("      3.调用自己输入模拟数据
    ");
     24     printf("***************************************
    ");
     25 }
     26 //调度算法菜单
     27 void menu0()
     28 {
     29     printf("
    ***************************************
    ");
     30     printf("      1.FCFS算法调度
    ");
     31     printf("      2.SJF算法调度
    ");
     32     printf("      3.HRRF算法调度
    ");
     33     printf("      4.调用系统清屏
    ");
     34     printf("      0.退出算法调度
    ");
     35     printf("***************************************
    ");
     36 }
     37 //短作业优先排序
     38 void sort(int n)
     39 {
     40     int i,j; 
     41     struct jcb temp;
     42     for(i=2;i<n;i++) 
     43     for(j=i+1;j<=n;j++) 
     44     if(jobarr[i].reqtime>jobarr[j].reqtime) //根据最短的要求服务时间排序
     45     { 
     46        temp=jobarr[i]; 
     47        jobarr[i]=jobarr[j]; 
     48        jobarr[j]=temp; 
     49     } 
     50 }
     51 //先到先服务排序
     52 void sort0(int n)
     53 {
     54     int i,j; 
     55     struct jcb temp;
     56     for(i=2;i<n;i++) 
     57     for(j=i+1;j<=n;j++) 
     58     if(job[i].arrtime>job[j].arrtime) //根据到达时间排序
     59     { 
     60        temp=job[i]; 
     61        job[i]=job[j]; 
     62        job[j]=temp; 
     63     } 
     64 }
     65 //自己输入模拟数据
     66 void shoushu()
     67 {
     68         int n;
     69     printf("作业个数:");
     70     scanf("%d",&n);
     71     for(int i=1;i<=n;i++)
     72     {
     73         printf("
    第%d个作业:",i+1);
     74         printf("
    输入id:");
     75         scanf("%d",&job[i].id);
     76         printf("到达时间:");
     77         scanf("%d",&job[i].arrtime);
     78         printf("要求服务时间:");
     79         scanf("%d",&job[i].reqtime);
     80         jobarr[i]=job[i];
     81     }
     82 }
     83 //文本写入数据
     84 int ReadFile()
     85 {
     86     int m=0;
     87     int i=1;
     88     FILE *fp;     //定义文件指针
     89     fp=fopen("4.txt","r");  //打开文件
     90     if(fp==NULL)
     91     {
     92         printf("File open error !
    ");
     93         exit(0);
     94     }
     95     printf("
     id    作业到达时间     作业运行所需要时间
    ");
     96     while(!feof(fp))
     97     {
     98         fscanf(fp,"%d%d%d",&job[i].id,&job[i].arrtime,&job[i].reqtime);  //fscanf()函数将数据读入
     99         printf("
    %3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime);  //输出到屏幕
    100         i++;
    101     };
    102 
    103     if(fclose(fp))     //关闭文件
    104     {
    105         printf("Can not close the file !
    ");
    106         exit(0);
    107     }
    108     m=i-1;
    109     return m;
    110 
    111 }
    112 //伪随机数的产生数据
    113 int Pseudo_random_number()
    114 {
    115     int i,n;
    116     srand((unsigned)time(0));  //参数seed是rand()的种子,用来初始化rand()的起始值。
    117     //输入作业数
    118     n=rand()%23+5;
    119     for(i=1; i<=n; i++)
    120     {
    121         job[i].id=i;
    122         //作业到达时间
    123         job[i].arrtime=rand()%29+1;
    124         //作业运行时间
    125         job[i].reqtime=rand()%7+1;
    126     }
    127     printf("
     id    作业到达时间     作业运行所需要时间
    ");
    128     for(i=1; i<=n; i++)
    129     {
    130         printf("
    %3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime);
    131     }
    132     return n;
    133 
    134 }
    135 //先来先服务算法FCFS
    136 void FCFS()
    137 {
    138     int i=1,j=1;
    139     float sumTA=0,sumTAW=0;
    140     printf("-----------先来先服务算法FCFS-------------
    ");
    141     printf("
     id    作业到达时间     作业运行所需要时间
    ");
    142     while(job[j].id!=NULL)
    143     {
    144         printf("
    %3d%12d%15d",job[j].id,job[j].arrtime,job[j].reqtime);  //输出到屏幕
    145         j++;
    146     }
    147     sort0(j-1);
    148         printf("
    
     id    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间
    ");
    149         while(job[i].id!=NULL)
    150     {
    151         if(i==1)  //第一个作业先到达,先被调度
    152         {
    153             job[i].startime=job[i].arrtime;
    154         }
    155         else   //其他作业被调度
    156         {
    157             if(job[i-1].finitime>=job[i].arrtime)  //如果上一个作业的完成时间大于下一个到达时间,则下一个开始时间为上一个作业的完成时间
    158                 job[i].startime=job[i-1].finitime;
    159             else
    160                 job[i].startime=job[i].arrtime;   //否则下一个开始时间即它的到达时间
    161         }
    162         job[i].finitime=job[i].startime+job[i].reqtime; //计算完成时间
    163         job[i].TAtime=job[i].finitime-job[i].arrtime; //计算周转时间
    164         job[i].TAWtime=job[i].TAtime/job[i].reqtime;   //计算带权周转时间
    165         sumTA+=job[i].TAtime;
    166         sumTAW+=job[i].TAWtime;
    167         printf("
    %3d%12d%13d%14d%12.0lf%14.2lf",job[i].id,job[i].arrtime,job[i].finitime,job[i].reqtime,job[i].TAtime,job[i].TAWtime); 
    168         i++;
    169     }
    170         printf("
    平均作业周转时间= %.2lf",sumTA/(i-1));
    171         printf("
    平均带权作业周转时间= %.2lf",sumTAW/(i-1));
    172 }
    173 //最短作业优先算法SJF
    174 void SJF()
    175 {
    176     int i=1,j=1;
    177     float sumTA=0,sumTAW=0;
    178     printf("-----------最短作业优先算法SJF-------------
    ");
    179     printf("
     id    作业到达时间     作业运行所需要时间
    ");
    180     while(job[j].id!=NULL)
    181     {
    182         printf("
    %3d%12d%15d",job[j].id,job[j].arrtime,job[j].reqtime);  //输出到屏幕
    183         jobarr[j]=job[j];
    184         j++;
    185     }
    186     sort(j-1);
    187     printf("
    
     id    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间
    ");
    188     while(jobarr[i].id!=NULL)
    189     {
    190         if(i==1)
    191         {
    192             jobarr[i].startime=jobarr[i].arrtime;
    193         }
    194         else
    195         {
    196             if(jobarr[i-1].finitime>=jobarr[i].arrtime)
    197                 jobarr[i].startime=jobarr[i-1].finitime;
    198             else
    199                 jobarr[i].startime=jobarr[i].arrtime;
    200         }
    201         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
    202         jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
    203         jobarr[i].TAWtime=jobarr[i].TAtime/jobarr[i].reqtime;
    204         sumTA+=jobarr[i].TAtime;
    205         sumTAW+=jobarr[i].TAWtime;
    206         printf("
    %3d%12d%13d%14d%12.0lf%14.2lf",jobarr[i].id,jobarr[i].arrtime,jobarr[i].finitime,jobarr[i].reqtime,jobarr[i].TAtime,jobarr[i].TAWtime); 
    207         i++;
    208     }
    209         printf("
    平均作业周转时间= %.2lf",sumTA/(i-1));
    210         printf("
    平均带权作业周转时间= %.2lf",sumTAW/(i-1));
    211 }
    212 //最高响应比排序
    213 void sort1(int n,int k)
    214 {
    215     int i,j; 
    216     struct jcb temp;
    217     for(i=k;i<n;i++) 
    218     for(j=i+1;j<=n;j++) 
    219     if(jobfin[i].prio<jobfin[j].prio) 
    220     { 
    221        temp=jobfin[i]; 
    222        jobfin[i]=jobfin[j]; 
    223        jobfin[j]=temp; 
    224     } 
    225 }
    226 //响应比最高者优先HRRF算法
    227 void HRRF()
    228 {
    229     int i=1,j=1,k=1;
    230     float sumTA=0,sumTAW=0;
    231     printf("-----------响应比最高者优先HRRF算法-------------
    ");
    232     printf("
     id    作业到达时间     作业运行所需要时间
    ");
    233     while(job[j].id!=NULL)
    234     {
    235         printf("%3d%12d%15d
    ",job[j].id,job[j].arrtime,job[j].reqtime);  //输出到屏幕
    236         jobfin[j]=job[j];
    237         j++;
    238     }
    239     while(jobfin[k].id!=NULL)
    240     {
    241         i=k;  
    242         if(k==1)
    243         {
    244             jobfin[i].startime=jobfin[i].arrtime;
    245             jobfin[i].finitime=jobfin[i].startime+jobfin[i].reqtime;
    246             jobfin[i].TAtime=jobfin[i].finitime-jobfin[i].arrtime;
    247             jobfin[i].TAWtime=jobfin[i].TAtime/jobfin[i].reqtime;
    248         }
    249         else
    250         {
    251         printf("
    id   最高响应比
    ");
    252         while(jobfin[i].id!=NULL)
    253         {
    254             if(jobfin[k-1].finitime>=job[i].arrtime)
    255             {
    256                 jobfin[i].startime=jobfin[k-1].finitime;
    257                 jobfin[i].prio=(jobfin[i].startime-jobfin[i].arrtime)/(jobfin[i].reqtime/1.0)+1;
    258             }
    259             else
    260             {
    261                 jobfin[i].startime=0;    
    262                   jobfin[i].prio=0;
    263             }
    264             i++;
    265         }
    266         sort1(j-1,k);
    267         for(i=k;i<j;i++)
    268             printf("%3d%10.2lf
    ",jobfin[i].id,jobfin[i].prio);
    269         jobfin[k].finitime=jobfin[k-1].finitime+jobfin[k].reqtime;
    270         jobfin[k].TAtime=jobfin[k].finitime-jobfin[k].arrtime;
    271         jobfin[k].TAWtime=jobfin[k].TAtime/jobfin[k].reqtime;
    272         }
    273         k++;
    274     }
    275         printf("
    
     id    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间
    ");
    276         for(i=1;i<j;i++)
    277         {
    278             printf("
    %3d%12d%13d%14d%12.0lf%14.2lf",jobfin[i].id,jobfin[i].arrtime,jobfin[i].finitime,jobfin[i].reqtime,jobfin[i].TAtime,jobfin[i].TAWtime); 
    279             sumTA+=jobfin[i].TAtime;
    280             sumTAW+=jobfin[i].TAWtime;
    281         }
    282         printf("
    平均作业周转时间= %.2lf",sumTA/(i-1));
    283         printf("
    平均带权作业周转时间= %.2lf",sumTAW/(i-1));
    284 }
    285 void main0()
    286 {
    287     int tmp;
    288     while(1)
    289     {
    290     menu0();
    291     printf("
    请选择菜单项:");
    292     scanf("%d",&tmp);
    293     switch (tmp)
    294     {
    295     case 1:
    296         FCFS();
    297         break;
    298     case 2:
    299         SJF();
    300         break;
    301     case 3:
    302         HRRF();
    303         break;
    304     case 4:
    305         system("cls");
    306         break;
    307     case 0:
    308         return;
    309     }
    310     }
    311 }
    312 main()
    313 {
    314     int tmp;
    315     while(1)
    316     {
    317     menu();
    318     printf("
    请选择菜单项:");
    319     scanf("%d",&tmp);
    320     switch (tmp)
    321     {
    322     case 1:
    323         ReadFile();
    324         break;
    325     case 2:
    326         Pseudo_random_number();
    327         break;
    328     case 3:    
    329         shoushu();
    330         break;
    331     }
    332     main0();
    333     printf("
    ");
    334     }
    335 }

    4.      运行结果及分析

    文本写入数据                                                                                  伪随机数的产生数据

    自己输入模拟数据

    FCFS算法调度                                                                                                                           

    SJF算法调度

     HRRF算法调度

     

     

    四、        实验总结

     一开始看到老师展示这个实验时,我觉得这是一个很难的实验,即使给我一周也做不完。但是跟着老师的步骤一步一步来,我在一周内把这个实验基本完成了。有时候看起来不可能的任务,被拆解成多部分,在一步一步来完成,我们也能达到我们的目标。

  • 相关阅读:
    jquery 拼图小游戏
    重要参考SQL
    SQL Server save transaction
    SelectList类的构造函数
    一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要
    springMVC,spring和Hibernate整合(重要)
    delphi环境变量
    C# Chart 点击获取当前点击坐标和Series
    如何修改 app.config 的配置信息
    C#中使用设置(Settings.settings) Properties.Settings.Default .(配置文件相当重要)
  • 原文地址:https://www.cnblogs.com/qiuhuimin/p/5419603.html
Copyright © 2020-2023  润新知