实验一、作业调度模拟程序实验
专业:商业软件工程 姓名:王大华 学号:201406114221
一、实验目的
(1)加深对作业调度算法的理解;
(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.完成报告书,内容完整,规格规范。
2.实验须检查,回答实验相关问题。
注:带**号的条目表示选做内容
六、主要程序
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define MAX 200 5 typedef struct 6 { 7 char name[10];//作业名称 8 int arrtime;//到达时间 9 int reqtime;//要求服务时间 10 int startime;//开始时间 11 int finitime;//完成时间 12 int waittime;//等待时间 13 float TAtime,TAWtime;//周转时间,带权周转时间 14 float prio; 15 }job; 16 17 job a[MAX]; 18 19 void FCFS(int num); 20 void SJF(int num); 21 void HRRF(int num); 22 23 24 25 void main() //主函数 26 { 27 int num; 28 int i,j; 29 printf(" 请输入作业个数:"); 30 scanf("%d",&num); 31 printf(" "); 32 for(i=0;i<num;i++) 33 { 34 printf("第%d个作业: ",i+1); 35 printf("输入作业名称:"); 36 scanf("%s",a[i].name); 37 printf("到达时间:"); 38 scanf("%d",&a[i].arrtime); 39 printf("要求服务时间:"); 40 scanf("%d",&a[i].reqtime); 41 printf(" "); 42 } 43 for(j=0;j<num;j++) 44 { 45 for(i=0;i<num-j;i++) 46 { 47 if(a[i].arrtime>a[i+1].arrtime) 48 { 49 a[num]=a[i]; 50 a[i]=a[i+1]; 51 a[i+1]=a[num]; 52 } 53 } 54 } 55 printf(" 作业名称 到达时间 要求服务时间 "); 56 for(i=0;i<num;i++) 57 { 58 printf("N%d %s %d %d ",i+1,a[i].name,a[i].arrtime,a[i].reqtime); 59 } 60 while(1) 61 { 62 printf("请选择算法 :"); 63 printf("1.FCFS算法 "); 64 printf("2.SJF算法 "); 65 printf("3.HRRF算法 "); 66 printf("0.退出 "); 67 printf("请选择(0-3):"); 68 69 scanf("%d",&i); 70 if(i==1) 71 { 72 printf(" 1.FCFS算法 "); 73 FCFS(num); 74 } 75 if(i==2) 76 { 77 printf(" 2.SJF算法 "); 78 SJF(num); 79 } 80 if(i==3) 81 { 82 printf(" 3.HRRF算法 "); 83 HRRF(num); 84 } 85 if(i==0) 86 { 87 exit(0); 88 } 89 } 90 91 } 92 93 94 void FCFS(int num) //建立一个先到先服务算法 95 { 96 int i; 97 float sum_TAtime=0;//作业总周转时间 98 float sum_TAWtime=0;//作业总带权周转时间 99 100 a[0].finitime = a[0].arrtime + a[0].reqtime; 101 a[0].startime = a[0].arrtime; 102 for(i = 1; i < num; i++) 103 { 104 a[i].startime = a[i-1].finitime; 105 a[i].finitime = a[i-1].finitime + a[i].reqtime; 106 } 107 for(i = 0; i < num; i++) 108 { 109 a[i].TAtime = a[i].finitime - a[i].arrtime; 110 sum_TAtime += a[i].TAtime; 111 a[i].TAWtime = a[i].TAtime / a[i].reqtime; 112 sum_TAWtime += a[i].TAWtime; 113 } 114 115 printf("作业名 到达时间 要求服务时间 开始时间 结束时间 周转时间 带权周转时间 "); 116 for(i = 0; i < num; i++) 117 { 118 printf("%s %d %d %d %d %.2f %.2f ", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime); 119 } 120 printf("平均作业周转时间为:%.2lf ",sum_TAtime*1.0/num); 121 printf("平均带权作业周转时间为:%.2lf ",sum_TAWtime*1.0/num); 122 123 } 124 125 126 void SJF(int num) //建立最短作业优先函数 127 { 128 int i, j; 129 float sum_TAtime=0; 130 float sum_TAWtime=0; 131 132 a[0].finitime = a[0].arrtime + a[0].reqtime; 133 a[0].startime = a[0].arrtime; 134 135 for(i = 1; i < num; i++) 136 { 137 for(j = 1; j < num-1; j++) 138 { 139 if(a[j].reqtime > a[j+1].reqtime) 140 { 141 a[num] = a[j]; 142 a[j] = a[j+1]; 143 a[j+1] = a[num]; 144 } 145 } 146 } 147 for(i = 1; i < num; i++) 148 { 149 a[i].startime = a[i-1].finitime; 150 a[i].finitime = a[i-1].finitime + a[i].reqtime; 151 } 152 for(i = 0; i < num; i++) 153 { 154 a[i].TAtime = a[i].finitime - a[i].arrtime; 155 sum_TAtime += a[i].TAtime; 156 a[i].TAWtime = a[i].TAtime / a[i].reqtime; 157 sum_TAWtime += a[i].TAWtime; 158 } 159 160 printf("作业名 到达时间 要求服务时间 开始时间 结束时间 周转时间 带权周转时间 "); 161 for(i = 0; i < num; i++) 162 { 163 printf("%s %d %d %d %d %.2f %.2f ", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime); 164 } 165 printf("平均作业周转时间为:%.2lf ",sum_TAtime*1.0/num); 166 printf("平均带权作业周转时间为:%.2lf ",sum_TAWtime*1.0/num); 167 168 169 } 170 171 172 void HRRF(int num) //建立一个最短作业优先函数 173 { 174 int i, j; 175 float sum_TAtime=0; 176 float sum_TAWtime=0; 177 178 a[0].finitime = a[0].arrtime + a[0].reqtime; 179 a[0].startime = a[0].arrtime; 180 181 for(i = 1; i <num; i++) 182 { 183 for(j = 1; j < num-1; j++) 184 { 185 if(a[j].prio < a[j+1].prio) 186 { 187 if(a[j].arrtime == a[j+1].arrtime) 188 { 189 a[num] = a[j]; 190 a[j] = a[j+1]; 191 a[j+1] = a[num]; 192 } 193 } 194 } 195 } 196 for(i = 1; i <num; i++) 197 { 198 a[i].prio = 1 + (a[i-1].finitime - a[i].arrtime) / a[i].reqtime; 199 a[i].finitime = a[i-1].finitime + a[i].reqtime; 200 } 201 202 for(i = 0; i <num; i++) 203 { 204 a[i].TAtime = a[i].finitime - a[i].arrtime; 205 sum_TAtime += a[i].TAtime; 206 a[i].TAWtime = a[i].TAtime / a[i].reqtime; 207 sum_TAWtime += a[i].TAWtime; 208 } 209 210 printf("作业名 到达时间 要求服务时间 开始时间 结束时间 周转时间 带权周转时间 "); 211 for(i = 0; i < num; i++) 212 { 213 printf("%s %d %d %d %d %.2f %.2f ", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime); 214 } 215 printf("平均作业周转时间为:%.2lf ",sum_TAtime*1.0/num); 216 printf("平均带权作业周转时间为:%.2lf ",sum_TAWtime*1.0/num); 217 218 }
七、运行结果
八、实验总结
这次实验涉及了c语言中很多内容,而自己还有很多不懂,所以做起来有点困难,不过通过这次实验,温习了c语言的一些知识,知道了自己的一些不足