实验二作业调度模拟程序
专业:商业软件工程2班 姓名:柯晓君 学号:201406114210
一、目的和要求
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 |
操作系统中,常用的作业调度算法有哪些? |
|
5 |
如何编程实现作业调度算法? |
|
6 |
模拟程序的输入如何设计更方便、结果输出如何呈现更好? |
三、实验方法、步骤及结果测试
1.源程序名:压缩包文件(rar或zip)中源程序名c2.c
可执行程序名:c2.exe
2.原理分析及流程图
3.主要程序段及其解释:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 100 4 typedef struct jcb{ 5 char name[10]; 6 int subtime; //提交时间 7 int runtime; //要求运行时间 8 int statime; //开始运行时间或调度时间 9 int waitime; 10 int fintime; //完成时间 11 int zztime; //周转时间 12 double wzztime; //带权周转时间 13 double prio; //响应比 14 }jcb; 15 jcb job[N]; 16 double sumzztime; //总周转时间 17 double sumwzztime; //总带权周转时间 18 double avgzztime; //平均周转时间 19 double avgwzztime; //平均带权周转时间 20 21 int ReadFile() 22 { 23 int m=0; 24 int i=0; 25 FILE *fp; //定义文件指针 26 fp=fopen("3.txt","r"); //打开文件 27 if(fp==NULL) 28 { 29 printf("File open error ! "); 30 exit(0); 31 } 32 else 33 { 34 while(!feof(fp)) 35 { 36 fscanf(fp,"%s%d%d",&job[i].name,&job[i].subtime,&job[i].runtime); //fscanf()函数将数据读入 37 i++; 38 } 39 fclose(fp); //关闭文件 40 } 41 m=i-1; 42 return m; 43 } 44 int Input() 45 { 46 int i,n; 47 printf("作业个数: "); 48 scanf("%d",&n); 49 for(i=0;i<n;i++) 50 { 51 printf("第%d个作业: ",i+1); 52 printf("输入作业名:"); 53 scanf("%s",job[i].name); 54 printf("到达时间:"); 55 scanf("%d",&job[i].subtime); 56 printf("要求服务时间:"); 57 scanf("%d",&job[i].runtime); 58 printf(" "); 59 } 60 return n; 61 } 62 63 void Menu() 64 { 65 printf(" **************************************** "); 66 printf(" || 作业调度模拟程序 || "); 67 printf(" ||************************************|| "); 68 printf(" || || "); 69 printf(" || 1.先来先服务算法 || "); 70 printf(" || 2.最短作业优先算法 || "); 71 printf(" || 3.最高响应比优先算法 || "); 72 printf(" || 0.退出程序 || "); 73 printf(" **************************************** "); 74 } 75 void Show(jcb job[],int n) 76 { 77 int i; 78 printf("原始数据是:"); 79 printf(" 作业名 作业到达时间 作业运行所需要时间 "); 80 for(i=0;i<n;i++) 81 { 82 printf(" %s%12d%15d",job[i].name,job[i].subtime,job[i].runtime); //输出到屏幕 83 } 84 printf(" "); 85 } 86 void Sort(jcb job[],int n) 87 { 88 int i,j; 89 jcb temp; 90 for(i=0;i<n;i++) 91 { 92 for(j=n-1;j>i;j--) 93 if(job[i].subtime>job[j].subtime) 94 { 95 temp=job[j]; 96 job[j]=job[i]; 97 job[i]=temp; 98 } 99 } 100 } 101 102 void Handle(jcb joc[],int n,int times) 103 { 104 int i,j; 105 sumzztime=sumwzztime=0; 106 job[0].statime=job[0].subtime; 107 job[0].fintime=job[0].statime+job[0].runtime; 108 printf("=============================== "); 109 printf("name subtime runtime "); 110 for(i=0;i<n;i++) 111 { 112 printf("%s %d %d ",job[i].name,job[i].subtime,job[i].runtime); 113 printf(" "); 114 } 115 printf("=============================== "); 116 printf("%s is running..... ",job[0].name); 117 times=job[0].statime; 118 printf(" 现在系统时间: %d ",times); 119 printf("=============================== "); 120 for(i=1;i<n;i++) 121 { 122 if(job[i-1].fintime>job[i].subtime) 123 { 124 job[i].statime=job[i-1].fintime; 125 job[i].fintime=job[i].statime+job[i].runtime; 126 } 127 else 128 { 129 job[i].statime=job[i].subtime; 130 job[i].fintime=job[i].statime+job[i].runtime; 131 } 132 133 printf("%s is running...... ",job[i].name); 134 for(j=0;j<i;j++) 135 { 136 printf("%s ",job[j].name); 137 } 138 printf(" is finished ! "); 139 times=job[i].statime; 140 printf(" 现在系统时间: %d ",times); 141 printf("=============================== "); 142 } 143 for(i=0;i<n;i++) 144 { 145 job[i].zztime=job[i].fintime-job[i].subtime; 146 job[i].wzztime=(job[i].zztime*1.0)/(job[i].runtime*1.0); 147 sumzztime+=job[i].zztime; 148 sumwzztime+=job[i].wzztime; 149 } 150 avgzztime=sumzztime/n; 151 avgwzztime=sumwzztime/n; 152 } 153 void Output(jcb job[],int n) 154 { 155 int i; 156 printf("name subtime runtime statime fintime zztime wzztime "); 157 for(i=0;i<n;i++) 158 { 159 printf("%s %d %d %d %d %d %.2f ",job[i].name,job[i].subtime,job[i].runtime,job[i].statime,job[i].fintime,job[i].zztime,job[i].wzztime); 160 } 161 printf(" 平均作业周转时间为: %.2f",avgzztime); 162 printf(" 平均带权作业周转时间为: %.2f",avgwzztime); 163 printf(" "); 164 } 165 166 FCFS(jcb job[],int n,int times) 167 { 168 Show(job,n); 169 Sort(job,n); 170 printf(" 先来先服务算法的调度过程: "); 171 Handle(job,n,times); 172 printf(" 先来先服务调度算法得到的结果如下: "); 173 Output(job,n); 174 175 } 176 SJF(jcb job[],int n,int times) 177 { 178 int i,j; 179 jcb temp; 180 Show(job,n); 181 Sort(job,n); 182 for(i=1;i<n;i++) 183 { 184 for(j=i+1;j<n;j++) 185 if(job[j].runtime<job[i].runtime) 186 { 187 temp=job[j]; 188 job[j]=job[i]; 189 job[i]=temp; 190 } 191 } 192 printf(" 最短作业优先算法的调度过程: "); 193 Handle(job,n,times); 194 printf(" 最短作业优先调度算法得到的结果如下: "); 195 Output(job,n); 196 } 197 198 HRRF(jcb job[],int n) 199 { 200 int i,j,k; 201 jcb temp; 202 Show(job,n); 203 Sort(job,n); 204 job[0].statime=job[0].subtime; 205 job[0].fintime=job[0].statime+job[0].runtime; 206 for(i=1;i<n;i++) 207 { 208 for(j=i;j<n;j++) 209 { 210 if(job[i-1].fintime>=job[j].subtime) 211 { 212 job[j].prio=1+(job[i-1].fintime-job[j].subtime)*1.0/job[j].runtime; 213 } 214 } 215 for(k=i;k<n-1;k++) 216 { 217 for(j=k+1;j<n;j++) 218 if(job[j].prio>job[k].prio) 219 { 220 temp=job[j]; 221 job[j]=job[k]; 222 job[k]=temp; 223 } 224 } 225 job[i].statime=job[i-1].fintime; 226 job[i].fintime=job[i].statime+job[i].runtime; 227 job[i].zztime=job[i].fintime-job[i].subtime; 228 job[i].wzztime=job[i].zztime/job[i].runtime; 229 printf("作业名 最高响应比 "); 230 for(k=i;k<n;k++) 231 printf("%s %.2f ",job[k].name,job[k].prio); 232 } 233 printf(" 最高响应比优先调度算法得到的结果如下: "); 234 Output(job,n); 235 236 } 237 238 int main() 239 { 240 int n,m,choice,times=0; 241 A:printf(" **************************************** "); 242 printf(" || 作业调度模拟程序 || "); 243 printf(" ||************************************|| "); 244 printf(" || || "); 245 printf(" || 1.调用文本写入数据 || "); 246 printf(" || 2.调用手动输入数据 || "); 247 printf(" **************************************** "); 248 printf("请选择菜单项:"); 249 scanf("%d",&choice); 250 switch(choice) 251 { 252 case 1: 253 n=ReadFile(); 254 break; 255 case 2: 256 n=Input(); 257 break; 258 default: 259 printf("选择错误,请重新选择!"); 260 goto A; 261 } 262 while(1) 263 { 264 Menu(); 265 printf(" 选择所要操作:"); 266 scanf("%d",&m); 267 switch(m) 268 { 269 case 1: 270 FCFS(job,n,times); 271 break; 272 case 2: 273 SJF(job,n,times); 274 break; 275 case 3: 276 HRRF(job,n); 277 break; 278 case 0: 279 exit(0); 280 break; 281 default: 282 printf("选择错误,请重新选择!"); 283 } 284 } 285 printf(" "); 286 return 0; 287 }
4.运行结果及分析