首页 / 更多教程 / 实验二作业调度模拟程序
实验二作业调度模拟程序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了实验二作业调度模拟程序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7926字,纯文字阅读大概需要12分钟。
内容图文
![实验二作业调度模拟程序](/upload/InfoBanner/zyjiaocheng/1233/c9eca3492aed42b5a18105594f11c237.jpg)
一、目的和要求
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 #include "h.h" 2 3struct job 4{ 5char name[10]; 6char status; 7 8int id; 9int arrtime; 10int reqtime; 11int startime; 12int finitime; 13int waittime; 14 15int TAtime; 16float TAWtime; 17float prio; 18 }jobarr[24], jobfin[24], job[24]; 19 20int systime = 0; 21int intarr, intfin, intjob; 22 23int readFile() 24{ 25int m=0; 26int i=0; 27 FILE *fp; //定义文件指针 28 fp=fopen("3.txt","r"); //打开文件 29if(fp==NULL) 30 { 31 printf("File open error !\n"); 32 exit(0); 33 } 34 printf("\n id 作业到达时间 作业运行所需要时间\n"); 35while(!feof(fp)) 36 { 37 fscanf(fp,"%d%d%d",&job[i].id,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读入 38 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); //输出到屏幕 39 i++; 40 }; 41 42if(fclose(fp)) //关闭文件 43 { 44 printf("Can not close the file !\n"); 45 exit(0); 46 } 47 m=i-1; 48return m; 49 50} 51 52//伪随机数产生器 53int randNumber() 54{ 55int i,n; 56// srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。 57//输入作业数 58 n=rand()%23+5; 59for(i=0; i<=n; i++) 60 { 61 job[i].id=i; 62//作业到达时间 63 job[i].arrtime=rand()%29+1; 64//作业运行时间 65 job[i].reqtime=rand()%7+1; 66 } 67 printf("\n id 作业到达时间 作业运行所需要时间\n"); 68for(i=0; i<=n; i++) 69 { 70 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); 71 } 72return n; 73 74} 75 76void sort(int n, int x) 77{ 78int i, j; 79for(i = 0 + x; i <= n; i++) 80 { 81for(j = i+1; j <= n; j++) 82 { 83if(job[i].arrtime > job[j].arrtime) 84 { 85struct job tmp = job[i]; 86 job[i] = job[j]; 87 job[j] = tmp; 88 } 89 } 90 } 91} 92 93void show(int n) 94{ 95int i = 0; 96 97 98 99 printf("\n id 作业到达时间 作业完成时间 运行时间 作业周转时间 带权周转时间\n"); 100for(i=0; i<=n; i++) 101 { 102 printf("\n%3d%12d%15d%15d%15d%15.2f",job[i].id, job[i].arrtime, job[i].finitime, job[i].reqtime, job[i].TAtime, job[i].TAWtime); 103 } 104105int allTAtime = 0; 106float allTAWtime = 0; 107for(i = n; i <= n; i++) 108 { 109 allTAtime += job[i].TAtime; 110 allTAWtime += job[i].TAWtime; 111 } 112113 printf("\n平均作业周转时间:%0.2f", (float)allTAtime / n); 114 printf("\n平均作业带权周转时间:%0.2f\n", allTAWtime / n); 115} 116117void FCFS(int n) 118{ 119int i; 120121 printf("\n\t\t**********先来先服务FCFS***********\n\n"); 122 sort(n, 0); 123124 printf("\n id 作业到达时间 作业运行所需要时间\n"); 125126for(i = 0; i <= n; i++) 127 { 128 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); 129 } 130131for(i = 0; i <= n; i++) 132 { 133if(i == 0 || job[i-1].finitime < job[i].arrtime) 134 { 135 job[i].finitime = job[i].arrtime + job[i].reqtime; 136 job[i].TAtime = job[i].finitime - job[i].arrtime; 137 job[i].TAWtime = (float)job[i].TAtime / job[i].reqtime; 138 } 139else140 { 141 job[i].finitime = job[i-1].finitime + job[i].reqtime; 142 job[i].TAtime = job[i].finitime - job[i].arrtime; 143 job[i].TAWtime = (float)job[i].TAtime / job[i].reqtime; 144 } 145 } 146147 show(n); 148149} 150151void SJF(int n) 152{ 153int i = 0, j = 0, x = 0; 154155 printf("\n\t\t**********短作业优先SJF***********\n\n"); 156157for(x = 0; x <= n; x++) 158 { 159if(x == 0) 160 { 161 sort(n, 0); 162 printf("\n id 作业到达时间 作业运行所需要时间\n"); 163164for(i = 0; i <= n; i++) 165 { 166 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); 167 } 168169for(i = 0; i <= n; i++) 170 { 171if(i == 0 || job[i-1].finitime < job[i].arrtime) 172 { 173 job[i].finitime = job[i].arrtime + job[i].reqtime; 174 job[i].TAtime = job[i].finitime - job[i].arrtime; 175 job[i].TAWtime = (float)job[i].TAtime / job[i].reqtime; 176 } 177else178 { 179 job[i].finitime = job[i-1].finitime + job[i].reqtime; 180 job[i].TAtime = job[i].finitime - job[i].arrtime; 181 job[i].TAWtime = (float)job[i].TAtime / job[i].reqtime; 182 } 183 } 184185 } 186elseif(job[x-1].finitime < job[x].arrtime) 187 { 188 sort(n, x); 189 } 190else191 { 192for(i = x; i <= n; i++) 193 { 194for(j = i+1; j <= n; j++) 195 { 196if(job[i].reqtime > job[j].reqtime) 197 { 198struct job tmp = job[i]; 199 job[i] = job[j]; 200 job[j] = tmp; 201 } 202 } 203 } 204 } 205 } 206207 show(n); 208209} 210211void HRRF(int n) 212{ 213int i, x; 214215 printf("\n\t\t**********响应比最高者优先HRRF算法***********\n\n"); 216217for(x = 0; x <= n; x++) 218 { 219if(x == 0) 220 { 221 sort(n, 0); 222 printf("\n id 作业到达时间 作业运行所需要时间\n"); 223224for(i = 0; i <= n; i++) 225 { 226 printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime); 227 } 228229for(i = 0; i <= n; i++) 230 { 231if(i == 0 || job[i-1].finitime < job[i].arrtime) 232 { 233 job[i].finitime = job[i].arrtime + job[i].reqtime; 234 job[i].TAtime = job[i].finitime - job[i].arrtime; 235 job[i].TAWtime = (float)job[i].TAtime / job[i].reqtime; 236 } 237else238 { 239 job[i].finitime = job[i-1].finitime + job[i].reqtime; 240 job[i].TAtime = job[i].finitime - job[i].arrtime; 241 job[i].TAWtime = (float)job[i].TAtime / job[i].reqtime; 242 } 243 } 244245for(i = x; i <= n; i++) 246 { 247 job[i].waittime = job[x-1].finitime - job[i].arrtime; 248 job[i].prio = 1 + (float)job[i].waittime / (float)job[i].reqtime; 249250 } 251252for(i = x; i <= n; i++) 253 { 254for(int j = i+1; j <= n; j++) 255 { 256if(job[i].prio < job[j].prio) 257 { 258struct job tmp = job[i]; 259 job[i] = job[j]; 260 job[j] = tmp; 261 } 262 } 263 } 264265 } 266elseif(job[x-1].finitime < job[x].arrtime) 267 { 268 sort(n, x); 269 } 270else271 { 272for(i = x; i <= n; i++) 273 { 274 job[i].waittime = job[x-1].finitime - job[i].arrtime; 275 job[i].prio = 1 + (float)job[i].waittime / (float)job[i].reqtime; 276277 } 278279 printf(" \nid 最高响应比\n"); 280for(i = x; i <= n; i++) 281 printf("%3d%12.2f\n", job[i].id, job[i].prio); 282 } 283 } 284285 show(n); 286 }
1 #include "h.h" 2 3int main(void) 4{ 5int n = 0; 6int option = 0; 7 8 printf("\t\t********************************\n"); 9 printf("\t\t 1. 调用文本写入数据\n"); 10 printf("\t\t 2. 调用随机数产生的数据\n"); 11 printf("\t\t 3. 调用自己填入模拟数据\n"); 12 printf("\t\t********************************\n\n"); 1314 printf("\t请选择菜单项:"); 15 scanf("%d", &option); 16switch(option) 17 { 18case1: 19 n = readFile(); 20break; 21case2: 22 n = randNumber(); 23break; 24case3: 25break; 26 } 2728 printf("\n\n\n\t\t********************************\n"); 29 printf("\t\t 1. FCFS算法调度\n"); 30 printf("\t\t 2. SJF算法调度\n"); 31 printf("\t\t 3. HRRF算法调度\n"); 32 printf("\t\t 4. 调用系统清屏\n"); 33 printf("\t\t 0. 退出算法调度\n"); 34 printf("\t\t********************************\n\n"); 3536 printf("\t请选择菜单项:"); 37 scanf("%d", &option); 38switch(option) 39 { 40case1: 41 FCFS(n); 42break; 43case2: 44 SJF(n); 45break; 46case3: 47 HRRF(n); 48break; 49 } 50515253return0; 54 }
#ifndef H_H #define H_H #include <stdio.h> #include <stdlib.h> int readFile(); int randNumber(); void FCFS(int n); void SJF(int n); void HRRF(int n); #endif H_H
原文:http://www.cnblogs.com/shuaibi/p/5420825.html
内容总结
以上是互联网集市为您收集整理的实验二作业调度模拟程序全部内容,希望文章能够帮你解决实验二作业调度模拟程序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。