标签:
一,实验目的
1,加深对作业调度算法的理解;
2,进行程序设计的训练。
二,实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。
三、主要程序及其解释
1 #include <stdio.h> 2 #include <string.h> 3 4 void main() 5 { 6 int i=0,j=0,finishtime=0,rotatetime=0,n=0,k=0,l,m; 7 float a,b; 8 int starttime,temp,max=1; 9 int reachtime[24],runtime[24]; 10 FILE *fp; 11 char str[1000]; 12 fp=fopen("d:/diaodu.txt","rt"); 13 if(fp==NULL) 14 { 15 printf("cannot open file\n"); 16 return; 17 } 18 printf("到达时间\t所需运行时间\n"); 19 while (fgets(str,1000,fp)) 20 { 21 sscanf(str,"%d,%d\n",reachtime+i,runtime+i); 22 23 printf("%d\t\t%d\n",reachtime[i],runtime[i]); 24 i++; 25 } 26 fclose(fp); 27 for(j=0;j<i;j++) 28 { 29 for (k=0;k<i-j;k++) 30 { 31 if (reachtime[k]>reachtime[k+1]) 32 { 33 temp=runtime[k]; 34 runtime[k]=runtime[k+1]; 35 runtime[k+1]=temp; 36 temp=reachtime[k]; 37 reachtime[k]=reachtime[k+1]; 38 reachtime[k+1]=temp; 39 } 40 } 41 } 42 printf("***********************\n"); 43 printf("1.fcfs\n2.SJF\n3.HRRN\n"); 44 printf("***********************\n"); 45 scanf("%d",&n); 46 starttime=reachtime[1]; 47 if(n==1) 48 { 49 printf("You want to run fcfs:\n"); 50 printf("作业编号\t开始时间\t运行时间\t完成时间\t周转时间\t带权周转时间\n"); 51 for(j=1;j<=i;j++) 52 { 53 finishtime=starttime+runtime[j]; 54 rotatetime=starttime+runtime[j]-reachtime[j]; 55 printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%f\n",j,starttime,runtime[j],finishtime,rotatetime,(float)(starttime+runtime[j]-reachtime[j])/runtime[j]); 56 a+=rotatetime; 57 b+=(starttime+runtime[j]-reachtime[j])/runtime[j]; 58 starttime=starttime+runtime[j]; 59 if(starttime<reachtime[j+1]) 60 starttime=reachtime[j+1]; 61 } 62 printf("平均周转时间为:%f\n",a/i); 63 printf("平均带权周转时间为:%f\n",b/i); 64 65 } 66 if(n==2) 67 { 68 printf("You want to run sjf\n"); 69 printf("作业编号\t开始时间\t运行时间\t完成时间\t周转时间\t带权周转时间\n"); 70 starttime=reachtime[1]; 71 for(j=1;j<=i;j++) 72 { 73 finishtime=starttime+runtime[j]; 74 rotatetime=starttime+runtime[j]-reachtime[j]; 75 printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%f\n",j,starttime,runtime[j],finishtime,rotatetime,(float)(starttime+runtime[j]-reachtime[j])/runtime[j]); 76 a+=rotatetime; 77 b+=(starttime+runtime[j]-reachtime[j])/runtime[j]; 78 for(k=j;k<=i;k++) 79 { 80 if(starttime+runtime[j]>reachtime[k+1]) 81 max=k; 82 83 } 84 for(l=j;l<max;l++) 85 { 86 for (m=0;m<max-l;m++) 87 { 88 if (runtime[m]>runtime[m+1]) 89 { 90 temp=runtime[m]; 91 runtime[m]=runtime[m+1]; 92 runtime[m+1]=temp; 93 temp=reachtime[m]; 94 reachtime[m]=reachtime[m+1]; 95 reachtime[m+1]=temp; 96 } 97 } 98 } 99 starttime=starttime+runtime[j]; 100 if(starttime<reachtime[j+1]) 101 starttime=reachtime[j+1]; 102 } 103 printf("平均周转时间为:%f",a/i); 104 printf("平均带权周转时间为:%f",b/i); 105 } 106 107 108 }
四,实验总结
纠结甚久,甚至不知道我需要做些什么,百度看书看代码,方法有很多不同的,但总有些代码自己不理解,不过百度里的代码倒是让我学会一种输入输出的方法,也不算无所得了。照着自己的理解,写出零零散散的代码,这里想用数组,那里用指针,很乱。
标签:
原文地址:http://www.cnblogs.com/lsh43/p/4601672.html