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

    实验二作业调度模拟程序

    一、目的和要求

    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

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

    5

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

    6

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

     

    五、       其他要求

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

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

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

    二、实验内容

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

    、实验环境

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

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

         单道FCFS算法:

            

      1 #include <stdio.h>
      2 #include <stdlib.h>  
      3 #include <conio.h>   
      4 #define getpch(type) (type*)malloc(sizeof(type))
      5 #define NULL 0
      6 int n;
      7 float T1=0,T2=0; 
      8 int times=0;  
      9 struct jcb      //作业控制块 
     10 {   
     11   char name[10];  //作业名 
     12   int reachtime;   //作业到达时间  
     13   int starttime;    //作业开始时间   
     14   int needtime;       //作业需要运行的时间  
     15   float super;       //作业的响应比  
     16   int finishtime;       //作业完成时间  
     17   float cycletime;       //作业周转时间   
     18   float cltime;           //作业带权周转时间  
     19   char state;            //作业状态  
     20   struct jcb *next;      //结构体指针 
     21 }*ready=NULL,*p,*q;  
     22 typedef struct jcb JCB; 
     23 void inize()       //初始化界面
     24 {
     25     printf("
    
    		*********************************************		
    "); 
     26     printf("				单道批处理作业调度系统
    ");  
     27     printf("		*********************************************		
    "); 
     28     printf("
    
    
    					文其马
    "); 
     29     printf("						作业调度程序
    
    ");  
     30     printf("
    
    
    		请按任意键进入主菜单:"); 
     31     getch();
     32 }
     33 void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列
     34 {
     35     int i;  
     36     printf("
    输入作业数:"); 
     37     scanf("%d",&n); 
     38     for(i=0;i<n;i++)     
     39     {          
     40         p=getpch(JCB);          
     41         printf("
    输入作业名:");         
     42         scanf("%s",p->name);         
     43         getch();
     44         p->reachtime=i;          
     45         printf("作业默认到达时间:%d",i);         
     46         printf("
    输入作业需运行时间:");         
     47         scanf("%d",&p->needtime);         
     48         p->state='W';         
     49         p->next=NULL;          
     50         if(ready==NULL)  
     51             ready=q=p;         
     52         else{              
     53             q->next=p;             
     54             q=p;             
     55         }     
     56     } 
     57 }
     58 void disp(JCB* q,int m) //显示作业运行后的周转时间及带权周转时间等 
     59 {
     60      if(m==3)             //显示高响应比算法调度作业后的运行情况 
     61      {    
     62          printf("
    作业%s正在运行,估计其运行情况:
    ",q->name);   
     63          printf("
     开始运行时刻 	 完成时刻 	 周转时间 	 带权周转时间 	相应比 
    ");     
     64          printf(" %d    	",q->starttime);     
     65          printf("           %d    	",q->finishtime);    
     66          printf(" %f    	",q->cycletime);    
     67          printf(" %f	",q->cltime);    
     68          printf(" %f
    ",q->super);   
     69          getch();     
     70      } 
     71      else      // 显示先来先服务,最短作业优先算法调度后作业的运行情况     
     72      {     
     73          printf("
    作业%s正在运行,估计其运行情况:
    ",q->name);   
     74          printf("
     开始运行时刻 	 完成时刻 	 周转时间 	 带权周转时间 
    ");     
     75          printf(" %d    	",q->starttime);     
     76          printf("           %d    	",q->finishtime);    
     77          printf(" %f    	",q->cycletime);    
     78          printf(" %f	",q->cltime);    
     79          getch();     
     80      } 
     81 }
     82 void running(JCB *p,int m)      //运行作业 
     83 {            
     84     if(p==ready)         //先将要运行的作业从队列中分离出来
     85     {
     86                          
     87         ready=p->next;                 
     88         p->next=NULL;             
     89     }             
     90     else
     91     {                  
     92         q=ready;                  
     93         while(q->next!=p)  
     94             q=q->next;                 
     95         q->next=p->next;            
     96     }        
     97     p->starttime=times;//计算作业运行后的完成时间,周转时间等等             
     98     p->state='R';              
     99     p->finishtime=p->starttime+p->needtime;              
    100     p->cycletime=(float)(p->finishtime-p->reachtime);             
    101     p->cltime=(float)(p->cycletime/p->needtime);             
    102     T1+=p->cycletime;             
    103     T2+=p->cltime;              
    104     disp(p,m);        //调用disp()函数,显示作业运行情况             
    105     times+=p->needtime;             
    106     p->state='F';          
    107     printf("
    %s 作业已完成!
    请按任意键继续...
    ",p->name);             
    108     free(p);          //释放运行后的作业             
    109     getch(); 
    110 } 
    111 void super()          //计算队列中作业的高响应比 
    112 {    
    113     JCB *padv;   
    114     padv=ready;  
    115     do{      
    116         if(padv->state=='W'&&padv->reachtime<=times)  
    117             padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime;      
    118         padv=padv->next;    
    119     }
    120     while(padv!=NULL); 
    121 }  
    122 void final()       //最后打印作业的平均周转时间,平均带权周转时间 
    123 {      
    124     float s,t;     
    125     t=T1/n;     
    126     s=T2/n;    
    127     getch();     
    128     printf("
    
    作业已经全部完成!");     
    129     printf("
    %d个作业的平均周转时间是:%f",n,t);    
    130     printf("
    %d个作业的平均带权周转时间是:%f
    
    
    ",n,s); 
    131 }
    132 void hrn(int m)      //高响应比算法 
    133 {    
    134     JCB *min;   
    135     int i,iden;   
    136     system("cls");   
    137     inital();    
    138     for(i=0;i<n;i++)     
    139     {          
    140         p=min=ready;
    141         iden=1;         
    142         super();         
    143         do{              
    144             if(p->state=='W'&&p->reachtime<=times)                 
    145                 if(iden)                     
    146                 {                          
    147                     min=p;
    148                     iden=0;                     
    149                 }                  
    150                 else if(p->super>min->super) 
    151                     min=p;             
    152                 p=p->next;         
    153         }while(p!=NULL);         
    154         if(iden)              
    155         {                
    156             i--;
    157             times++;                 
    158             if(times>1000)  
    159             {
    160                 printf("
    runtime is too long...error...");
    161                 getch();
    162             }             
    163         }         
    164         else             
    165         {               
    166             running(min,m);      //调用running()函数         
    167         }      
    168     }   //for      
    169 
    170     final();           //调用running()函数 
    171 } 
    172 void sjf(int m)      // 最短作业优先算法 
    173 {      
    174     JCB *min;     
    175     int i,iden;     
    176     system("cls");     
    177     inital();      
    178     for(i=0;i<n;i++) 
    179     {          
    180         p=min=ready;
    181         iden=1;         
    182         do{ 
    183             if(p->state=='W'&&p->reachtime<=times)                 
    184                 if(iden)
    185                 {                          
    186                     min=p;iden=0;                     
    187                 }                  
    188                 else if(p->needtime<min->needtime) min=p;             
    189             p=p->next;
    190             }
    191         while(p!=NULL);
    192                 if(iden) 
    193                 {             
    194                     i--;               
    195                     times++;     
    196                     if(times>100)
    197                     {
    198                         printf("
    runtime is too long...error");
    199                         getch();
    200                     }             
    201                 }         
    202                 else{              
    203                     running(min,m);      //调用running()函数         
    204                 }     
    205     }  //for     
    206     final();      //调用running()函数 
    207 }
    208 void fcfs(int m)     //先来先服务算法 
    209 {      
    210     int i,iden;     
    211     system("cls");     
    212     inital();      
    213     for(i=0;i<n;i++)         
    214     {             
    215         p=ready;
    216         iden=1;           
    217         do{                
    218             if(p->state=='W'&&p->reachtime<=times)  iden=0;               
    219             if(iden)p=p->next;              
    220         }while(p!=NULL&&iden);            
    221             if(iden)             
    222             {              
    223                 i--;               
    224                 printf("
    没有满足要求的进程,需等待");              
    225                 times++;               
    226                 if(times>100){printf("
    时间过长");
    227                 getch();
    228                 }             
    229             }         
    230             else{              
    231                 running(p,m);    //调用running()函数          
    232             }       
    233     }      
    234     final();        //调用running()函数 
    235 }
    236 void mune() 
    237 {   
    238     int m;    
    239     system("cls");  
    240     printf("
    
    		*********************************************		
    "); 
    241     printf("				作业调度主菜单
    ");  
    242     printf("		*********************************************		
    ");   
    243     printf("
    
    
    			1.先来先服务算法");  
    244     printf("
    			2.最短作业优先算法");  
    245     printf("
    			3.响应比高者优先算法");  
    246     printf("
    			0.退出程序");  
    247     printf("
    
    				选择算法:");  
    248     scanf("%d",&m); 
    249     switch(m)   
    250     {      
    251     case 1:       
    252         fcfs(m);       
    253         getch();         
    254         system("cls");        
    255         mune();       
    256         break;    
    257     case 2:       
    258         sjf(m);       
    259         getch();        
    260         system("cls");       
    261         mune();       
    262         break;    
    263     case 3:       
    264         hrn(m);       
    265         getch();         
    266         system("cls");      
    267         mune();       
    268         break;    
    269     case 0:       
    270         system("cls");      
    271         break;    
    272     default:       
    273         printf("选择错误,重新选择.");       
    274         getch();        
    275         system("cls");       
    276         mune();   
    277     } 
    278 }
    279 main()
    280 {
    281     mune();
    282     inize();
    283 }

  • 相关阅读:
    编译和安装在Windows上橡胶树 (Compiling and Installing Yate on Windows)
    Microsoft Sync Framework 2.1 可再发行程序包 Microsoft Sync Framework 1.0 SP1
    Kwickserver
    .net平台 基于 XMPP协议的即时消息服务端简单实现
    开源jabber(XMPP)架设内部即时通讯服务的解决方案
    www.mentalis.org/
    VM虚拟机ping不通局域网其他主机的解决办法
    VM Workstation的Unity Mode有什么用
    Office WORD EXCEL批量查找和替换技巧实例
    Visual Studio VS如何拷贝一个项目的窗体文件到另一个项目
  • 原文地址:https://www.cnblogs.com/wqma/p/5556554.html
Copyright © 2011-2022 走看看