实验2作业调度
物联网 林尤鑫
1. 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
2.实验要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间
二、实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、实验环境
可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。
三、 实验方法、步骤及结果测试
1.源程序名RIPS.c
可执行程序名:RIPS.exe
2.原理分析及流程图
首先输入作业然后进行选择3种。
3.主要程序段及其解释:
1 #include<stdio.h> 2 #include<string.h> 3 #define J 100 4 typedef struct Tony{ 5 char name[50]; 6 int enter; 7 int start; 8 int run; 9 int finish; 10 int total; 11 float respond; 12 }t; 13 void fcf(t job[],int n) 14 { 15 int y,a,i,trick=0; 16 t jobtemp; 17 for(y=0;y<n;y++) 18 { 19 for(a=y+1;a<n;a++) 20 { 21 if(job[a].enter<job[y].enter) 22 { 23 strcpy(jobtemp.name,job[a].name); 24 strcpy(job[a].name,job[y].name); 25 strcpy(job[y].name,jobtemp.name); 26 jobtemp.enter=job[a].enter; 27 job[a].enter=job[y].enter; 28 job[y].enter=jobtemp.enter; 29 jobtemp.run=job[a].run; 30 job[a].run=job[y].run; 31 job[y].run=jobtemp.run; 32 } 33 } 34 } 35 for(y=0;y<n;y++) 36 { 37 if(job[y].enter<=trick) 38 job[y].start=trick; 39 else 40 job[y].start=job[y].enter; 41 trick=job[y].run+job[y].start; 42 job[y].finish=job[y].run+job[y].start; 43 job[y].total=job[y].finish-job[y].enter; 44 job[y].respond=(float)(job[y].total)/(float)(job[y].run); 45 } 46 printf("\n\nJesus! you've finished FCFS,congratulations!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 47 for(i=0;i<n;i++) 48 { 49 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 50 } 51 } 52 void hrr(t job[],int n) 53 { 54 int i,s; 55 int now=0; 56 t jobtemp; 57 for(s=0;s<n;s++) 58 { 59 for(i=s+1;i<n;i++) 60 { 61 if((job[s].enter>job[i].enter)||((job[s].enter==job[i].enter)&&(job[s].run<job[i].run))) 62 { 63 strcpy(jobtemp.name,job[s].name); 64 strcpy(job[s].name,job[i].name); 65 strcpy(job[i].name,jobtemp.name); 66 jobtemp.enter=job[s].enter; 67 job[s].enter=job[i].enter; 68 job[i].enter=jobtemp.enter; 69 jobtemp.run=job[s].run; 70 job[s].run=job[i].run; 71 job[i].run=jobtemp.run; 72 } 73 } 74 } 75 for(s=0;s<n;s++) 76 { 77 if(job[s].enter<=now) 78 job[s].start=now; 79 else 80 job[s].start=job[s].enter; 81 now=job[s].start+job[s].run; 82 job[s].finish=now; 83 job[s].total=job[s].finish-job[s].enter; 84 job[s].respond=(float)(job[s].total)/(float)(job[s].run); 85 } 86 printf("\n\nGoddamn it! hrr complete,excellent job!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 87 for(i=0;i<n;i++) 88 { 89 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 90 } 91 } 92 void secon(t job[],int n) 93 { 94 int d,s,i,now=0; 95 t jobtemp; 96 for(d=0;d<n;d++) 97 { 98 for(s=d+1;s<n;s++) 99 { 100 if((job[d].run>=job[s].run)&&(job[d].enter>=job[s].enter)) 101 { 102 strcpy(jobtemp.name,job[d].name); 103 strcpy(job[d].name,job[s].name); 104 strcpy(job[s].name,jobtemp.name); 105 jobtemp.enter=job[d].enter; 106 job[d].enter=job[s].enter; 107 job[s].enter=jobtemp.enter; 108 jobtemp.run=job[d].run; 109 job[d].run=job[s].run; 110 job[s].run=jobtemp.run; 111 } 112 } 113 } 114 for(d=0;d<n;d++) 115 { 116 if(job[d].enter<=now) 117 job[d].start=now; 118 else 119 job[d].start=job[d].enter; 120 now=job[d].start+job[d].run; 121 job[d].finish=now; 122 job[d].total=job[d].finish-job[d].enter; 123 job[d].respond=(float)(job[d].total)/(float)(job[d].run); 124 } 125 printf("\n\nJesus! you've finished SJF,well done!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 126 for(i=0;i<n;i++) 127 { 128 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 129 } 130 } 131 main() 132 { 133 t job [J]; 134 int n,i,w; 135 printf("The copyright is mine-Tony Chan,do not be a copycat,thx!\n\n now just enjoy the fascinating C#project~~\n\n"); 136 printf("enter the quantity of the array: "); 137 scanf("%d",&n); 138 printf("please input na en run respectively :-) \n"); 139 for(i=0;i<n;i++) 140 { 141 printf("this is NO.%d\n",i+1); 142 scanf("%s",&job[i].name); 143 scanf("%d",&job[i].enter); 144 scanf("%d",&job[i].run); 145 } 146 printf("Now you got %d job(s)\n",n); 147 printf("name\tenter\trun\n"); 148 for(i=0;i<n;i++) 149 { 150 printf("%s\t%d\t%d\n",job[i].name,job[i].enter,job[i].run); 151 } 152 do{ 153 printf("\n\nWhich methods you are eager to choose ? :-) \n 1.fcf 2.hrr 3.secon (pressing other number means quit)\n"); 154 scanf("%d",&w); 155 switch(w) 156 { 157 case 1: 158 fcf(job,n); 159 break; 160 case 2: 161 hrr(job,n); 162 break; 163 case 3: 164 secon(job,n); 165 break; 166 default: 167 w=0; 168 break; 169 } 170 }while(w); 171 }
四、 实验总结
这次实验十分地有难度,不过上网查了很多例子之后感悟良多!