实验二、作业调度模拟程序实验
专业 商业软件工程 姓名 丘惠敏 学号 201406114203
一、 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、 实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名 job3.c
可执行程序名:job3.exe
2. 原理分析及流程图
主要通过数组和结构体存储各个作业信息,再用排序实现各个调度算法。
1 struct jcb{ 2 int id; 3 char status; 4 5 int arrtime; 6 int reqtime; 7 int startime; 8 int finitime; 9 10 float TAtime,TAWtime; 11 float prio; 12 } jobarr[24],jobfin[24],job[24];
3. 主要程序段及其解释:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 struct jcb{ 5 int id; 6 char status; 7 8 int arrtime; 9 int reqtime; 10 int startime; 11 int finitime; 12 13 float TAtime,TAWtime; 14 float prio; 15 } jobarr[24],jobfin[24],job[24]; 16 int systime=0; 17 //主菜单 18 void menu() 19 { 20 printf("***************************************\n"); 21 printf(" 1.调用文本写入数据\n"); 22 printf(" 2.调用伪随机数的产生数据\n"); 23 printf(" 3.调用自己输入模拟数据\n"); 24 printf("***************************************\n"); 25 } 26 //调度算法菜单 27 void menu0() 28 { 29 printf("\n***************************************\n"); 30 printf(" 1.FCFS算法调度\n"); 31 printf(" 2.SJF算法调度\n"); 32 printf(" 3.HRRF算法调度\n"); 33 printf(" 4.调用系统清屏\n"); 34 printf(" 0.退出算法调度\n"); 35 printf("***************************************\n"); 36 } 37 //短作业优先排序 38 void sort(int n) 39 { 40 int i,j; 41 struct jcb temp; 42 for(i=2;i<n;i++) 43 for(j=i+1;j<=n;j++) 44 if(jobarr[i].reqtime>jobarr[j].reqtime) //根据最短的要求服务时间排序 45 { 46 temp=jobarr[i]; 47 jobarr[i]=jobarr[j]; 48 jobarr[j]=temp; 49 } 50 } 51 //先到先服务排序 52 void sort0(int n) 53 { 54 int i,j; 55 struct jcb temp; 56 for(i=2;i<n;i++) 57 for(j=i+1;j<=n;j++) 58 if(job[i].arrtime>job[j].arrtime) //根据到达时间排序 59 { 60 temp=job[i]; 61 job[i]=job[j]; 62 job[j]=temp; 63 } 64 } 65 //自己输入模拟数据 66 void shoushu() 67 { 68 int n; 69 printf("作业个数:"); 70 scanf("%d",&n); 71 for(int i=1;i<=n;i++) 72 { 73 printf("\n第%d个作业:",i+1); 74 printf("\n输入id:"); 75 scanf("%d",&job[i].id); 76 printf("到达时间:"); 77 scanf("%d",&job[i].arrtime); 78 printf("要求服务时间:"); 79 scanf("%d",&job[i].reqtime); 80 jobarr[i]=job[i]; 81 } 82 } 83 //文本写入数据 84 int ReadFile() 85 { 86 int m=0; 87 int i=1; 88 FILE *fp; //定义文件指针 89 fp=fopen("4.txt","r"); //打开文件 90 if(fp==NULL) 91 { 92 printf("File open error !\n"); 93 exit(0); 94 } 95 printf("\n id 作业到达时间 作业运行所需要时间\n"); 96 while(!feof(fp)) 97 { 98 fscanf(fp,"%d%d%d",&job[i].id,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读入 99 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); //输出到屏幕 100 i++; 101 }; 102 103 if(fclose(fp)) //关闭文件 104 { 105 printf("Can not close the file !\n"); 106 exit(0); 107 } 108 m=i-1; 109 return m; 110 111 } 112 //伪随机数的产生数据 113 int Pseudo_random_number() 114 { 115 int i,n; 116 srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 117 //输入作业数 118 n=rand()%23+5; 119 for(i=1; i<=n; i++) 120 { 121 job[i].id=i; 122 //作业到达时间 123 job[i].arrtime=rand()%29+1; 124 //作业运行时间 125 job[i].reqtime=rand()%7+1; 126 } 127 printf("\n id 作业到达时间 作业运行所需要时间\n"); 128 for(i=1; i<=n; i++) 129 { 130 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); 131 } 132 return n; 133 134 } 135 //先来先服务算法FCFS 136 void FCFS() 137 { 138 int i=1,j=1; 139 float sumTA=0,sumTAW=0; 140 printf("-----------先来先服务算法FCFS-------------\n"); 141 printf("\n id 作业到达时间 作业运行所需要时间\n"); 142 while(job[j].id!=NULL) 143 { 144 printf("\n%3d%12d%15d",job[j].id,job[j].arrtime,job[j].reqtime); //输出到屏幕 145 j++; 146 } 147 sort0(j-1); 148 printf("\n\n id 作业到达时间 作业完成时间 运行时间 作业周转时间 带权作业周转时间\n"); 149 while(job[i].id!=NULL) 150 { 151 if(i==1) //第一个作业先到达,先被调度 152 { 153 job[i].startime=job[i].arrtime; 154 } 155 else //其他作业被调度 156 { 157 if(job[i-1].finitime>=job[i].arrtime) //如果上一个作业的完成时间大于下一个到达时间,则下一个开始时间为上一个作业的完成时间 158 job[i].startime=job[i-1].finitime; 159 else 160 job[i].startime=job[i].arrtime; //否则下一个开始时间即它的到达时间 161 } 162 job[i].finitime=job[i].startime+job[i].reqtime; //计算完成时间 163 job[i].TAtime=job[i].finitime-job[i].arrtime; //计算周转时间 164 job[i].TAWtime=job[i].TAtime/job[i].reqtime; //计算带权周转时间 165 sumTA+=job[i].TAtime; 166 sumTAW+=job[i].TAWtime; 167 printf("\n%3d%12d%13d%14d%12.0lf%14.2lf",job[i].id,job[i].arrtime,job[i].finitime,job[i].reqtime,job[i].TAtime,job[i].TAWtime); 168 i++; 169 } 170 printf("\n平均作业周转时间= %.2lf",sumTA/(i-1)); 171 printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1)); 172 } 173 //最短作业优先算法SJF 174 void SJF() 175 { 176 int i=1,j=1; 177 float sumTA=0,sumTAW=0; 178 printf("-----------最短作业优先算法SJF-------------\n"); 179 printf("\n id 作业到达时间 作业运行所需要时间\n"); 180 while(job[j].id!=NULL) 181 { 182 printf("\n%3d%12d%15d",job[j].id,job[j].arrtime,job[j].reqtime); //输出到屏幕 183 jobarr[j]=job[j]; 184 j++; 185 } 186 sort(j-1); 187 printf("\n\n id 作业到达时间 作业完成时间 运行时间 作业周转时间 带权作业周转时间\n"); 188 while(jobarr[i].id!=NULL) 189 { 190 if(i==1) 191 { 192 jobarr[i].startime=jobarr[i].arrtime; 193 } 194 else 195 { 196 if(jobarr[i-1].finitime>=jobarr[i].arrtime) 197 jobarr[i].startime=jobarr[i-1].finitime; 198 else 199 jobarr[i].startime=jobarr[i].arrtime; 200 } 201 jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime; 202 jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime; 203 jobarr[i].TAWtime=jobarr[i].TAtime/jobarr[i].reqtime; 204 sumTA+=jobarr[i].TAtime; 205 sumTAW+=jobarr[i].TAWtime; 206 printf("\n%3d%12d%13d%14d%12.0lf%14.2lf",jobarr[i].id,jobarr[i].arrtime,jobarr[i].finitime,jobarr[i].reqtime,jobarr[i].TAtime,jobarr[i].TAWtime); 207 i++; 208 } 209 printf("\n平均作业周转时间= %.2lf",sumTA/(i-1)); 210 printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1)); 211 } 212 //最高响应比排序 213 void sort1(int n,int k) 214 { 215 int i,j; 216 struct jcb temp; 217 for(i=k;i<n;i++) 218 for(j=i+1;j<=n;j++) 219 if(jobfin[i].prio<jobfin[j].prio) 220 { 221 temp=jobfin[i]; 222 jobfin[i]=jobfin[j]; 223 jobfin[j]=temp; 224 } 225 } 226 //响应比最高者优先HRRF算法 227 void HRRF() 228 { 229 int i=1,j=1,k=1; 230 float sumTA=0,sumTAW=0; 231 printf("-----------响应比最高者优先HRRF算法-------------\n"); 232 printf("\n id 作业到达时间 作业运行所需要时间\n"); 233 while(job[j].id!=NULL) 234 { 235 printf("%3d%12d%15d\n",job[j].id,job[j].arrtime,job[j].reqtime); //输出到屏幕 236 jobfin[j]=job[j]; 237 j++; 238 } 239 while(jobfin[k].id!=NULL) 240 { 241 i=k; 242 if(k==1) 243 { 244 jobfin[i].startime=jobfin[i].arrtime; 245 jobfin[i].finitime=jobfin[i].startime+jobfin[i].reqtime; 246 jobfin[i].TAtime=jobfin[i].finitime-jobfin[i].arrtime; 247 jobfin[i].TAWtime=jobfin[i].TAtime/jobfin[i].reqtime; 248 } 249 else 250 { 251 printf("\nid 最高响应比\n"); 252 while(jobfin[i].id!=NULL) 253 { 254 if(jobfin[k-1].finitime>=job[i].arrtime) 255 { 256 jobfin[i].startime=jobfin[k-1].finitime; 257 jobfin[i].prio=(jobfin[i].startime-jobfin[i].arrtime)/(jobfin[i].reqtime/1.0)+1; 258 } 259 else 260 { 261 jobfin[i].startime=0; 262 jobfin[i].prio=0; 263 } 264 i++; 265 } 266 sort1(j-1,k); 267 for(i=k;i<j;i++) 268 printf("%3d%10.2lf\n",jobfin[i].id,jobfin[i].prio); 269 jobfin[k].finitime=jobfin[k-1].finitime+jobfin[k].reqtime; 270 jobfin[k].TAtime=jobfin[k].finitime-jobfin[k].arrtime; 271 jobfin[k].TAWtime=jobfin[k].TAtime/jobfin[k].reqtime; 272 } 273 k++; 274 } 275 printf("\n\n id 作业到达时间 作业完成时间 运行时间 作业周转时间 带权作业周转时间\n"); 276 for(i=1;i<j;i++) 277 { 278 printf("\n%3d%12d%13d%14d%12.0lf%14.2lf",jobfin[i].id,jobfin[i].arrtime,jobfin[i].finitime,jobfin[i].reqtime,jobfin[i].TAtime,jobfin[i].TAWtime); 279 sumTA+=jobfin[i].TAtime; 280 sumTAW+=jobfin[i].TAWtime; 281 } 282 printf("\n平均作业周转时间= %.2lf",sumTA/(i-1)); 283 printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1)); 284 } 285 void main0() 286 { 287 int tmp; 288 while(1) 289 { 290 menu0(); 291 printf("\n请选择菜单项:"); 292 scanf("%d",&tmp); 293 switch (tmp) 294 { 295 case 1: 296 FCFS(); 297 break; 298 case 2: 299 SJF(); 300 break; 301 case 3: 302 HRRF(); 303 break; 304 case 4: 305 system("cls"); 306 break; 307 case 0: 308 return; 309 } 310 } 311 } 312 main() 313 { 314 int tmp; 315 while(1) 316 { 317 menu(); 318 printf("\n请选择菜单项:"); 319 scanf("%d",&tmp); 320 switch (tmp) 321 { 322 case 1: 323 ReadFile(); 324 break; 325 case 2: 326 Pseudo_random_number(); 327 break; 328 case 3: 329 shoushu(); 330 break; 331 } 332 main0(); 333 printf("\n"); 334 } 335 }
4. 运行结果及分析
文本写入数据 伪随机数的产生数据
自己输入模拟数据
FCFS算法调度
SJF算法调度
HRRF算法调度
四、 实验总结
一开始看到老师展示这个实验时,我觉得这是一个很难的实验,即使给我一周也做不完。但是跟着老师的步骤一步一步来,我在一周内把这个实验基本完成了。有时候看起来不可能的任务,被拆解成多部分,在一步一步来完成,我们也能达到我们的目标。
时间: 2024-12-16 10:18:26