操作系统实验2-作业调度3.0
1.实验内容和要求
(1)初始化程序运行界面,实现菜单选项
(2)选择从文件读取作业
(3)选择调度算法菜单
(4)显示调度结果
2.主要程序段
1 #include<stdio.h> 2 3 #include<stdlib.h> 4 #include<string.h> 5 #include<conio.h> 6 #include <time.h> 7 8 struct jcb 9 { 10 char name[10]; /* 作业名 */ 11 char status; /* 作业状态 */ 12 13 int arrtime; /* 到达时间 */ 14 int startime; /* 开始运行时间 */ 15 int reqtime; /* 要求服务时间 */ 16 int finitime; /* 完成时间 */ 17 18 float TAtime; /* 周转时间 */ 19 float TAWtime; /* 带权周转时间 */ 20 21 float prio; //优先权 22 float rp; //响应比 23 } jobarr[24],jobfin[24],job[24]; 24 25 void AutoInput(int n,jcb job[]);//调用自己输入模拟数据 26 int ReadFile();//文件读取 27 void Finishtime(int n,jcb job[]);//计算结束时间 28 TAtime(int n,jcb job[],float averageTAtime);//计算周转时间、平均周转时间 29 TAWtime(int n,jcb job[],float averageTAWtime);//计算带权周转时间、平均带权周转时间 30 void FCFS(int n,jcb job[]);//先到先服务,按到达时间排序 31 void SJF(int n,jcb job[]);//短作业优先,按服务时间排序 32 void HRRF(int n,jcb job[]);//最高响应比优先 33 void putOutjob(jcb job[],int n);//打印内容 34 35 void main() 36 { 37 // int intarr,intfin,intjob; /* 到达作业个数,完成作业个数,未到达作业个数 */ 38 float averageTAtime=0; 39 float averageTAWtime=0; 40 int n; 41 int systime=0; 42 int i; 43 int a,b; 44 printf("1.调用文本写入数据\n2.调用自己输入模拟数据\n"); 45 scanf("%d",&a); 46 if(a==1) 47 ReadFile(); 48 else 49 AutoInput(n,job); 50 51 52 printf("\t\t************选择调度算法************\n"); 53 printf("\t\t1.FCFS(先到先服务)算法调度\n\t\t2.SJF(短作业优先)算法调度\n\t\t3.HRRF(最高响应比优先)算法调度\n"); 54 printf("\t\t************************************\n"); 55 scanf("%d",&b); 56 if(b==1) 57 { 58 printf("\t\t************FCFS(先到先服务)************\n"); 59 FCFS(n,job); 60 printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n"); 61 for(i=0;i<n;i++) 62 { 63 printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 64 printf("\n"); 65 } 66 printf("\n\n"); 67 } 68 69 else if(b==2) 70 { 71 printf("\t\t************SJF(短作业优先)************\n"); 72 SJF(n,job); 73 printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n"); 74 for(i=0;i<n;i++) 75 { 76 printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 77 printf("\n"); 78 } 79 } 80 81 else if(b==3) 82 { 83 printf("\t\t************HRRF(最高响应比优先)************\n"); 84 HRRF(n,job); 85 printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n"); 86 for(i=0;i<n;i++) 87 { 88 printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 89 printf("\n"); 90 } 91 } 92 93 94 95 Finishtime(n,job); 96 averageTAtime=(float)TAtime(n,job,averageTAtime); 97 averageTAWtime=(float)TAWtime(n,job,averageTAWtime); 98 99 printf("现在系统时间:%d\n",systime); 100 printf("平均周转时间=%f\n",averageTAtime); 101 printf("平均带权周转时间=%f\n",averageTAWtime); 102 103 } 104 105 void AutoInput(int n,jcb job[])//调用自己输入模拟数据 106 { 107 printf("作业个数:"); 108 scanf("%d",&n); 109 printf("\n"); 110 for(int i=0;i<n;i++) 111 { 112 printf("第%d个作业:\n",i+1); 113 printf("输入作业名称:"); 114 scanf("%s",job[i].name); 115 printf("到达时间:"); 116 scanf("%d",&job[i].arrtime); 117 printf("要求服务时间:"); 118 scanf("%d",&job[i].reqtime); 119 printf("\n"); 120 } 121 } 122 123 124 125 /* 126 127 void putOutjob(jcb job[],int n)//打印内容 128 { 129 int i; 130 printf("\n\n作业名-到达时间-服务时间-开始时间-结束时间-周转时间-带权周转时间\n"); 131 for(i=0;i<n;i++) 132 { 133 printf("%s\t%d\t%d\t%d\t%d\t%f\t%f\n",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].TAtime,job[i].TAWtime); 134 printf("\n"); 135 136 } 137 printf("\n\n"); 138 } 139 140 */ 141 142 void FCFS(int n,jcb job[])//先到先服务,按到达时间排序 143 { 144 int i,j; 145 jcb tmp; 146 for(i=0;i<n-1;i++) 147 for(j=i+1;j<n;j++) 148 { 149 if(job[i].arrtime>job[j].arrtime) 150 { 151 tmp=job[i]; 152 job[i]=job[j]; 153 job[j]=tmp; 154 } 155 } 156 } 157 158 159 void SJF(int n,jcb job[]) 160 { 161 int i,j; 162 jcb tmp; 163 for(i=0;i<n-1;i++) 164 for(j=i+1;j<n;j++) 165 { 166 if(job[i].reqtime<job[j].reqtime) 167 { 168 tmp=job[i]; 169 job[i]=job[j]; 170 job[j]=tmp; 171 } 172 } 173 } 174 175 void HRRF(int n,jcb job[]) 176 { 177 int i,j; 178 jcb tmp; 179 for(i=0;i<n;i++) 180 { 181 job[i].rp=job[i].TAtime/job[i].arrtime; 182 } 183 for(i=0;i<n-1;i++) 184 for(j=i+1;j<n;j++) 185 { 186 if(job[i].rp>job[j].rp) 187 { 188 tmp=job[i]; 189 job[i]=job[j]; 190 job[j]=tmp; 191 } 192 } 193 } 194 195 196 void Finishtime(int n,jcb job[])//计算结束时间 197 { 198 int i; 199 for(i=0;i<n;i++) 200 { 201 if(i==0) 202 { 203 //job[i].startime=job[i].arrtime; 204 job[i].finitime=job[i].arrtime+job[i].reqtime; 205 job[i].startime=job[i].finitime; 206 } 207 else 208 { 209 job[i].finitime=job[i-1].startime+job[i].reqtime; 210 job[i].startime=job[i].finitime; 211 } 212 } 213 } 214 215 TAtime(int n,jcb job[],float averageTAtime)//计算周转时间、平均周转时间 216 { 217 int i; 218 float sum=0; 219 for(i=0;i<n;i++) 220 { 221 job[i].TAtime=(float)job[i].finitime-job[i].arrtime; 222 sum=sum+job[i].TAtime; 223 } 224 averageTAtime=sum/(float)n; 225 return averageTAtime; 226 } 227 228 229 TAWtime(int n,jcb job[],float averageTAWtime)//计算带权周转时间、平均带权周转时间 230 { 231 int i; 232 float sum=0; 233 for(i=0;i<n;i++) 234 { 235 job[i].TAWtime=job[i].TAtime/job[i].reqtime; 236 sum=sum+job[i].TAWtime; 237 } 238 averageTAWtime=sum/(double)n; 239 return averageTAWtime; 240 } 241 242 int ReadFile() 243 { 244 int m=0; 245 int i=1; 246 FILE *fp; //定义文件指针 247 fp=fopen("3.txt","r"); //打开文件 248 if(fp==NULL) 249 { 250 printf("File open error !\n"); 251 exit(0); 252 } 253 printf("\n 作业名称 作业到达时间 作业运行所需要时间\n"); 254 while(!feof(fp)) 255 { 256 fscanf(fp,"%d%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读入 257 printf("\n%3f%12d%15d\n",job[i].name,job[i].arrtime,job[i].reqtime); //输出到屏幕 258 i++;// 259 }; 260 261 if(fclose(fp)) //关闭文件 262 { 263 printf("Can not close the file !\n"); 264 exit(0); 265 } 266 m=i-1; 267 return m; 268 269 }
运行结果及分析
仍有一些问题未解决,故最后的输出错误。此次编程是自己摸索的,由于编程能力不足,所以会因为一些小错误卡住很久。还有些问题到现在都无法解决。
今后的练习中会多向同学学习,弥补自身的不足。