标签:
实验二 作业调度模拟程序
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 |
一个作业具备什么信息? |
作业由三部分组成,即程序、数据和作业说明书。一个作业可以包含多个程序和多个数据集,但必须至少包含一个程序。否则将不成为作业。 |
3 |
为了方便模拟调度过程,作业使用什么方式的数据结构存放和表示?JCB |
单个作业使用结构体,多个作业使用队列。 |
4 |
操作系统中,常用的作业调度算法有哪些? |
先来先服务(FCFS)算法,最短作业优先 (SJF)算法,最短剩余时间优先算法,最高响应比优先(HRRN)算法,轮转法,多级反馈队列算法。 |
5 |
如何编程实现作业调度算法? |
分析各种调度算法,理解算法过程,利用先来先服务(FCFS)算法,最短作业优先 (SJF)算法编程实现 |
6 |
模拟程序的输入如何设计更方便、结果输出如何呈现更好? |
输入:读取文件的方式 输出:以二维表关系的形式输出 |
五、 其他要求
1. 完成报告书,内容完整,规格规范。
2. 实验须检查,回答实验相关问题。
注:带**号的条目表示选做内容。
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。
单道FCFS算法:
1 #include<stdio.h> 2 #include<time.h> 3 #include<windows.h> 4 5 struct job 6 { 7 char name[10]; //作业名 8 char status; 9 int id; 10 int arrtime; //到达时间 11 int reqtime; //要求服务时间 12 int startime; //开始时间 13 int finitime; //结束时间 14 float TAtime,TAWtime; 15 float rp; 16 }job[24]; 17 18 int ReadFile() 19 { 20 int i=0; 21 FILE *fp; //定义文件指针 22 fp=fopen("3.txt","r"); //打开文件 23 if(fp==NULL) 24 { 25 printf("File open error !\n"); 26 exit(0); 27 } 28 printf("\n id 作业到达时间 作业运行所需要时间\n"); 29 while(!feof(fp)) 30 { 31 fscanf(fp,"%s%d%d",&job[i].name,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读入 32 printf("\n%3s%12d%15d",job[i].name,job[i].arrtime,job[i].reqtime); //输出到屏幕 33 i++; 34 }; 35 36 if(fclose(fp)) //关闭文件 37 { 38 printf("Can not close the file !\n"); 39 exit(0); 40 } 41 return i; 42 43 } 44 45 //伪随机数产生器 46 int Pseudo_random_number() 47 { 48 int i,n; 49 srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 50 //输入作业数 51 n=rand()%23+5; 52 for(i=0; i<n; i++) 53 { 54 job[i].id=i+1; 55 //作业到达时间 56 job[i].arrtime=rand()%29+1; 57 //作业运行时间 58 job[i].reqtime=rand()%7+1; 59 } 60 printf("\n id 作业到达时间 作业运行所需要时间\n"); 61 for(i=0; i<n; i++) 62 { 63 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); 64 } 65 return n; 66 67 } 68 69 void sort(struct job temp[24],int num) 70 { 71 int i; 72 int j; 73 struct job k; 74 for(i=0;i<num-1;i++) 75 { 76 for(j=i+1;j<num;j++) 77 { 78 if(temp[j].arrtime<temp[i].arrtime) 79 { 80 k = temp[j]; 81 temp[j] = temp[i]; 82 temp[i] = k; 83 } 84 } 85 } 86 } 87 88 void FCFS(struct job temp[24],int num) 89 { 90 int i=0; 91 printf("·······先来先服务算法FCFS·······\n"); 92 float sumTAtime=0; 93 float aveTAtime=0; 94 sort(temp,num); 95 temp[i].startime = temp[i].arrtime; 96 temp[i].finitime = temp[i].startime + temp[i].reqtime; 97 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 98 sumTAtime+=temp[i].TAtime; 99 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 100 for(i=1;i<num;i++) 101 { 102 temp[i].startime = temp[i-1].finitime; 103 temp[i].finitime = temp[i].startime + temp[i].reqtime; 104 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 105 temp[i].rp=temp[i].TAtime/temp[i].reqtime; 106 sumTAtime+=temp[i].TAtime; 107 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 108 } 109 110 111 printf("作业名 到达时间 CPU所需时间 开始时间 结束时间 周转时间\n"); 112 for(i=0;i<num;i++) 113 { 114 printf("%s\t %d\t %d\t %d\t %d\t %f\n",temp[i].name,temp[i].arrtime, 115 temp[i].reqtime,temp[i].startime,temp[i].finitime,temp[i].TAtime); 116 } 117 printf("平均周转时间=%f\n",sumTAtime/num); 118 printf("平均带权周转时间=%f\n",aveTAtime/num); 119 120 } 121 122 void SJF(struct job temp[24],int num) 123 { 124 printf("·······最短作业优先算法SJF·······\n"); 125 int i=0; 126 int j; 127 struct job k; 128 float sumTAtime=0; 129 float aveTAtime=0; 130 sort(temp,num); 131 temp[i].startime = temp[i].arrtime; 132 temp[i].finitime = temp[i].startime + temp[i].reqtime; 133 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 134 sumTAtime+=temp[i].TAtime; 135 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 136 for(i=1;i<num-1;i++) 137 { 138 for(j=i+1;j<num;j++) 139 { 140 if(temp[j].reqtime<temp[i].reqtime) 141 { 142 k=temp[j]; 143 temp[j]=temp[i]; 144 temp[i]=k; 145 } 146 } 147 } 148 for(i=1;i<num;i++) 149 { 150 temp[i].startime = temp[i-1].finitime; 151 temp[i].finitime = temp[i].startime + temp[i].reqtime; 152 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 153 sumTAtime+=temp[i].TAtime; 154 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 155 } 156 157 158 printf("作业名 到达时间 CPU所需时间 开始时间 结束时间 周转时间\n"); 159 for(i=0;i<num;i++) 160 { 161 printf(" %s\t %d\t %d\t %d\t %d\t %f\n",temp[i].name,temp[i].arrtime, 162 temp[i].reqtime,temp[i].startime,temp[i].finitime,temp[i].TAtime); 163 } 164 printf("平均周转时间=%f\n",sumTAtime/num); 165 printf("平均带权周转时间=%f\n",aveTAtime/num); 166 167 } 168 169 void HRRN(struct job temp[24],int num) 170 { 171 int i=0; 172 int j; 173 struct job k; 174 printf("·······最短作业优先算法HRRF·······\n"); 175 sort(temp,num); 176 float sumTAtime=0; 177 float aveTAtime=0; 178 temp[i].startime = temp[i].arrtime; 179 temp[i].finitime = temp[i].startime + temp[i].reqtime; 180 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 181 sumTAtime+=temp[i].TAtime; 182 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 183 for(i=1;i<num;i++) 184 { 185 temp[i].startime = temp[i-1].finitime; 186 temp[i].finitime = temp[i].startime + temp[i].reqtime; 187 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 188 temp[i].rp=temp[i].TAtime/temp[i].reqtime; 189 sumTAtime+=temp[i].TAtime; 190 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 191 } 192 for(i=1;i<num-1;i++) 193 { 194 for(j=i+1;j<num;j++) 195 { 196 if(temp[j].rp<temp[i].rp) 197 { 198 k=temp[j]; 199 temp[j]=temp[i]; 200 temp[i]=k; 201 } 202 } 203 } 204 for(i=1;i<num;i++) 205 { 206 temp[i].startime = temp[i-1].finitime; 207 temp[i].finitime = temp[i].startime + temp[i].reqtime; 208 temp[i].TAtime = temp[i].finitime - temp[i].arrtime; 209 temp[i].rp=temp[i].TAtime/temp[i].reqtime; 210 sumTAtime+=temp[i].TAtime; 211 aveTAtime+=temp[i].TAtime/temp[i].reqtime; 212 } 213 214 printf("作业名 到达时间 CPU所需时间 开始时间 结束时间 周转时间\n"); 215 for(i=0;i<num;i++) 216 { 217 printf(" %s\t %d\t %d\t %d\t %d\t %f\n",temp[i].name,temp[i].arrtime, 218 temp[i].reqtime,temp[i].startime,temp[i].finitime,temp[i].TAtime); 219 } 220 printf("平均周转时间=%f\n",sumTAtime/num); 221 printf("平均带权周转时间=%f\n",aveTAtime/num); 222 } 223 224 int main() 225 { 226 int x; 227 int num; 228 int i; 229 printf("*******************************\n"); 230 printf("1.调用文本写入数据\n"); 231 printf("2.调用伪随机数产生数据\n"); 232 printf("3.调用自己输入模拟数据\n"); 233 printf("*******************************\n"); 234 printf("请选择菜单项:"); 235 scanf("%d",&x); 236 if(x==1) 237 { 238 num=ReadFile(); 239 } 240 else if(x==2) 241 { 242 num=Pseudo_random_number(); 243 } 244 else if(x==3) 245 { 246 printf("作业个数:"); 247 scanf("%d",&num); 248 printf("\n"); 249 for(i = 0;i<num;i++) 250 { 251 printf("第%d个作业:\n",i+1); 252 printf("输入作业名:"); 253 scanf("%s",&job[i].name); 254 printf("到达时间:"); 255 scanf("%d",&job[i].arrtime); 256 printf("要求服务时间:"); 257 scanf("%d",&job[i].reqtime); 258 printf("\n"); 259 } 260 printf("经按到达时间排序后,未达到队列是\n"); 261 printf("id\t作业到达时间\t作业运行所需要的时间\n"); 262 for(i=0;i<num;i++) 263 { 264 printf("%s\t%d\t\t%d\n",job[i].name,job[i].arrtime,job[i].reqtime); 265 } 266 267 } 268 while(1) 269 { 270 printf("\n"); 271 printf("*******************************\n"); 272 printf("1.FCFS算法调度\n"); 273 printf("2.SJF算法调度\n"); 274 printf("3.HRRF算法调度\n"); 275 printf("0.退出算法调度\n"); 276 printf("*******************************\n"); 277 printf("请输入菜单项:"); 278 scanf("%d",&x); 279 if(x==1) 280 { 281 FCFS(job,num); 282 } 283 else if(x==2) 284 { 285 SJF(job,num); 286 } 287 else if(x==3) 288 { 289 HRRN(job,num); 290 } 291 else if(x==0) 292 { 293 exit(0); 294 } 295 return 0; 296 } 297 }
运行结果:
实验总结:通过这次实验,加深了自己对作业调度算法的理解,加强了对程序设计的训练,仍然有部分问题没解决,就像产生随机数,周转时间是负数的BUG没解决还有选择调度算法后就直接结束了,并没有进行循环。程序设计方面还要有待加强。
标签:
原文地址:http://www.cnblogs.com/sol6/p/5402507.html