陈志昊201306104104 物联网1301
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. 实验须检查,回答实验相关问题。
注:带**号的条目表示选做内容。
二、实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、实验环境
可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。
三、 实验方法、步骤及结果测试
1.源程序名winner.c
可执行程序名:winner.exe
2.原理分析及流程图
3.主要程序段及其解释:
1 #include<stdio.h> 2 #include<string.h> 3 #define J 100 4 typedef struct Tony{ 5 char name[50]; 6 int enter; //进入时间 7 int start; //开始时间 8 int run; //运行时间 9 int finish; //完成时间 10 int total; //周转时间 11 float respond; //响应比 12 }t; 13 void fcf(t job[],int n) //先来先执行方法 14 { 15 int y,a,i,trick=0; 16 t jobtemp; 17 for(y=0;y<n;y++) 18 { 19 for(a=y+1;a<n;a++) 20 { 21 if(job[a].enter<job[y].enter) 22 { 23 strcpy(jobtemp.name,job[a].name); 24 strcpy(job[a].name,job[y].name); 25 strcpy(job[y].name,jobtemp.name); 26 jobtemp.enter=job[a].enter; 27 job[a].enter=job[y].enter; 28 job[y].enter=jobtemp.enter; 29 jobtemp.run=job[a].run; 30 job[a].run=job[y].run; 31 job[y].run=jobtemp.run; 32 } 33 } 34 } 35 for(y=0;y<n;y++) 36 { 37 if(job[y].enter<=trick) 38 job[y].start=trick; 39 else 40 job[y].start=job[y].enter; 41 trick=job[y].run+job[y].start; 42 job[y].finish=job[y].run+job[y].start; 43 job[y].total=job[y].finish-job[y].enter; 44 job[y].respond=(float)(job[y].total)/(float)(job[y].run); 45 } 46 printf("\n\nJesus! you‘ve finished FCFS,congratulations!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 47 for(i=0;i<n;i++) 48 { 49 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 50 } 51 } 52 void hrr(t job[],int n) //最高响应比 53 { 54 int i,s; 55 int now=0; 56 t jobtemp; 57 for(s=0;s<n;s++) 58 { 59 for(i=s+1;i<n;i++) 60 { 61 if((job[s].enter>job[i].enter)||((job[s].enter==job[i].enter)&&(job[s].run<job[i].run))) 62 { 63 strcpy(jobtemp.name,job[s].name); 64 strcpy(job[s].name,job[i].name); 65 strcpy(job[i].name,jobtemp.name); 66 jobtemp.enter=job[s].enter; 67 job[s].enter=job[i].enter; 68 job[i].enter=jobtemp.enter; 69 jobtemp.run=job[s].run; 70 job[s].run=job[i].run; 71 job[i].run=jobtemp.run; 72 } 73 } 74 } 75 for(s=0;s<n;s++) 76 { 77 if(job[s].enter<=now) 78 job[s].start=now; 79 else 80 job[s].start=job[s].enter; 81 now=job[s].start+job[s].run; 82 job[s].finish=now; 83 job[s].total=job[s].finish-job[s].enter; 84 job[s].respond=(float)(job[s].total)/(float)(job[s].run); 85 } 86 printf("\n\nGoddamn it! hrr complete,excellent job!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 87 for(i=0;i<n;i++) 88 { 89 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 90 } 91 } 92 void secon(t job[],int n) //最短运行时间优先方法 93 { 94 int d,s,i,now=0; 95 t jobtemp; 96 for(d=0;d<n;d++) 97 { 98 for(s=d+1;s<n;s++) 99 { 100 if((job[d].run>=job[s].run)&&(job[d].enter>=job[s].enter)) 101 { 102 strcpy(jobtemp.name,job[d].name); 103 strcpy(job[d].name,job[s].name); 104 strcpy(job[s].name,jobtemp.name); 105 jobtemp.enter=job[d].enter; 106 job[d].enter=job[s].enter; 107 job[s].enter=jobtemp.enter; 108 jobtemp.run=job[d].run; 109 job[d].run=job[s].run; 110 job[s].run=jobtemp.run; 111 } 112 } 113 } 114 for(d=0;d<n;d++) 115 { 116 if(job[d].enter<=now) 117 job[d].start=now; 118 else 119 job[d].start=job[d].enter; 120 now=job[d].start+job[d].run; 121 job[d].finish=now; 122 job[d].total=job[d].finish-job[d].enter; 123 job[d].respond=(float)(job[d].total)/(float)(job[d].run); 124 } 125 printf("\n\nJesus! you‘ve finished SJF,well done!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 126 for(i=0;i<n;i++) 127 { 128 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 129 } 130 } 131 main() 132 { 133 t job [J]; 134 int n,i,w; 135 printf("The copyright is mine-Tony Chan,do not be a copycat,thx!\n\n now just enjoy the fascinating C#project~~\n\n"); 136 printf("enter the quantity of the array: "); 137 scanf("%d",&n); 138 printf("please input na en run respectively :-) \n"); 139 for(i=0;i<n;i++) 140 { 141 printf("this is NO.%d\n",i+1); 142 scanf("%s",&job[i].name); 143 scanf("%d",&job[i].enter); 144 scanf("%d",&job[i].run); 145 } 146 printf("Now you got %d job(s)\n",n); 147 printf("name\tenter\trun\n"); 148 for(i=0;i<n;i++) 149 { 150 printf("%s\t%d\t%d\n",job[i].name,job[i].enter,job[i].run); 151 } 152 do{ 153 printf("\n\nWhich methods you are eager to choose ? :-) \n 1.fcf 2.hrr 3.secon (pressing other number means quit)\n"); 154 scanf("%d",&w); 155 switch(w) 156 { 157 case 1: 158 fcf(job,n); 159 break; 160 case 2: 161 hrr(job,n); 162 break; 163 case 3: 164 secon(job,n); 165 break; 166 default: 167 w=0; 168 break; 169 } 170 }while(w); 171 }
4.运行结果及分析
初始化输入作业,然后进行调度.
先来先处理和最高响应比算法的实现. 最短处理时间优先法的运行.
四、 实验总结
这次实验是开学以来这门课程最难的实验,就我而言,非常有挑战性.但是我也是愿意接受挑战.
首先这实验基于进程调度的,因此单位时间内CPU只能调用一个作业。
其次我们要了解这3个方法的规则,还有分清