• 操作系统:实验二 作业调度模拟程序


                                                                                        实验二  作业调度模拟程序

    专业:商业软件工程一班   姓名:容杰龙 学号:201406114157

    一、目的和要求

    1. 实验目的

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

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

    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

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

    先来先服务(FCFS)算法,最短作业优先 (SJF)算法,最短剩余时间优先算法,最高响应比优先(HRRN)算法,轮转法,多级反馈队列算法。

    5

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

    分析各种调度算法,理解算法过程,利用先来先服务(FCFS)算法,最短作业优先 (SJF)算法编程实现

    6

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

    输入:读取文件的方式

    输出:以二维表关系的形式输出

     

    五、       其他要求

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

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

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

    二、实验内容

    根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

    、实验环境

    可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。

    四、实验原理及核心算法参考程序段      

          单道FCFS算法:

            

    源代码:

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

     运行结果及分析:

    与预期结果有一点偏差,应该是算法出现了一点问题

    五、        实验总结

          通过本次实验,加深了自己对作业调度算法的理解,加强了对程序设计的训练。虽然算法不是很懂,也出现了不少问题,可是凭借自己的毅力,也解决了一部分问题。因此,遇到困难不要选择逃避,而应该耐心地寻找解决问题的途径,逐一去完成任务。与此同时,编程能力也得到一定程度的提高。

  • 相关阅读:
    错误 : 资产文件“项目objproject.assets.json”没有“.NETCoreApp,Version=v2.0”的目标。确保已运行还原,且“netcoreapp2.0”已包含在项目的 TargetFrameworks 中。
    .NET core RSA帮助类
    vs2010单步调试崩溃
    常用排序算法比较与分析
    js原生的轮播图
    vue-cli脚手架使用-- 初学者
    vue-cli配置基础
    jq轮播图插件
    bootstrap 获得轮播中的索引或当前活动的焦点对象
    jQuery学习笔记之Ajax用法详解
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/5394709.html
Copyright © 2020-2023  润新知