实验三 进程调度模拟程序
实验三 进程调度模拟程序
1. 目的和要求
1.1. 实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
1.2. 实验要求
1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序。
进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。
(1). 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
(2). 进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。
(3). 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。
(4). 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
(5). 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。
(6). 每进行一次调度程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。
(7). 重复以上过程,直到所要进程都完成为止。
思考:作业调度与进程调度的不同?
1.2.2实验题A:编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N(N不小于5)个进程进行调度。
“最高优先级优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
(1). 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
(2). 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定规则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1,并且进程等待的时间超过某一时限(2个时间片时间)时增加其优先数等。
(3). (**)进程的优先数及需要的运行时间可以事先人为地指定,(也可以由随机数产生)。
(4). (**)在进行模拟调度过程可以创建(增加)进程,其到达时间为进程输入的时间。
0.
1.2.3实验题B:编写并调试一个模拟的进程调度程序,采用“基于时间片轮转法”调度算法对N(N不小于5)个进程进行调度。 “轮转法”有简单轮转法、多级反馈队列调度算法。
(1). 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片长度相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。(此调度算法是否有优先级?)
(2). 多级反馈队列调度算法的基本思想是:
将就绪队列分为N级(N=3~5),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。
系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。
当进程第一次就绪时,进入第一级队列。
(3). (**)考虑进程的阻塞状态B(Blocked)增加阻塞队列。进程的是否阻塞和阻塞的时间由产生的“随机数”确定(阻塞的频率和时间长度要较为合理)。注意进程只有处于运行状态才可能转换成阻塞状态,进程只有处于就绪状态才可以转换成运行状态。
2. 实验内容
根据指定的实验课题:A(1),A(2),B(1)和B(2)
完成设计、编码和调试工作,完成实验报告。
注:带**号的条目表示选做内容。
3. 实验环境
可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。
4. 实验原理及核心算法参考程序段
动态优先数(优先数只减不加):
1 #include<sdio.h> 2 #include<string.h> 3 void shuru(); 4 void readfiles(); 5 void ran(); 6 void sort(int choose);//1为到达时间排序,2为服务时间排序,3为HRRF排序,4为优先级排序 7 void FinishProcess(); 8 typedef struct Process 9 { 10 char name[10]; 11 char status; //状态:开始s,等待d,就绪j 12 int id; 13 int arrtime; //到达时间 14 int reqtime; //要求服务时间 15 int startime; //开始时间 16 int finitime; //完成时间 17 int dotime; //已经工作时间 18 19 float TAtime,TAWtime; //周转时间、带权周转时间 20 float prio; //优先级 21 float HRRF; //响应比 22 23 }Process; 24 25 26 Process Processes[100]; //最多100个作业 27 int systime=0,bfsum,add,del; 28 int intarr,infin,intjob,sumProcess; 29 char T='A'; //T的默认值是A 30 31 void RunProcess() 32 { 33 int i=1; 34 sort(4);//按prio排序 35 printf("\n————开始运行————\n"); 36 for(i=1;i<=sumProcess;i++) 37 { 38 printf("\n\tProcess %s\t%f\n",Processes[i].name,Processes[i].prio); 39 } 40 Processes[1].dotime++; 41 if(Processes[1].dotime==Processes[1].reqtime) 42 { 43 FinishProcess(); 44 } 45 Processes[1].prio--; 46 } 47 48 void FinishProcess() 49 { 50 int i,j; 51 Process temp; 52 for(i=1;i<=sumProcess;i++) 53 { 54 j=i-1; 55 strcpy(temp.name,Processes[i].name); 56 temp.status=Processes[i].status; 57 temp.arrtime=Processes[i].arrtime; 58 temp.reqtime=Processes[i].reqtime; 59 temp.startime=Processes[i].startime; 60 temp.finitime=Processes[i].finitime; 61 temp.TAtime=Processes[i].TAtime; 62 temp.TAWtime=Processes[i].TAWtime; 63 temp.prio=Processes[i].prio; 64 temp.id=Processes[i].id; 65 temp.HRRF=Processes[i].HRRF; 66 temp.dotime=Processes[i].dotime; 67 68 strcpy(Processes[i].name,Processes[j].name); 69 Processes[i].status=Processes[j].status; 70 Processes[i].arrtime=Processes[j].arrtime; 71 Processes[i].reqtime=Processes[j].reqtime; 72 Processes[i].startime=Processes[j].startime; 73 Processes[i].finitime=Processes[j].finitime; 74 Processes[i].TAtime=Processes[j].TAtime; 75 Processes[i].TAWtime=Processes[j].TAWtime; 76 Processes[i].prio=Processes[j].prio; 77 Processes[i].id=Processes[j].id; 78 Processes[i].HRRF=Processes[j].HRRF; 79 Processes[i].dotime=Processes[j].dotime; 80 81 strcpy(Processes[j].name,temp.name); 82 Processes[j].status=temp.status; 83 Processes[j].arrtime=temp.arrtime; 84 Processes[j].reqtime=temp.reqtime; 85 Processes[j].startime=temp.startime; 86 Processes[j].finitime=temp.finitime; 87 Processes[j].TAtime=temp.TAtime; 88 Processes[j].TAWtime=temp.TAWtime; 89 Processes[j].prio=temp.prio; 90 Processes[j].id=temp.id; 91 Processes[j].HRRF=temp.HRRF; 92 Processes[j].dotime=temp.dotime; 93 } 94 sumProcess--; 95 } 96 97 98 99 void sort(int choose) //排序 100 { 101 int i,j; 102 Process temp; 103 for(i=1;i<=sumProcess;i++) 104 { 105 for(j=i+1;j<=sumProcess;j++) 106 { 107 if(choose==1) 108 { 109 if(Processes[i].arrtime>Processes[j].arrtime) 110 { 111 strcpy(temp.name,Processes[i].name); 112 temp.status=Processes[i].status; 113 temp.arrtime=Processes[i].arrtime; 114 temp.reqtime=Processes[i].reqtime; 115 temp.startime=Processes[i].startime; 116 temp.finitime=Processes[i].finitime; 117 temp.TAtime=Processes[i].TAtime; 118 temp.TAWtime=Processes[i].TAWtime; 119 temp.prio=Processes[i].prio; 120 temp.id=Processes[i].id; 121 temp.HRRF=Processes[i].HRRF; 122 temp.dotime=Processes[i].dotime; 123 124 strcpy(Processes[i].name,Processes[j].name); 125 Processes[i].status=Processes[j].status; 126 Processes[i].arrtime=Processes[j].arrtime; 127 Processes[i].reqtime=Processes[j].reqtime; 128 Processes[i].startime=Processes[j].startime; 129 Processes[i].finitime=Processes[j].finitime; 130 Processes[i].TAtime=Processes[j].TAtime; 131 Processes[i].TAWtime=Processes[j].TAWtime; 132 Processes[i].prio=Processes[j].prio; 133 Processes[i].id=Processes[j].id; 134 Processes[i].HRRF=Processes[j].HRRF; 135 Processes[i].dotime=Processes[j].dotime; 136 137 strcpy(Processes[j].name,temp.name); 138 Processes[j].status=temp.status; 139 Processes[j].arrtime=temp.arrtime; 140 Processes[j].reqtime=temp.reqtime; 141 Processes[j].startime=temp.startime; 142 Processes[j].finitime=temp.finitime; 143 Processes[j].TAtime=temp.TAtime; 144 Processes[j].TAWtime=temp.TAWtime; 145 Processes[j].prio=temp.prio; 146 Processes[j].id=temp.id; 147 Processes[j].HRRF=temp.HRRF; 148 Processes[j].dotime=temp.dotime; 149 } 150 } 151 else if(choose==2) 152 { 153 if(Processes[i].reqtime>Processes[j].reqtime) 154 { 155 strcpy(temp.name,Processes[i].name); 156 temp.status=Processes[i].status; 157 temp.arrtime=Processes[i].arrtime; 158 temp.reqtime=Processes[i].reqtime; 159 temp.startime=Processes[i].startime; 160 temp.finitime=Processes[i].finitime; 161 temp.TAtime=Processes[i].TAtime; 162 temp.TAWtime=Processes[i].TAWtime; 163 temp.prio=Processes[i].prio; 164 temp.id=Processes[i].id; 165 temp.HRRF=Processes[i].HRRF; 166 temp.dotime=Processes[i].dotime; 167 168 strcpy(Processes[i].name,Processes[j].name); 169 Processes[i].status=Processes[j].status; 170 Processes[i].arrtime=Processes[j].arrtime; 171 Processes[i].reqtime=Processes[j].reqtime; 172 Processes[i].startime=Processes[j].startime; 173 Processes[i].finitime=Processes[j].finitime; 174 Processes[i].TAtime=Processes[j].TAtime; 175 Processes[i].TAWtime=Processes[j].TAWtime; 176 Processes[i].prio=Processes[j].prio; 177 Processes[i].id=Processes[j].id; 178 Processes[i].HRRF=Processes[j].HRRF; 179 Processes[i].dotime=Processes[j].dotime; 180 181 strcpy(Processes[j].name,temp.name); 182 Processes[j].status=temp.status; 183 Processes[j].arrtime=temp.arrtime; 184 Processes[j].reqtime=temp.reqtime; 185 Processes[j].startime=temp.startime; 186 Processes[j].finitime=temp.finitime; 187 Processes[j].TAtime=temp.TAtime; 188 Processes[j].TAWtime=temp.TAWtime; 189 Processes[j].prio=temp.prio; 190 Processes[j].id=temp.id; 191 Processes[j].HRRF=temp.HRRF; 192 Processes[j].dotime=temp.dotime; 193 } 194 } 195 else if(choose==3) 196 { 197 if(Processes[i].HRRF<Processes[j].HRRF) 198 { 199 strcpy(temp.name,Processes[i].name); 200 temp.status=Processes[i].status; 201 temp.arrtime=Processes[i].arrtime; 202 temp.reqtime=Processes[i].reqtime; 203 temp.startime=Processes[i].startime; 204 temp.finitime=Processes[i].finitime; 205 temp.TAtime=Processes[i].TAtime; 206 temp.TAWtime=Processes[i].TAWtime; 207 temp.prio=Processes[i].prio; 208 temp.id=Processes[i].id; 209 temp.HRRF=Processes[i].HRRF; 210 temp.dotime=Processes[i].dotime; 211 212 strcpy(Processes[i].name,Processes[j].name); 213 Processes[i].status=Processes[j].status; 214 Processes[i].arrtime=Processes[j].arrtime; 215 Processes[i].reqtime=Processes[j].reqtime; 216 Processes[i].startime=Processes[j].startime; 217 Processes[i].finitime=Processes[j].finitime; 218 Processes[i].TAtime=Processes[j].TAtime; 219 Processes[i].TAWtime=Processes[j].TAWtime; 220 Processes[i].prio=Processes[j].prio; 221 Processes[i].id=Processes[j].id; 222 Processes[i].HRRF=Processes[j].HRRF; 223 Processes[i].dotime=Processes[j].dotime; 224 225 strcpy(Processes[j].name,temp.name); 226 Processes[j].status=temp.status; 227 Processes[j].arrtime=temp.arrtime; 228 Processes[j].reqtime=temp.reqtime; 229 Processes[j].startime=temp.startime; 230 Processes[j].finitime=temp.finitime; 231 Processes[j].TAtime=temp.TAtime; 232 Processes[j].TAWtime=temp.TAWtime; 233 Processes[j].prio=temp.prio; 234 Processes[j].id=temp.id; 235 Processes[j].HRRF=temp.HRRF; 236 Processes[j].dotime=temp.dotime; 237 } 238 } 239 else if(choose==4) 240 { 241 if(Processes[i].prio<Processes[j].prio) 242 { 243 strcpy(temp.name,Processes[i].name); 244 temp.status=Processes[i].status; 245 temp.arrtime=Processes[i].arrtime; 246 temp.reqtime=Processes[i].reqtime; 247 temp.startime=Processes[i].startime; 248 temp.finitime=Processes[i].finitime; 249 temp.TAtime=Processes[i].TAtime; 250 temp.TAWtime=Processes[i].TAWtime; 251 temp.prio=Processes[i].prio; 252 temp.id=Processes[i].id; 253 temp.HRRF=Processes[i].HRRF; 254 temp.dotime=Processes[i].dotime; 255 256 strcpy(Processes[i].name,Processes[j].name); 257 Processes[i].status=Processes[j].status; 258 Processes[i].arrtime=Processes[j].arrtime; 259 Processes[i].reqtime=Processes[j].reqtime; 260 Processes[i].startime=Processes[j].startime; 261 Processes[i].finitime=Processes[j].finitime; 262 Processes[i].TAtime=Processes[j].TAtime; 263 Processes[i].TAWtime=Processes[j].TAWtime; 264 Processes[i].prio=Processes[j].prio; 265 Processes[i].id=Processes[j].id; 266 Processes[i].HRRF=Processes[j].HRRF; 267 Processes[i].dotime=Processes[j].dotime; 268 269 strcpy(Processes[j].name,temp.name); 270 Processes[j].status=temp.status; 271 Processes[j].arrtime=temp.arrtime; 272 Processes[j].reqtime=temp.reqtime; 273 Processes[j].startime=temp.startime; 274 Processes[j].finitime=temp.finitime; 275 Processes[j].TAtime=temp.TAtime; 276 Processes[j].TAWtime=temp.TAWtime; 277 Processes[j].prio=temp.prio; 278 Processes[j].id=temp.id; 279 Processes[j].HRRF=temp.HRRF; 280 Processes[j].dotime=temp.dotime; 281 } 282 } 283 else 284 printf("Error!\n"); 285 } 286 } 287 } 288 void ins() //插入 289 { 290 int i; 291 while(T!='E'&&T!='e') 292 { 293 printf("'I'nsert or 'D'elete or 'E'xit?\n"); 294 getchar(); 295 scanf("%c",&T); 296 if(T=='I'||T=='i') 297 { 298 printf("你想插入多少个作业?\n"); 299 scanf("%d",&add); 300 bfsum=sumProcess; 301 sumProcess=sumProcess+add; 302 for(i=bfsum+1;i<=sumProcess;i++) 303 { 304 printf("\n第%d个作业:\n",i); 305 getchar(); 306 printf("输入作业名:\n"); 307 gets(Processes[i].name); 308 printf("到达时间:\n"); 309 scanf("%d",&Processes[i].arrtime); 310 printf("要求服务时间:\n"); 311 scanf("%d",&Processes[i].reqtime); 312 } 313 } 314 else if(T=='D'||T=='d') 315 { 316 printf("你想删除第几组?"); 317 scanf("%d",&del); 318 for(i=del;i<=sumProcess-1;i++) 319 { 320 strcpy(Processes[i].name,Processes[i+1].name); 321 Processes[i].arrtime=Processes[i+1].arrtime; 322 Processes[i].reqtime=Processes[i+1].reqtime; 323 } 324 sumProcess--; 325 } 326 } 327 } 328 329 330 void printarr() //打印 331 { 332 int i; 333 printf("\t\tname\tartime\trqtime\n"); 334 for(i=1;i<=sumProcess;i++) 335 { 336 printf("N %d\t",i); 337 printf("\t%s",Processes[i].name); 338 printf("\t%d",Processes[i].arrtime); 339 printf("\t%d\n",Processes[i].reqtime); 340 } 341 printf("\t\t\t\t\t\t现在系统时间%d\n",systime); 342 343 } 344 void printz() 345 { 346 int i; 347 float sum1=0,sum2=0; //计算平均周转时间、平均带权周转时间 348 printf("\t\tname\tartime\trqtime\tstime\tftime\tTAtime\t\tTAWtime\n"); 349 for(i=1;i<=sumProcess;i++) 350 { 351 printf("N %d\t",i); 352 printf("\t%s",Processes[i].name); 353 printf("\t%d",Processes[i].arrtime); 354 printf("\t%d",Processes[i].reqtime); 355 printf("\t%d",Processes[i].startime); 356 printf("\t%d",Processes[i].finitime); 357 printf("\t%f",Processes[i].TAtime); 358 printf("\t%f\n",Processes[i].TAWtime); 359 } 360 for(i=1;i<=sumProcess;i++) 361 { 362 sum1=sum1+Processes[i].TAtime; 363 } 364 for(i=1;i<=sumProcess;i++) 365 { 366 sum2=sum2+Processes[i].TAWtime; 367 } 368 printf("\n平均周转时间=%f\n",sum1/sumProcess); 369 printf("\n平均带权周转时间=%f\n",sum2/sumProcess); 370 printf("\t\t\t\t\t\t现在系统时间%d\n",systime); 371 } 372 void sumofthey() 373 { 374 int i; 375 Processes[1].startime=Processes[1].arrtime; 376 Processes[1].finitime=Processes[1].arrtime+Processes[1].reqtime; 377 Processes[1].TAtime=(float)(Processes[1].finitime-Processes[1].arrtime); 378 Processes[1].TAWtime=(float)(Processes[1].TAtime/Processes[1].reqtime); 379 Processes[1].HRRF=(float)(Processes[1].TAtime/Processes[1].reqtime); 380 for(i=2;i<=sumProcess;i++) 381 { 382 Processes[i].startime=Processes[i-1].finitime; 383 Processes[i].finitime=Processes[i].startime+Processes[i].reqtime; 384 Processes[i].TAtime=(float)(Processes[i].finitime-Processes[i].arrtime); 385 Processes[i].TAWtime=(float)(Processes[i].TAtime/Processes[i].reqtime); 386 Processes[i].HRRF=(float)(Processes[i].TAtime/Processes[i].reqtime); 387 } 388 } 389 void startit() 390 { 391 int n; 392 printf("\n"); 393 printf("\t\t\t**************************\n"); 394 printf("\t\t\t**1.调用文本写入数据******\n"); 395 printf("\t\t\t**2.调用伪随机数产生数据**\n"); 396 printf("\t\t\t**3.调用自己输入模拟数据**\n"); 397 printf("\t\t\t**************************\n"); 398 scanf("%d",&n); 399 switch(n) 400 { 401 case 1: 402 readfiles(); 403 sumofthey(); 404 break; 405 case 2: 406 ran(); 407 sumofthey(); 408 break; 409 case 3: 410 shuru(); 411 sumofthey(); 412 break; 413 default: 414 { 415 printf("输入有误,请重新输入"); 416 break; 417 } 418 } 419 } 420 void ran() 421 { 422 int i; 423 srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 424 sumProcess=rand()%3+5; 425 for(i=1;i<=sumProcess;i++) 426 { 427 itoa(i,Processes[i].name,2); 428 429 Processes[i].arrtime=rand()%29+1; 430 431 Processes[i].reqtime=rand()%7+1; 432 433 Processes[i].prio=rand()%10+1; 434 } 435 printf("\n \tid \t作业到达时间 \t作业运行所需要时间 \t优先级\n"); 436 for(i=1; i<=sumProcess; i++) 437 { 438 printf("\n\t%s\t%12d\t%15d\t%25f",Processes[i].name,Processes[i].arrtime,Processes[i].reqtime,Processes[i].prio); 439 } 440 printf("\n"); 441 } 442 443 void readfiles() 444 { 445 char szTest[1000] = {0};int i=0,n; 446 FILE *fp=fopen("D:\\File1.txt","r"); 447 //FILE *fout=fopen("D:\\File2.txt","w"); 448 if(fp == NULL) 449 { 450 printf("ERROR!\n"); 451 exit(0); 452 } 453 //fscanf(fp,"Processesum=%d\n",%n); 454 while(!feof(fp)) 455 { 456 fscanf(fp,"%d%d%d",&Processes[i].id,&Processes[i].arrtime,&Processes[i].reqtime); //fscanf()函数将数据读入 457 printf("\n%3d%12d%15d\n",Processes[i].id,Processes[i].arrtime,Processes[i].reqtime); //输出到屏幕 458 itoa(Processes[i].id,Processes[i].name,10); 459 i++; 460 /*memset(szTest, 0, sizeof(szTest)); 461 fscanf(fp,"@id=%d|",&i); 462 fgets(fp,"name=%s|",Processes[i].name); 463 fscanf(fp,"arrtime=%d|reqtime=%d\n",&Processes[i].arrtime,&Processes[i].reqtime); 464 */ 465 //fscanf(fp,"%d",) 466 } 467 sumProcess=i; 468 fclose(fp); 469 } 470 void shuru() 471 { 472 int i; 473 printf("作业个数:\n"); 474 scanf("%d",&sumProcess); 475 for(i=1;i<=sumProcess;i++) 476 { 477 printf("\n第%d个作业:\n",i); 478 getchar(); 479 printf("输入作业名:\n"); 480 gets(Processes[i].name); 481 printf("到达时间:\n"); 482 scanf("%d",&Processes[i].arrtime); 483 printf("要求服务时间:\n"); 484 scanf("%d",&Processes[i].reqtime); 485 } 486 sumofthey(); 487 } 488 void choosesort() 489 { 490 int n; 491 printf("\t\t\t*****************************\n"); 492 printf("\t\t\t*******1.FCFS算法调度********\n"); 493 printf("\t\t\t*******2.SJF算法调度*********\n"); 494 printf("\t\t\t*******3.HRRF算法调度********\n"); 495 printf("\t\t\t*******4.调用系统清屏********\n"); 496 printf("\t\t\t*******5.退出算法调度********\n"); 497 printf("\t\t\t*****************************\n"); 498 scanf("%d",&n); 499 switch(n) 500 { 501 case 1: 502 printf("运行先来先服务算法FCFS\n"); 503 sort(1); 504 printf("\n经按到达时间排序后,未达到队列是\n"); 505 printz(); 506 break; 507 case 2: 508 printf("运行最短作业优先算法FJS\n"); 509 sort(2); 510 printf("\n经按到达时间排序后,未达到队列是\n"); 511 printz(); 512 break; 513 case 3: 514 printf("运行最高响应比优先算法HRRF\n"); 515 sort(3); 516 printf("\n经按到达时间排序后,未达到队列是\n"); 517 printz(); 518 break; 519 case 4: 520 system("cls"); 521 break; 522 case 5: 523 exit(0); 524 break; 525 } 526 } 527 void main() 528 { 529 startit(); 530 // choosesort(); 531 while(sumProcess!=0) 532 { 533 RunProcess(); 534 } 535 536 }
1 #include<stdio.h> 2 #include<string.h> 3 void shuru(); 4 void readfiles(); 5 void ran(); 6 void sort(int choose);//1为到达时间排序,2为服务时间排序,3为HRRF排序,4为优先级排序 7 void FinishProcess(); 8 typedef struct Process 9 { 10 char name[10]; 11 char status; //状态:开始s,等待d,就绪j 12 int id; 13 int arrtime; //到达时间 14 int reqtime; //要求服务时间 15 int startime; //开始时间 16 int finitime; //完成时间 17 int dotime; //已经工作时间 18 19 float TAtime,TAWtime; //周转时间、带权周转时间 20 float prio; //优先级 21 float HRRF; //响应比 22 23 }Process; 24 25 26 Process Processes[100]; //最多100个作业 27 int systime=0,bfsum,add,del; 28 int intarr,infin,intjob,sumProcess; 29 char T='A'; //T的默认值是A 30 31 void RunProcess() 32 { 33 int timeflag=0; 34 int timepiece=2; 35 int T; 36 int k; 37 char ch; 38 int i=1; 39 40 printf("\n请输入时间片:"); 41 scanf("%d",&T); 42 43 sort(1);//按FCFS排序 44 printf("\n————开始运行————\n"); 45 while(sumProcess>=0) 46 { 47 if(timeflag==T) 48 { 49 timeflag=0; 50 if(Processes[0].reqtime==0) 51 { 52 printf("————进程%s已完成————\n",Processes[0].name); 53 54 55 if(sumProcess!=0){ 56 sort(1); 57 printf("当前正在运行进程是:%s————\n",Processes[0].name); 58 } 59 if(sumProcess>=1) 60 for(k=1;k<sumProcess;k++) 61 printf("————进程%s正在等待————\n",Processes[k].name); 62 if(sumProcess==0){ 63 Processes[0].reqtime--; 64 sumProcess--; 65 } 66 } 67 else{ 68 sort(1); 69 if(sumProcess!=0){ 70 //sort(); 71 printf("当前正在运行进程是:%s————\n",Processes[0].name); 72 } 73 if(sumProcess>=1) 74 for(k=1;k<sumProcess;k++) 75 printf("————进程%s正在等待————\n",Processes[k].name); 76 } 77 } 78 else{ 79 if(Processes[0].reqtime==0) 80 { 81 printf("————进程%s已完成————\n",Processes[0].name); 82 if(sumProcess!=0){ 83 sort(1); 84 printf("————进程%s正在运行————\n",Processes[0].name); 85 } 86 if(sumProcess>=1) 87 for(k=1;k<sumProcess;k++) 88 printf("————进程%s正在等待————\n",Processes[k].name); 89 } 90 else{ 91 Processes[0].reqtime--; 92 if(sumProcess!=0) 93 printf("————进程%s正在运行————\n",Processes[0].name); 94 95 if(sumProcess>=1) 96 for(k=1;k<sumProcess;k++) 97 printf("————进程%s正在等待————\n",Processes[k].name); 98 } 99 } 100 timeflag++; 101 printf("\n 按任回车继续......"); 102 ch=getchar(); 103 ch=getchar(); 104 } 105 printf("\n\n 全部进程已经完成.\n"); 106 /* 107 for(i=1;i<=sumProcess;i++) 108 { 109 printf("\n\tProcess %s\t%f\n",Processes[i].name,Processes[i].prio); 110 } 111 Processes[1].dotime++; 112 if(Processes[1].dotime==Processes[1].reqtime) 113 { 114 FinishProcess(); 115 } 116 Processes[1].prio--;*/ 117 } 118 119 void FinishProcess() 120 { 121 int i,j; 122 Process temp; 123 for(i=1;i<=sumProcess;i++) 124 { 125 j=i-1; 126 strcpy(temp.name,Processes[i].name); 127 temp.status=Processes[i].status; 128 temp.arrtime=Processes[i].arrtime; 129 temp.reqtime=Processes[i].reqtime; 130 temp.startime=Processes[i].startime; 131 temp.finitime=Processes[i].finitime; 132 temp.TAtime=Processes[i].TAtime; 133 temp.TAWtime=Processes[i].TAWtime; 134 temp.prio=Processes[i].prio; 135 temp.id=Processes[i].id; 136 temp.HRRF=Processes[i].HRRF; 137 temp.dotime=Processes[i].dotime; 138 139 strcpy(Processes[i].name,Processes[j].name); 140 Processes[i].status=Processes[j].status; 141 Processes[i].arrtime=Processes[j].arrtime; 142 Processes[i].reqtime=Processes[j].reqtime; 143 Processes[i].startime=Processes[j].startime; 144 Processes[i].finitime=Processes[j].finitime; 145 Processes[i].TAtime=Processes[j].TAtime; 146 Processes[i].TAWtime=Processes[j].TAWtime; 147 Processes[i].prio=Processes[j].prio; 148 Processes[i].id=Processes[j].id; 149 Processes[i].HRRF=Processes[j].HRRF; 150 Processes[i].dotime=Processes[j].dotime; 151 152 strcpy(Processes[j].name,temp.name); 153 Processes[j].status=temp.status; 154 Processes[j].arrtime=temp.arrtime; 155 Processes[j].reqtime=temp.reqtime; 156 Processes[j].startime=temp.startime; 157 Processes[j].finitime=temp.finitime; 158 Processes[j].TAtime=temp.TAtime; 159 Processes[j].TAWtime=temp.TAWtime; 160 Processes[j].prio=temp.prio; 161 Processes[j].id=temp.id; 162 Processes[j].HRRF=temp.HRRF; 163 Processes[j].dotime=temp.dotime; 164 } 165 sumProcess--; 166 } 167 168 169 170 void sort(int choose) //排序 171 { 172 int i,j; 173 Process temp; 174 for(i=1;i<=sumProcess;i++) 175 { 176 for(j=i+1;j<=sumProcess;j++) 177 { 178 if(choose==1) 179 { 180 if(Processes[i].arrtime>Processes[j].arrtime) 181 { 182 strcpy(temp.name,Processes[i].name); 183 temp.status=Processes[i].status; 184 temp.arrtime=Processes[i].arrtime; 185 temp.reqtime=Processes[i].reqtime; 186 temp.startime=Processes[i].startime; 187 temp.finitime=Processes[i].finitime; 188 temp.TAtime=Processes[i].TAtime; 189 temp.TAWtime=Processes[i].TAWtime; 190 temp.prio=Processes[i].prio; 191 temp.id=Processes[i].id; 192 temp.HRRF=Processes[i].HRRF; 193 temp.dotime=Processes[i].dotime; 194 195 strcpy(Processes[i].name,Processes[j].name); 196 Processes[i].status=Processes[j].status; 197 Processes[i].arrtime=Processes[j].arrtime; 198 Processes[i].reqtime=Processes[j].reqtime; 199 Processes[i].startime=Processes[j].startime; 200 Processes[i].finitime=Processes[j].finitime; 201 Processes[i].TAtime=Processes[j].TAtime; 202 Processes[i].TAWtime=Processes[j].TAWtime; 203 Processes[i].prio=Processes[j].prio; 204 Processes[i].id=Processes[j].id; 205 Processes[i].HRRF=Processes[j].HRRF; 206 Processes[i].dotime=Processes[j].dotime; 207 208 strcpy(Processes[j].name,temp.name); 209 Processes[j].status=temp.status; 210 Processes[j].arrtime=temp.arrtime; 211 Processes[j].reqtime=temp.reqtime; 212 Processes[j].startime=temp.startime; 213 Processes[j].finitime=temp.finitime; 214 Processes[j].TAtime=temp.TAtime; 215 Processes[j].TAWtime=temp.TAWtime; 216 Processes[j].prio=temp.prio; 217 Processes[j].id=temp.id; 218 Processes[j].HRRF=temp.HRRF; 219 Processes[j].dotime=temp.dotime; 220 } 221 } 222 else if(choose==2) 223 { 224 if(Processes[i].reqtime>Processes[j].reqtime) 225 { 226 strcpy(temp.name,Processes[i].name); 227 temp.status=Processes[i].status; 228 temp.arrtime=Processes[i].arrtime; 229 temp.reqtime=Processes[i].reqtime; 230 temp.startime=Processes[i].startime; 231 temp.finitime=Processes[i].finitime; 232 temp.TAtime=Processes[i].TAtime; 233 temp.TAWtime=Processes[i].TAWtime; 234 temp.prio=Processes[i].prio; 235 temp.id=Processes[i].id; 236 temp.HRRF=Processes[i].HRRF; 237 temp.dotime=Processes[i].dotime; 238 239 strcpy(Processes[i].name,Processes[j].name); 240 Processes[i].status=Processes[j].status; 241 Processes[i].arrtime=Processes[j].arrtime; 242 Processes[i].reqtime=Processes[j].reqtime; 243 Processes[i].startime=Processes[j].startime; 244 Processes[i].finitime=Processes[j].finitime; 245 Processes[i].TAtime=Processes[j].TAtime; 246 Processes[i].TAWtime=Processes[j].TAWtime; 247 Processes[i].prio=Processes[j].prio; 248 Processes[i].id=Processes[j].id; 249 Processes[i].HRRF=Processes[j].HRRF; 250 Processes[i].dotime=Processes[j].dotime; 251 252 strcpy(Processes[j].name,temp.name); 253 Processes[j].status=temp.status; 254 Processes[j].arrtime=temp.arrtime; 255 Processes[j].reqtime=temp.reqtime; 256 Processes[j].startime=temp.startime; 257 Processes[j].finitime=temp.finitime; 258 Processes[j].TAtime=temp.TAtime; 259 Processes[j].TAWtime=temp.TAWtime; 260 Processes[j].prio=temp.prio; 261 Processes[j].id=temp.id; 262 Processes[j].HRRF=temp.HRRF; 263 Processes[j].dotime=temp.dotime; 264 } 265 } 266 else if(choose==3) 267 { 268 if(Processes[i].HRRF<Processes[j].HRRF) 269 { 270 strcpy(temp.name,Processes[i].name); 271 temp.status=Processes[i].status; 272 temp.arrtime=Processes[i].arrtime; 273 temp.reqtime=Processes[i].reqtime; 274 temp.startime=Processes[i].startime; 275 temp.finitime=Processes[i].finitime; 276 temp.TAtime=Processes[i].TAtime; 277 temp.TAWtime=Processes[i].TAWtime; 278 temp.prio=Processes[i].prio; 279 temp.id=Processes[i].id; 280 temp.HRRF=Processes[i].HRRF; 281 temp.dotime=Processes[i].dotime; 282 283 strcpy(Processes[i].name,Processes[j].name); 284 Processes[i].status=Processes[j].status; 285 Processes[i].arrtime=Processes[j].arrtime; 286 Processes[i].reqtime=Processes[j].reqtime; 287 Processes[i].startime=Processes[j].startime; 288 Processes[i].finitime=Processes[j].finitime; 289 Processes[i].TAtime=Processes[j].TAtime; 290 Processes[i].TAWtime=Processes[j].TAWtime; 291 Processes[i].prio=Processes[j].prio; 292 Processes[i].id=Processes[j].id; 293 Processes[i].HRRF=Processes[j].HRRF; 294 Processes[i].dotime=Processes[j].dotime; 295 296 strcpy(Processes[j].name,temp.name); 297 Processes[j].status=temp.status; 298 Processes[j].arrtime=temp.arrtime; 299 Processes[j].reqtime=temp.reqtime; 300 Processes[j].startime=temp.startime; 301 Processes[j].finitime=temp.finitime; 302 Processes[j].TAtime=temp.TAtime; 303 Processes[j].TAWtime=temp.TAWtime; 304 Processes[j].prio=temp.prio; 305 Processes[j].id=temp.id; 306 Processes[j].HRRF=temp.HRRF; 307 Processes[j].dotime=temp.dotime; 308 } 309 } 310 else if(choose==4) 311 { 312 if(Processes[i].prio<Processes[j].prio) 313 { 314 strcpy(temp.name,Processes[i].name); 315 temp.status=Processes[i].status; 316 temp.arrtime=Processes[i].arrtime; 317 temp.reqtime=Processes[i].reqtime; 318 temp.startime=Processes[i].startime; 319 temp.finitime=Processes[i].finitime; 320 temp.TAtime=Processes[i].TAtime; 321 temp.TAWtime=Processes[i].TAWtime; 322 temp.prio=Processes[i].prio; 323 temp.id=Processes[i].id; 324 temp.HRRF=Processes[i].HRRF; 325 temp.dotime=Processes[i].dotime; 326 327 strcpy(Processes[i].name,Processes[j].name); 328 Processes[i].status=Processes[j].status; 329 Processes[i].arrtime=Processes[j].arrtime; 330 Processes[i].reqtime=Processes[j].reqtime; 331 Processes[i].startime=Processes[j].startime; 332 Processes[i].finitime=Processes[j].finitime; 333 Processes[i].TAtime=Processes[j].TAtime; 334 Processes[i].TAWtime=Processes[j].TAWtime; 335 Processes[i].prio=Processes[j].prio; 336 Processes[i].id=Processes[j].id; 337 Processes[i].HRRF=Processes[j].HRRF; 338 Processes[i].dotime=Processes[j].dotime; 339 340 strcpy(Processes[j].name,temp.name); 341 Processes[j].status=temp.status; 342 Processes[j].arrtime=temp.arrtime; 343 Processes[j].reqtime=temp.reqtime; 344 Processes[j].startime=temp.startime; 345 Processes[j].finitime=temp.finitime; 346 Processes[j].TAtime=temp.TAtime; 347 Processes[j].TAWtime=temp.TAWtime; 348 Processes[j].prio=temp.prio; 349 Processes[j].id=temp.id; 350 Processes[j].HRRF=temp.HRRF; 351 Processes[j].dotime=temp.dotime; 352 } 353 } 354 else 355 printf("Error!\n"); 356 } 357 } 358 } 359 void ins() //插入 360 { 361 int i; 362 while(T!='E'&&T!='e') 363 { 364 printf("'I'nsert or 'D'elete or 'E'xit?\n"); 365 getchar(); 366 scanf("%c",&T); 367 if(T=='I'||T=='i') 368 { 369 printf("你想插入多少个作业?\n"); 370 scanf("%d",&add); 371 bfsum=sumProcess; 372 sumProcess=sumProcess+add; 373 for(i=bfsum+1;i<=sumProcess;i++) 374 { 375 printf("\n第%d个作业:\n",i); 376 getchar(); 377 printf("输入作业名:\n"); 378 gets(Processes[i].name); 379 printf("到达时间:\n"); 380 scanf("%d",&Processes[i].arrtime); 381 printf("要求服务时间:\n"); 382 scanf("%d",&Processes[i].reqtime); 383 } 384 } 385 else if(T=='D'||T=='d') 386 { 387 printf("你想删除第几组?"); 388 scanf("%d",&del); 389 for(i=del;i<=sumProcess-1;i++) 390 { 391 strcpy(Processes[i].name,Processes[i+1].name); 392 Processes[i].arrtime=Processes[i+1].arrtime; 393 Processes[i].reqtime=Processes[i+1].reqtime; 394 } 395 sumProcess--; 396 } 397 } 398 } 399 400 401 void printarr() //打印 402 { 403 int i; 404 printf("\t\tname\tartime\trqtime\n"); 405 for(i=1;i<=sumProcess;i++) 406 { 407 printf("N %d\t",i); 408 printf("\t%s",Processes[i].name); 409 printf("\t%d",Processes[i].arrtime); 410 printf("\t%d\n",Processes[i].reqtime); 411 } 412 printf("\t\t\t\t\t\t现在系统时间%d\n",systime); 413 414 } 415 void printz() 416 { 417 int i; 418 float sum1=0,sum2=0; //计算平均周转时间、平均带权周转时间 419 printf("\t\tname\tartime\trqtime\tstime\tftime\tTAtime\t\tTAWtime\n"); 420 for(i=1;i<=sumProcess;i++) 421 { 422 printf("N %d\t",i); 423 printf("\t%s",Processes[i].name); 424 printf("\t%d",Processes[i].arrtime); 425 printf("\t%d",Processes[i].reqtime); 426 printf("\t%d",Processes[i].startime); 427 printf("\t%d",Processes[i].finitime); 428 printf("\t%f",Processes[i].TAtime); 429 printf("\t%f\n",Processes[i].TAWtime); 430 } 431 for(i=1;i<=sumProcess;i++) 432 { 433 sum1=sum1+Processes[i].TAtime; 434 } 435 for(i=1;i<=sumProcess;i++) 436 { 437 sum2=sum2+Processes[i].TAWtime; 438 } 439 printf("\n平均周转时间=%f\n",sum1/sumProcess); 440 printf("\n平均带权周转时间=%f\n",sum2/sumProcess); 441 printf("\t\t\t\t\t\t现在系统时间%d\n",systime); 442 } 443 void sumofthey() 444 { 445 int i; 446 Processes[1].startime=Processes[1].arrtime; 447 Processes[1].finitime=Processes[1].arrtime+Processes[1].reqtime; 448 Processes[1].TAtime=(float)(Processes[1].finitime-Processes[1].arrtime); 449 Processes[1].TAWtime=(float)(Processes[1].TAtime/Processes[1].reqtime); 450 Processes[1].HRRF=(float)(Processes[1].TAtime/Processes[1].reqtime); 451 for(i=2;i<=sumProcess;i++) 452 { 453 Processes[i].startime=Processes[i-1].finitime; 454 Processes[i].finitime=Processes[i].startime+Processes[i].reqtime; 455 Processes[i].TAtime=(float)(Processes[i].finitime-Processes[i].arrtime); 456 Processes[i].TAWtime=(float)(Processes[i].TAtime/Processes[i].reqtime); 457 Processes[i].HRRF=(float)(Processes[i].TAtime/Processes[i].reqtime); 458 } 459 } 460 void startit() 461 { 462 int n; 463 printf("\n"); 464 printf("\t\t\t**************************\n"); 465 printf("\t\t\t**1.调用文本写入数据******\n"); 466 printf("\t\t\t**2.调用伪随机数产生数据**\n"); 467 printf("\t\t\t**3.调用自己输入模拟数据**\n"); 468 printf("\t\t\t**************************\n"); 469 scanf("%d",&n); 470 switch(n) 471 { 472 case 1: 473 readfiles(); 474 sumofthey(); 475 break; 476 case 2: 477 ran(); 478 sumofthey(); 479 break; 480 case 3: 481 shuru(); 482 sumofthey(); 483 break; 484 default: 485 { 486 printf("输入有误,请重新输入"); 487 break; 488 } 489 } 490 } 491 void ran() 492 { 493 int i; 494 srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 495 sumProcess=rand()%3+5; 496 for(i=1;i<=sumProcess;i++) 497 { 498 itoa(i,Processes[i].name,2); 499 500 Processes[i].arrtime=rand()%29+1; 501 502 Processes[i].reqtime=rand()%7+1; 503 504 Processes[i].prio=rand()%10+1; 505 } 506 printf("\n \tid \t作业到达时间 \t作业运行所需要时间 \t优先级\n"); 507 for(i=1; i<=sumProcess; i++) 508 { 509 printf("\n\t%s\t%12d\t%15d\t%25f",Processes[i].name,Processes[i].arrtime,Processes[i].reqtime,Processes[i].prio); 510 } 511 printf("\n"); 512 } 513 514 void readfiles() 515 { 516 char szTest[1000] = {0};int i=0,n; 517 FILE *fp=fopen("D:\\File1.txt","r"); 518 //FILE *fout=fopen("D:\\File2.txt","w"); 519 if(fp == NULL) 520 { 521 printf("ERROR!\n"); 522 exit(0); 523 } 524 //fscanf(fp,"Processesum=%d\n",%n); 525 while(!feof(fp)) 526 { 527 fscanf(fp,"%d%d%d",&Processes[i].id,&Processes[i].arrtime,&Processes[i].reqtime); //fscanf()函数将数据读入 528 printf("\n%3d%12d%15d\n",Processes[i].id,Processes[i].arrtime,Processes[i].reqtime); //输出到屏幕 529 itoa(Processes[i].id,Processes[i].name,10); 530 i++; 531 /*memset(szTest, 0, sizeof(szTest)); 532 fscanf(fp,"@id=%d|",&i); 533 fgets(fp,"name=%s|",Processes[i].name); 534 fscanf(fp,"arrtime=%d|reqtime=%d\n",&Processes[i].arrtime,&Processes[i].reqtime); 535 */ 536 //fscanf(fp,"%d",) 537 } 538 sumProcess=i; 539 fclose(fp); 540 } 541 void shuru() 542 { 543 int i; 544 printf("作业个数:\n"); 545 scanf("%d",&sumProcess); 546 for(i=1;i<=sumProcess;i++) 547 { 548 printf("\n第%d个作业:\n",i); 549 getchar(); 550 printf("输入作业名:\n"); 551 gets(Processes[i].name); 552 printf("到达时间:\n"); 553 scanf("%d",&Processes[i].arrtime); 554 printf("要求服务时间:\n"); 555 scanf("%d",&Processes[i].reqtime); 556 } 557 sumofthey(); 558 } 559 void choosesort() 560 { 561 int n; 562 printf("\t\t\t*****************************\n"); 563 printf("\t\t\t*******1.FCFS算法调度********\n"); 564 printf("\t\t\t*******2.SJF算法调度*********\n"); 565 printf("\t\t\t*******3.HRRF算法调度********\n"); 566 printf("\t\t\t*******4.调用系统清屏********\n"); 567 printf("\t\t\t*******5.退出算法调度********\n"); 568 printf("\t\t\t*****************************\n"); 569 scanf("%d",&n); 570 switch(n) 571 { 572 case 1: 573 printf("运行先来先服务算法FCFS\n"); 574 sort(1); 575 printf("\n经按到达时间排序后,未达到队列是\n"); 576 printz(); 577 break; 578 case 2: 579 printf("运行最短作业优先算法FJS\n"); 580 sort(2); 581 printf("\n经按到达时间排序后,未达到队列是\n"); 582 printz(); 583 break; 584 case 3: 585 printf("运行最高响应比优先算法HRRF\n"); 586 sort(3); 587 printf("\n经按到达时间排序后,未达到队列是\n"); 588 printz(); 589 break; 590 case 4: 591 system("cls"); 592 break; 593 case 5: 594 exit(0); 595 break; 596 } 597 } 598 void main() 599 { 600 startit(); 601 // choosesort(); 602 while(sumProcess!=0) 603 { 604 RunProcess(); 605 } 606 607 }