实验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 }
四、 实验总结
这次实验十分地有难度,不过上网查了很多例子之后感悟良多!

浙公网安备 33010602011771号