陈志昊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 int status; 13 }t; 14 void fcf(t job[],int n) 15 { 16 int y,a,i,trick=0; 17 t jobtemp; 18 for(y=0;y<n;y++) 19 { 20 for(a=y+1;a<n;a++) 21 { 22 if(job[a].enter<job[y].enter) 23 { 24 strcpy(jobtemp.name,job[a].name); 25 strcpy(job[a].name,job[y].name); 26 strcpy(job[y].name,jobtemp.name); 27 jobtemp.enter=job[a].enter; 28 job[a].enter=job[y].enter; 29 job[y].enter=jobtemp.enter; 30 jobtemp.run=job[a].run; 31 job[a].run=job[y].run; 32 job[y].run=jobtemp.run; 33 } 34 } 35 } 36 for(y=0;y<n;y++) 37 { 38 if(job[y].enter<=trick) 39 job[y].start=trick; 40 else 41 job[y].start=job[y].enter; 42 trick=job[y].run+job[y].start; 43 job[y].finish=job[y].run+job[y].start; 44 job[y].total=job[y].finish-job[y].enter; 45 job[y].respond=(float)(job[y].total)/(float)(job[y].run); 46 } 47 printf("\n\nJesus! you've finished FCFS,congratulations!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 48 for(i=0;i<n;i++) 49 { 50 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); 51 } 52 } 53 void hrr(t job[],int n) 54 { 55 int i,s; 56 int now=0; 57 t jobtemp; 58 for(s=0;s<n;s++) 59 { 60 for(i=s+1;i<n;i++) 61 { 62 if((job[s].enter>job[i].enter)||((job[s].enter==job[i].enter)&&(job[s].run<job[i].run))) 63 { 64 strcpy(jobtemp.name,job[s].name); 65 strcpy(job[s].name,job[i].name); 66 strcpy(job[i].name,jobtemp.name); 67 jobtemp.enter=job[s].enter; 68 job[s].enter=job[i].enter; 69 job[i].enter=jobtemp.enter; 70 jobtemp.run=job[s].run; 71 job[s].run=job[i].run; 72 job[i].run=jobtemp.run; 73 } 74 } 75 } 76 for(s=0;s<n;s++) 77 { 78 if(job[s].enter<=now) 79 job[s].start=now; 80 else 81 job[s].start=job[s].enter; 82 now=job[s].start+job[s].run; 83 job[s].finish=now; 84 job[s].total=job[s].finish-job[s].enter; 85 job[s].respond=(float)(job[s].total)/(float)(job[s].run); 86 } 87 printf("\n\nGoddamn it! hrr complete,excellent job!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 88 for(i=0;i<n;i++) 89 { 90 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); 91 } 92 } 93 void secon(t job[],int n) 94 { 95 int d,s,i,now=0; 96 t jobtemp; 97 for(d=0;d<n;d++) 98 { 99 for(s=d+1;s<n;s++) 100 { 101 if(job[d].enter>=job[s].enter) 102 { 103 strcpy(jobtemp.name,job[d].name); 104 strcpy(job[d].name,job[s].name); 105 strcpy(job[s].name,jobtemp.name); 106 jobtemp.enter=job[d].enter; 107 job[d].enter=job[s].enter; 108 job[s].enter=jobtemp.enter; 109 jobtemp.run=job[d].run; 110 job[d].run=job[s].run; 111 job[s].run=jobtemp.run; 112 } 113 } 114 } 115 for(d=0;d<n;d++) 116 { 117 if(job[d].status==0) 118 { 119 if(job[d].enter>now) 120 now=job[d].enter; 121 for(s=d+1;s<n;s++) 122 { 123 if((job[s].status==0)&&(job[s].run<job[d].run)&&(job[s].enter<now)) 124 { 125 126 strcpy(jobtemp.name,job[d].name); 127 strcpy(job[d].name,job[s].name); 128 strcpy(job[s].name,jobtemp.name); 129 jobtemp.enter=job[d].enter; 130 job[d].enter=job[s].enter; 131 job[s].enter=jobtemp.enter; 132 jobtemp.run=job[d].run; 133 job[d].run=job[s].run; 134 job[s].run=jobtemp.run; 135 136 } 137 } 138 } 139 job[d].start=now; 140 job[d].finish=job[d].start+job[d].run; 141 job[d].total=job[d].finish-job[d].enter; 142 job[d].status=1; 143 now+=job[d].run; 144 job[d].respond=(float)(job[d].total)/(float)(job[d].run); 145 146 } 147 148 printf("\n\nJesus! you've finished SJF,well done!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 149 for(i=0;i<n;i++) 150 { 151 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); 152 } 153 } 154 main() 155 { 156 t job [J]; 157 int n,i,w; 158 printf("The copyright is mine-Tony Chan,do not be a copycat,thx!\n\n now just enjoy the fascinating C#project~~\n\n"); 159 printf("enter the quantity of the array: "); 160 scanf("%d",&n); 161 printf("please input na en run respectively :-) \n"); 162 for(i=0;i<n;i++) 163 { 164 printf("this is NO.%d\n",i+1); 165 scanf("%s",&job[i].name); 166 scanf("%d",&job[i].enter); 167 scanf("%d",&job[i].run); 168 job[i].status=0; 169 } 170 printf("Now you got %d job(s)\n",n); 171 printf("name\tenter\trun\n"); 172 for(i=0;i<n;i++) 173 { 174 printf("%s\t%d\t%d\n",job[i].name,job[i].enter,job[i].run); 175 } 176 do{ 177 printf("\n\nWhich methods you are eager to choose ? :-) \n 1.fcf 2.hrr 3.secon (pressing other number means quit)\n"); 178 scanf("%d",&w); 179 switch(w) 180 { 181 case 1: 182 fcf(job,n); 183 break; 184 case 2: 185 hrr(job,n); 186 break; 187 case 3: 188 secon(job,n); 189 break; 190 default: 191 w=0; 192 break; 193 } 194 }while(w); 195 }
4.运行结果及分析
初始化输入作业,然后进行调度.
先来先处理和最高响应比算法的实现. 最短处理时间优先法的运行.
四、 实验总结
这次实验是开学以来这门课程最难的实验,就我而言,非常有挑战性.但是我也是愿意接受挑战.
首先这实验基于进程调度的,因此单位时间内CPU只能调用一个作业。
其次我们要了解这3个方法的规则,还有分清具体的运算逻辑。
总而言之这次实验难度较大,但是我受益匪浅。