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


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

    商业软件工程 201406114116 黄敏鹏

    一、        实验目的

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

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

    二、        实验内容和要求

    实验内容

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

    实验要求

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

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

    一、       模拟数据的生成

    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

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

    由作业说明书在系统中生成一个称为作业控制块(job control block,JCB)的表格。该表格登记该作业所要求的资源情况、预计执行时间和执行优先级等。从而,操作系统通过该表了解到作业要求,并分配资源和控制作业中程序和数据的编译、链接、装入和执行等。

    4

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

    先来先服务算法、最短作业优先算法、最短剩余时间优先算法、最高响应比优先算法、轮转调度算法、多级反馈队列调度算法、优先级法调度算法  

    5

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

    6

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

     

    五、       其他要求

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

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

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

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

    1.      原理分析及流程图

    作业调度算法:

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

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

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

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

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

    程序运行截图:

    输入数据:

    功能选择页面:

    最高响应比排序:

    先到先服务排序:

    短作业优先排序:

    源代码如下:

      1 #include<windows.h>
      2 #include<dos.h>
      3 #include<time.h>
      4 #include<stdlib.h>
      5 #include<stdio.h>
      6 #include<conio.h>
      7 #include<string.h> 
      8 
      9 struct jcb {
     10     char name[10];    /*作业号*/
     11     int arrtime;      /* 作业到达时间*/
     12     int reqtime;      /*作业要求服务时间*/
     13     int waiTime;      /*等待时间*/
     14     int startime;     /*开始运行时间*/
     15     int finitime;     /*结束运行时间*/
     16     int TAtime;       /*周转时间*/
     17     int TTAWtime;     /*带权周转时间*/
     18     int priority;     /*优先权*/
     19     int finish;       /*是否已经完成*/
     20 }jobarr[24],jobfin[24],job[24];
     21 
     22 int systime=0;    //系统时间
     23 int intarr=0;     //记录jobarr[]的元素个数
     24 int intfin;       //记录jobfin[]的元素个数
     25 int intjob;       //记录job[]的元素个数
     26 
     27 void intputjobarr();
     28 void putoutAlljobarr();
     29 void sort();
     30 void simulateCohort();
     31 int HRN(int pre);
     32 void runing(int i, int times, int pre, int staTime, int endTime);
     33 void print(int i,int times);
     34 void check( );
     35 void SortByreqtime(int,jcb*);
     36 void SJF(int);
     37 int FindTheShortarrtimejobarray(int, int);
     38 int DeleteTheUsedJobById(jcb, int);
     39 void SortByarrtime(int, jcb*);
     40 
     41 /*
     42     主函数
     43 */
     44 void main()
     45 {
     46     system("mode con cols=100 lines=30");  //窗口宽度高度
     47     system("title -huangMP-116");           //设置窗口标题
     48     int n;
     49     int choose;
     50     printf("
    	作业的个数 : ");
     51     scanf("%d",&n);
     52     while(intarr<n){
     53         intputjobarr();
     54     }    
     55     do{
     56         system("cls");
     57         printf("
    	0.最高响应比    1.先到先服务    2.短作业优先    3.结束程序
    
    	");
     58         printf("请选择服务:");
     59         scanf("%d",&choose);
     60         switch(choose){
     61         case 0:
     62             check();
     63             putoutAlljobarr();
     64             break;
     65         case 1:
     66             simulateCohort();
     67             putoutAlljobarr();
     68             break;
     69         case 2:
     70             SJF(intarr);
     71             putoutAlljobarr();
     72             break;
     73         case 3:
     74             exit(0);
     75             break;
     76         }
     77     }while(1);
     78 }
     79 
     80 /*--------------------------------------------------------------------------------------
     81     先到先服务 开始
     82     优先权 = 到达时间
     83 */
     84 void sort(){
     85     jcb k;
     86     for(int i=0;i<intarr;i++){
     87         for(int j=0;j<intarr-1;j++){
     88             if(jobarr[j].arrtime>jobarr[j+1].arrtime){
     89                 k=jobarr[j];
     90                 jobarr[j]=jobarr[j+1];
     91                 jobarr[j+1]=k;
     92             }
     93         }
     94     }
     95 }
     96 void simulateCohort(){
     97         jobarr[0].startime=jobarr[0].arrtime;
     98         jobarr[0].finitime=jobarr[0].startime+jobarr[0].reqtime;
     99         jobarr[0].TAtime=jobarr[0].finitime-jobarr[0].arrtime;
    100         jobarr[0].TTAWtime=float(jobarr[0].TAtime)/jobarr[0].reqtime;
    101     for(int i=1;i<intarr;i++){
    102         if(jobarr[i].arrtime<jobarr[i-1].finitime)
    103             jobarr[i].startime=jobarr[i-1].finitime;
    104         else
    105             jobarr[i].startime=jobarr[i].arrtime;
    106         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
    107         jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
    108         jobarr[i].TTAWtime=float(jobarr[i].TAtime)/jobarr[i].reqtime;
    109     }
    110 }
    111 float sjp(int n){
    112     int i,first=0,count,flag[20],k,min;
    113     float time=0,weight_time=0;
    114     //调度第一个到达内存的进程
    115     for(i=1;i<n;i++)
    116     {
    117         if(jobarr[first].arrtime>jobarr[i].arrtime) 
    118             first=i;
    119         flag[i]=0;
    120     }
    121     flag[first]=1;
    122     time=(float)jobarr[first].reqtime;
    123     weight_time=1;
    124     printf("%s   %d    %d    %d
    ",jobarr[first].name,jobarr[first].arrtime,jobarr[first].reqtime,weight_time);
    125     //jobarr_temp[0]=jobarr[first];
    126     count=n-1;
    127     while(count)
    128     {
    129         k=0;
    130         min=32767; //设置一个较大的阈值,
    131         for(i=0;i<n;i++) //找到一个未被访问的,作业较短的且已经到达内存的作业调度 
    132             if((i!=first)&&(flag[i]==0)&&(time>=jobarr[i].arrtime)&&(min>jobarr[i].reqtime))
    133             {
    134                 k=i;
    135                 min=jobarr[i].reqtime;
    136                 
    137             }
    138             flag[k]=1; //访问后置标记为访问
    139             time+=jobarr[k].reqtime;
    140             weight_time+=(time-jobarr[k].arrtime)/jobarr[k].reqtime;
    141             
    142             printf("%s   %d    %d    %d
    ",jobarr[k].name,jobarr[k].arrtime,jobarr[k].reqtime,(time-jobarr[k].arrtime)/jobarr[k].reqtime);
    143             count--; //每调度一个作业,count减1
    144     }
    145     return weight_time/=n;
    146 }
    147 /*
    148     先到先服务 结束
    149 */
    150 
    151 /*--------------------------------------------------------------------------------------
    152     最高响应比  开始
    153     优先权 =(等待时间+服务时间)/服务时间
    154 */
    155 int HRN(int pre) {
    156     int current=1,i,j;
    157     for(i=0; i<intarr; i++)  {
    158         jobarr[i].waiTime=jobarr[pre].finitime-jobarr[i].arrtime; /*等待时间 =上一个业的完成时间-到达时间*/
    159         jobarr[i].priority=(jobarr[i].waiTime+jobarr[i].reqtime)/jobarr[i].reqtime;
    160     }
    161     for(i=0; i<intarr; i++)
    162     {
    163         if(!jobarr[i].finish)
    164         {
    165             current=i;  /*找到第一个还没完成的作业*/
    166             break;
    167         }
    168     } 
    169     for( j=i; j<intarr; j++) /*和后面的作业比较*/
    170     {
    171         if( !jobarr[j].finish) /* 还没完成(运行)*/
    172         {
    173             if(jobarr[current].arrtime<=jobarr[pre].finitime)  /*如果作业在上一个作业完成之前到达*/
    174             {
    175                 if(jobarr[j].arrtime<=jobarr[pre].finitime && jobarr[j].priority>jobarr[current].priority )
    176                     current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/
    177             }
    178             else /* 如果作业是在上一个作业完成之后到达*/
    179             {
    180                 if(jobarr[j].arrtime<jobarr[current].arrtime)
    181                         current=j;  /* 找出比较早到达的一个*/
    182                 if(jobarr[j].arrtime==jobarr[current].arrtime) /* 如果同时到达*/
    183                     if(jobarr[j].priority>jobarr[current].priority)
    184                         current=j; /*找出服务时间比较短的一个*/
    185             }
    186         }
    187     }
    188     return current;/*返回当前作业*/
    189 }
    190 void runing(int i, int times, int pre, int staTime, int endTime) {
    191     if(times==0)
    192     {
    193         jobarr[i].startime=jobarr[i].arrtime;
    194         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
    195         jobarr[i].TAtime=jobarr[i].reqtime;
    196         jobarr[i].TTAWtime=1.0;
    197         staTime=jobarr[i].startime;
    198     }else{
    199         if(jobarr[i].arrtime>jobarr[pre].finitime)
    200             jobarr[i].startime=jobarr[i].arrtime;
    201         else
    202             jobarr[i].startime=jobarr[pre].finitime;
    203         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
    204         jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
    205         jobarr[i].TTAWtime=float(jobarr[i].TAtime)/jobarr[i].reqtime;
    206     }
    207     if(times==intarr-1)
    208         endTime=jobarr[i].finitime;
    209     jobarr[i].finish=1;
    210 }
    211 void check( ) {
    212     int i;
    213     int staTime, endTime;
    214     int current=0, times=0, pre=0;   jobarr[pre].finitime=0;
    215     jobarr[pre].finitime=0;
    216     for(i=0; i<intarr; i++)
    217     {
    218         jobarr[i].finish=0;
    219     } 
    220     for(times=0; times<intarr; times++)
    221     {
    222         current=HRN(pre);
    223         runing(current, times, pre, staTime, endTime);
    224         pre=current;
    225     }
    226 }  
    227 /*
    228     最高响应比优先  结束
    229   */
    230 
    231 /*--------------------------------------------------------------------------------------
    232     短作业优先  开始
    233     优先权 = 最短服务时间
    234   */
    235 void SJF(int n) {
    236     int i = 0;
    237     int arrfinish = 0;
    238     int finArrCount = 0;
    239     arrfinish = jobarr[i].arrtime + jobarr[i].reqtime;
    240     jobarr[i].finitime = arrfinish;
    241     jobarr[i].TAtime = arrfinish - jobarr[i].arrtime;
    242     jobarr[i].TTAWtime = jobarr[i].TAtime/jobarr[i].reqtime;
    243     n = DeleteTheUsedJobById(jobarr[i], n);
    244     while(n) {
    245         //得到jobfin数组元素个数
    246         finArrCount = FindTheShortarrtimejobarray(n, arrfinish);
    247         if(finArrCount == 0) {
    248             SortByarrtime(n, jobarr);
    249             if(arrfinish <= jobarr[i].arrtime)
    250                 arrfinish = jobarr[i].arrtime + jobarr[i].reqtime;
    251             else
    252                 arrfinish = arrfinish + jobarr[i].reqtime;
    253             jobarr[i].finitime = arrfinish;
    254             jobarr[i].TAtime = arrfinish - jobarr[i].arrtime;
    255             jobarr[i].TTAWtime = jobarr[i].TAtime/jobarr[i].reqtime;
    256             n = DeleteTheUsedJobById(jobarr[i], n);
    257             continue;
    258         }
    259         while(finArrCount) {
    260             arrfinish = arrfinish + jobfin[i].reqtime;
    261             jobfin[i].finitime = arrfinish;
    262             jobfin[i].TAtime = arrfinish - jobfin[i].arrtime;
    263             jobfin[i].TTAWtime = jobfin[i].TAtime/jobfin[i].reqtime;
    264             for(int j=0; j < n; j++) {
    265                 if(strcmp(jobfin[i].name,jobarr[j].name) == 0) {
    266                     jobarr[j] = jobfin[i];
    267                 }
    268             }
    269             n = DeleteTheUsedJobById(jobfin[i], n);
    270             i++;
    271             finArrCount--;
    272         }
    273         i=0;
    274     }
    275 }
    276 //组织服务时间最短的作业数组
    277 int FindTheShortarrtimejobarray(int n, int arrfinish) {
    278     jcb temp;
    279     int finArrCount = 0;
    280     temp = jobarr[0];
    281     for(int i=0; i < n; i++) {
    282         if(jobarr[i].arrtime <= arrfinish) {
    283             jobfin[finArrCount] = jobarr[i];
    284             finArrCount++;
    285         }
    286     }
    287     SortByreqtime(finArrCount, jobfin);
    288     return finArrCount;
    289 }
    290 //通过服务时间排序
    291 void SortByreqtime(int n, jcb temp1[24]) {
    292     int i, j;
    293     jcb temp;
    294     for (j = 0; j < n - 1; j++) {
    295         for (i = 0; i < n - 1 - j; i++)
    296         {
    297             if(temp1[i].reqtime > temp1[i + 1].reqtime)
    298             {
    299                 temp = temp1[i];
    300                 temp1[i] = temp1[i+1];
    301                 temp1[i+1] = temp;
    302             }
    303         }
    304     }
    305 }
    306 //通过id删除
    307 int DeleteTheUsedJobById(jcb idJob, int n) {
    308     jcb temp;
    309     for(int i=0; i < n; i++) {
    310         if(strcmp(idJob.name,jobarr[i].name) == 0)
    311             break;
    312     }
    313     for( ; i < n - 1; i++) {
    314         temp = jobarr[i];
    315         jobarr[i] = jobarr[i+1];
    316         jobarr[i+1] = temp;
    317     }
    318     return n-1; 
    319 }
    320 void SortByarrtime(int n, jcb temp[24]) {
    321     int i, j;
    322     jcb temp1;
    323     for (j = 0; j < n - 1; j++) {
    324         for (i = 0; i < n - 1 - j; i++)
    325         {
    326             if(temp[i].arrtime > temp[i + 1].arrtime)
    327             {
    328                 temp1 = temp[i];
    329                 temp[i] = temp[i+1];
    330                 temp[i+1] = temp1;
    331             }
    332         }
    333     }
    334 }
    335 /*
    336     短作业优先  结束
    337   */
    338 
    339 /*
    340     向jobarr输入一个作业
    341 */
    342 void intputjobarr(){
    343     printf("
    第 %d 个作业:
    ",intarr+1);
    344     printf("	输入作业名:");
    345     scanf("%s",&jobarr[intarr].name);
    346     printf("	到达时间:");
    347     scanf("%d",&jobarr[intarr].arrtime);
    348     printf("	要求服务时间:");
    349     scanf("%d",&jobarr[intarr].reqtime);
    350     intarr++;
    351 }
    352 /*
    353     输出所有作业信息    
    354 */
    355 void putoutAlljobarr(){
    356     system("cls");    
    357     printf("
    ----------------------------------------------------------------------------
    
    ");
    358     printf("    作业名    到达时间    要求服务时间    调度时间    完成时间    周转时间    带权周转时间
    ");
    359     for(int i=0;i<intarr;i++){
    360         printf("    %6s    %8d    %12d    %8d    %8d    %8d    %8d
    ",jobarr[i].name,jobarr[i].arrtime,jobarr[i].reqtime,jobarr[i].startime,jobarr[i].finitime,jobarr[i].TAtime,jobarr[i].TTAWtime);
    361     }    
    362     int sumTAtime=0.0, sumTTAWtime=0.0, aveTAtime, aveTTAWtime;
    363     for(i=0; i<intarr; i++)
    364     {
    365         sumTAtime+=jobarr[i].TAtime;
    366         sumTTAWtime+=jobarr[i].TTAWtime;
    367     }
    368     aveTAtime=sumTAtime/intarr;  aveTTAWtime=sumTTAWtime/intarr;
    369     printf("
    ( 服务时间和 : 平均带权周转时间 : 平均带权周转时间 )    %5d%5d%5d
    ",sumTAtime,aveTAtime,aveTTAWtime);     
    370     printf("
    ----------------------------------------------------------------------------
    
    
    ");
    371     
    372     system("pause");
    373 }
  • 相关阅读:
    What's New In Python 3.X
    CSS Transform Style
    Build Laravel Blog PigJian by PHP7 and Nginx on Ubuntu
    常见算法之2---排序数组中和为给定值的两个数字
    常见算法之1---先序遍历二叉树
    常见算法之0---冒泡排序
    UVa 341
    UVa 558
    UVa 11747
    UVa 11631
  • 原文地址:https://www.cnblogs.com/huangmp1024/p/5426947.html
Copyright © 2020-2023  润新知