标签:
实验二作业调度模拟程序
专业:商业软件工程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 !\n"); 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 } 45 46 void Menu() 47 { 48 printf("\n\n\t\t****************************************\n"); 49 printf("\t\t|| 作业调度演示 ||\n"); 50 printf("\t\t||************************************||\n"); 51 printf("\t\t|| ||\n"); 52 printf("\t\t|| 1.先来先服务算法 ||\n"); 53 printf("\t\t|| 2.最短作业优先算法 ||\n"); 54 printf("\t\t|| 3.最高响应比优先算法 ||\n"); 55 printf("\t\t|| 0.退出程序 ||\n"); 56 printf("\t\t****************************************\n"); 57 } 58 void Show(jcb job[],int n) 59 { 60 int i; 61 printf("原始数据是:"); 62 printf("\n作业名 作业到达时间 作业运行所需要时间\n"); 63 for(i=0;i<n;i++) 64 { 65 printf("\n%s%12d%15d",job[i].name,job[i].subtime,job[i].runtime); //输出到屏幕 66 } 67 printf("\n"); 68 } 69 void Sort(jcb job[],int n) 70 { 71 int i,j; 72 jcb temp; 73 for(i=0;i<n;i++) 74 { 75 for(j=i+1;j<n;j++) 76 if(job[j].subtime<job[i].subtime) 77 { 78 temp=job[j]; 79 job[j]=job[i]; 80 job[i]=temp; 81 } 82 } 83 } 84 85 void Handle(jcb joc[],int n,int times) 86 { 87 int i,j; 88 sumzztime=sumwzztime=0; 89 job[0].statime=job[0].subtime; 90 job[0].fintime=job[0].statime+job[0].runtime; 91 printf("===============================\n"); 92 printf("%s is running.....\n",job[0].name); 93 printf("经按到达时间排序后,未达到队列是\n"); 94 printf("name subtime runtime\n"); 95 for(i=1;i<n;i++) 96 { 97 if(job[i].subtime>times) 98 printf("%s\t%d\t%d\n",job[i].name,job[i].subtime,job[i].runtime); 99 100 printf("\n"); 101 102 } 103 times=job[0].statime; 104 printf("\t\t现在系统时间: %d\n\n",times); 105 printf("===============================\n"); 106 for(i=1;i<n;i++) 107 { 108 if(job[i-1].fintime>job[i].subtime) 109 { 110 job[i].statime=job[i-1].fintime; 111 job[i].fintime=job[i].statime+job[i].runtime; 112 } 113 else 114 { 115 job[i].statime=job[i].subtime; 116 job[i].fintime=job[i].statime+job[i].runtime; 117 } 118 119 printf("%s is running......\n",job[i].name); 120 for(j=0;j<i;j++) 121 { 122 printf("%s ",job[j].name); 123 } 124 printf(" is finished !\n\n"); 125 times=job[i].statime; 126 printf("\t\t现在系统时间: %d\n\n",times); 127 printf("===============================\n"); 128 } 129 for(i=0;i<n;i++) 130 { 131 job[i].zztime=job[i].fintime-job[i].subtime; 132 job[i].wzztime=(job[i].zztime*1.0)/(job[i].runtime*1.0); 133 sumzztime+=job[i].zztime; 134 sumwzztime+=job[i].wzztime; 135 } 136 avgzztime=sumzztime/n; 137 avgwzztime=sumwzztime/n; 138 } 139 void Output(jcb job[],int n) 140 { 141 int i; 142 printf("name\tsubtime\truntime\tstatime\tfintime\tzztime\twzztime\n"); 143 for(i=0;i<n;i++) 144 { 145 printf("%s\t %d\t %d\t %d\t %d\t %d\t %.2f\n",job[i].name,job[i].subtime,job[i].runtime,job[i].statime,job[i].fintime,job[i].zztime,job[i].wzztime); 146 } 147 printf("\n平均作业周转时间为: %.2f",avgzztime); 148 printf("\n平均带权作业周转时间为: %.2f",avgwzztime); 149 printf("\n"); 150 } 151 152 FCFS(jcb job[],int n,int times) 153 { 154 Show(job,n); 155 Sort(job,n); 156 printf("\n先来先服务算法的调度过程:\n"); 157 Handle(job,n,times); 158 printf("\n先来先服务调度算法得到的结果如下:\n"); 159 Output(job,n); 160 161 } 162 SJF(jcb job[],int n,int times) 163 { 164 int i,j; 165 jcb temp; 166 Show(job,n); 167 Sort(job,n); 168 for(i=1;i<n;i++) 169 { 170 for(j=i+1;j<n;j++) 171 if(job[j].runtime<job[i].runtime) 172 { 173 temp=job[j]; 174 job[j]=job[i]; 175 job[i]=temp; 176 } 177 } 178 printf("\n最短作业优先算法的调度过程:\n"); 179 Handle(job,n,times); 180 printf("\n最短作业优先调度算法得到的结果如下:\n"); 181 Output(job,n); 182 } 183 184 HRRF(jcb job[],int n) 185 { 186 /*int i,j; 187 jcb temp; 188 Show(job,n); 189 Sort(job,n); 190 job[0].statime=job[0].subtime; 191 job[0].fintime=job[0].statime+job[0].runtime; 192 for(i=1;i<n-1;i++) 193 { 194 if(job[i-1].fintime>job[i].subtime) 195 { 196 job[i].statime=job[i-1].fintime; 197 job[i].fintime=job[i].statime+job[i].runtime; 198 } 199 else 200 { 201 job[i].statime=job[i].subtime; 202 job[i].fintime=job[i].statime+job[i].runtime; 203 } 204 job[i].zztime=job[i].fintime-job[i].subtime; 205 job[i].prio=job[i].zztime/job[i].runtime; 206 } 207 for(i=1;i<n;i++) 208 { 209 for(j=i+1;j<n;j++) 210 if(job[j].prio>job[i].prio) 211 { 212 temp=job[j]; 213 job[j]=job[i]; 214 job[i]=temp; 215 } 216 } 217 printf("作业名\t最高响应比\n"); 218 for(i=1;i<n;i++) 219 printf("%s\t%d\n",job[i].name,job[i].prio); 220 printf("\n最高响应比优先调度算法得到的结果如下:\n"); 221 Output(job,n); */ 222 223 } 224 225 int main() 226 { 227 int n,m,times=0; 228 n=ReadFile(); 229 while(1) 230 { 231 Menu(); 232 printf("\n\t\t选择所要操作:"); 233 scanf("%d",&m); 234 switch(m) 235 { 236 case 1: 237 FCFS(job,n,times); 238 break; 239 case 2: 240 SJF(job,n,times); 241 break; 242 case 3: 243 HRRF(job,n); 244 break; 245 case 0: 246 exit(0); 247 break; 248 default: 249 printf("选择错误,请重新选择!"); 250 } 251 } 252 printf("\n"); 253 return 0; 254 }
标签:
原文地址:http://www.cnblogs.com/950525kxj/p/5419287.html