zoukankan      html  css  js  c++  java
  • 实验二 作业调度模拟程序

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

    专业:商业软件工程   姓名:王大华  学号:201406114221

    一、实验目的

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

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

    二、实验内容和要求

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

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

         作业调度算法:

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

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

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

    每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。

         作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。

    一、模拟数据的生成

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

    2.允许用户选择输入每个作业的到达时间和所需运行时间。

    3. (**)从文件中读入以上数据。

    4.  (**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。

    二、模拟程序的功能

    1.按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。

    2.动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。

    3.(**)允许用户在模拟过程中提交新作业。

    4.  (**)编写并调度一个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采用基于先来先服务的调度算法。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

    三、 模拟数据结果分析

    1.对同一个模拟数据各算法的平均周转时间,周转系数比较。

    2.(**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。

    四、 实验准备

    序号

    准备内容

    完成情况

    1

    什么是作业?

    2

    一个作业具备什么信息?

    3

    为了方便模拟调度过程,作业使用什么方式的数据结构存放和表示?JCB

    4

    操作系统中,常用的作业调度算法有哪些?

    5

    如何编程实现作业调度算法?

    6

    模拟程序的输入如何设计更方便、结果输出如何呈现更好?

    五、其他要求

          1.完成报告书,内容完整,规格规范。

          2.实验须检查,回答实验相关问题。

    注:带**号的条目表示选做内容

    六、主要程序

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<string.h>
      4 #define MAX 200
      5 typedef struct
      6 {
      7     char name[10];//作业名称
      8     int arrtime;//到达时间
      9     int reqtime;//要求服务时间
     10     int startime;//开始时间
     11     int finitime;//完成时间
     12     int waittime;//等待时间
     13     float TAtime,TAWtime;//周转时间,带权周转时间
     14     float prio;
     15 }job;
     16 
     17 job a[MAX];
     18 
     19 void FCFS(int num);
     20 void SJF(int num);
     21 void HRRF(int num);
     22 
     23 
     24 
     25 void main()     //主函数
     26 {
     27     int num;
     28     int i,j;
     29     printf("
    请输入作业个数:");
     30     scanf("%d",&num);
     31     printf("
    ");
     32     for(i=0;i<num;i++)
     33     {
     34         printf("第%d个作业:
    ",i+1);
     35         printf("输入作业名称:");
     36         scanf("%s",a[i].name);
     37         printf("到达时间:");
     38         scanf("%d",&a[i].arrtime);
     39         printf("要求服务时间:");
     40         scanf("%d",&a[i].reqtime);
     41         printf("
    ");
     42     }
     43     for(j=0;j<num;j++)
     44     {
     45         for(i=0;i<num-j;i++)
     46         {
     47             if(a[i].arrtime>a[i+1].arrtime)
     48             {
     49                 a[num]=a[i];
     50                 a[i]=a[i+1];
     51                 a[i+1]=a[num];
     52             }
     53         }
     54     }
     55     printf("		作业名称	到达时间	要求服务时间
    ");
     56     for(i=0;i<num;i++)
     57     {
     58         printf("N%d		%s		%d		%d
    ",i+1,a[i].name,a[i].arrtime,a[i].reqtime);
     59     }
     60     while(1)
     61     {
     62         printf("请选择算法
    :");
     63         printf("1.FCFS算法
    ");
     64         printf("2.SJF算法
    ");
     65         printf("3.HRRF算法
    ");
     66         printf("0.退出
    ");
     67         printf("请选择(0-3):");
     68         
     69         scanf("%d",&i);
     70         if(i==1)
     71         {
     72             printf("		1.FCFS算法
    ");
     73             FCFS(num);
     74         }
     75         if(i==2)
     76         {
     77             printf("		2.SJF算法
    ");
     78             SJF(num);
     79         }
     80         if(i==3)
     81         {
     82             printf("		3.HRRF算法
    ");
     83             HRRF(num);
     84         }
     85         if(i==0)
     86         {
     87             exit(0);
     88         }
     89     }
     90 
     91 }
     92 
     93 
     94 void FCFS(int num)  //建立一个先到先服务算法
     95 {
     96     int i;
     97     float sum_TAtime=0;//作业总周转时间
     98     float sum_TAWtime=0;//作业总带权周转时间
     99 
    100     a[0].finitime = a[0].arrtime + a[0].reqtime;
    101     a[0].startime = a[0].arrtime;
    102     for(i = 1; i < num; i++)
    103     {
    104         a[i].startime = a[i-1].finitime;
    105         a[i].finitime = a[i-1].finitime + a[i].reqtime;
    106     }
    107     for(i = 0; i < num; i++)
    108     {
    109         a[i].TAtime = a[i].finitime - a[i].arrtime;
    110         sum_TAtime += a[i].TAtime;
    111         a[i].TAWtime = a[i].TAtime / a[i].reqtime;
    112         sum_TAWtime += a[i].TAWtime;
    113     }
    114 
    115     printf("作业名	到达时间	要求服务时间	开始时间	结束时间	周转时间	带权周转时间
    ");
    116     for(i = 0; i < num; i++)
    117     {
    118         printf("%s		%d		%d		%d		%d		%.2f	%.2f
    ", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime);
    119     }
    120     printf("平均作业周转时间为:%.2lf
    ",sum_TAtime*1.0/num);  
    121     printf("平均带权作业周转时间为:%.2lf
    
    ",sum_TAWtime*1.0/num);  
    122 
    123 }
    124 
    125 
    126 void SJF(int num)  //建立最短作业优先函数
    127 {
    128     int i, j;
    129     float sum_TAtime=0;
    130     float sum_TAWtime=0;
    131     
    132     a[0].finitime = a[0].arrtime + a[0].reqtime;
    133     a[0].startime = a[0].arrtime;
    134     
    135     for(i = 1; i < num; i++)
    136     {
    137         for(j = 1; j <  num-1; j++)
    138         {
    139             if(a[j].reqtime > a[j+1].reqtime)
    140             {
    141                 a[num] = a[j]; 
    142                 a[j] = a[j+1]; 
    143                 a[j+1] = a[num];
    144             }
    145         }
    146     }
    147     for(i = 1; i < num; i++)
    148     {
    149         a[i].startime = a[i-1].finitime;
    150         a[i].finitime = a[i-1].finitime + a[i].reqtime;
    151     }
    152     for(i = 0; i < num; i++)
    153     {
    154         a[i].TAtime = a[i].finitime - a[i].arrtime;
    155         sum_TAtime += a[i].TAtime;
    156         a[i].TAWtime = a[i].TAtime / a[i].reqtime;
    157         sum_TAWtime += a[i].TAWtime;
    158     }
    159 
    160     printf("作业名	到达时间	要求服务时间	开始时间	结束时间	周转时间	带权周转时间
    ");
    161     for(i = 0; i < num; i++)
    162     {
    163         printf("%s	%d	%d	%d	%d	%.2f	%.2f
    ", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime);
    164     }
    165     printf("平均作业周转时间为:%.2lf
    ",sum_TAtime*1.0/num);  
    166     printf("平均带权作业周转时间为:%.2lf
    
    ",sum_TAWtime*1.0/num);  
    167 
    168 
    169 }
    170 
    171 
    172 void HRRF(int num)  //建立一个最短作业优先函数
    173 {
    174      int i, j;
    175     float sum_TAtime=0;
    176     float sum_TAWtime=0;
    177      
    178     a[0].finitime = a[0].arrtime + a[0].reqtime;
    179     a[0].startime = a[0].arrtime;
    180    
    181     for(i = 1; i <num; i++)
    182     {
    183         for(j = 1; j < num-1; j++)
    184         {
    185             if(a[j].prio < a[j+1].prio)
    186             {
    187                 if(a[j].arrtime == a[j+1].arrtime)
    188                 {
    189                     a[num] = a[j]; 
    190                     a[j] = a[j+1]; 
    191                     a[j+1] = a[num];
    192                 }
    193             }
    194         }
    195     }
    196     for(i = 1; i <num; i++)
    197     {
    198         a[i].prio = 1 + (a[i-1].finitime - a[i].arrtime) / a[i].reqtime;
    199         a[i].finitime = a[i-1].finitime + a[i].reqtime;
    200     }
    201 
    202     for(i = 0; i <num; i++)
    203     {
    204         a[i].TAtime = a[i].finitime - a[i].arrtime;
    205         sum_TAtime += a[i].TAtime;
    206         a[i].TAWtime = a[i].TAtime / a[i].reqtime;
    207         sum_TAWtime += a[i].TAWtime;
    208     }
    209 
    210     printf("作业名	到达时间	要求服务时间	开始时间	结束时间	周转时间	带权周转时间
    ");
    211     for(i = 0; i < num; i++)
    212     {
    213         printf("%s	%d	%d	%d	%d	%.2f	%.2f
    ", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime);
    214     }
    215     printf("平均作业周转时间为:%.2lf
    ",sum_TAtime*1.0/num);  
    216     printf("平均带权作业周转时间为:%.2lf
    
    ",sum_TAWtime*1.0/num);  
    217 
    218 }

    七、运行结果

    八、实验总结

    这次实验涉及了c语言中很多内容,而自己还有很多不懂,所以做起来有点困难,不过通过这次实验,温习了c语言的一些知识,知道了自己的一些不足

  • 相关阅读:
    Unity3D读取assetbundle
    Unity3D 发布成exe之后黑屏
    Unity3D优化总结
    Unity3D中中 rect[2] == rt->GetGLWidth() && rect[3] == rt->GetGLHeight()错误的原因及解决方法
    C# mysql 插入数据,中文乱码的解决方法
    WPF Canvas做自动缩放时获取控件的实际高度
    面向对象
    常用模块介绍
    python异常处理,多线程,多进程
    python生成器,递归调用
  • 原文地址:https://www.cnblogs.com/wangdahua/p/5421024.html
Copyright © 2011-2022 走看看