进程调度算法实验报告.docx
《进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.docx(19页珍藏版)》请在冰点文库上搜索。
进程调度算法实验报告
进程调度算法实验报告
作业调度
一、实验名称
作业调度算法
二、实验目标
在单道环境下编写作业调度的模拟程序,以加深对作业调度的理解。
单道环境的特点使被调度的作业占有所有的资源。
实现的算法有先来先服务,最短作业优先,最高响应比三种作业调度算法。
三、实验环境要求:
1.PC机。
2.Windows;
3.CodeBlocks
四、实验基本原理
1.本实验设计一个可指定作业个数的作业调度系统。
可以输出先来先服务,最短作业优先,最高响应比三种作业调度算法的结果。
2.先来先服务就是按照各个作业进入系统的自然次序进行调度。
最短作业优先就是优先调度并且处理短作业。
最高响应比优先就是根据在程序运行过程中的最高响应比对应的作业先进行调度处理。
3.在设计程序过程中,将time相关的内容封装到类中,重载了加减乘除和输入输出以及比较运算符,方便12:
00这种形式的数据的加减乘除运算和比较
运算,
五、数据结构设计
1.时间类
classtime{
public:
time(intx=0,inty=0){
time:
:
hour=x;
time:
:
minute=y;
}
time&operator=(consttime&t1)
{
this->hour=t1.hour;
this->minute=t1.minute;
return*this;
}
timeoperator+(timet2)
{
intminutes,hours;
minutes=(minute+t2.minute)%60;hours=hour+t2.hour+(minute+t2.minute)/60;returntime(hours,minutes);
}
timeoperator-(timet2)
{
intminutes,hours;
minutes=minute-t2.minute;if(minute<0){
minutes+=60;
hour--;
}
hours=hour-t2.hour;
returntime(hours,minutes);
}
friendbooloperator<(timet1,timet2)
{
if(t1.hourreturntrue;
}
elseif(t1.hour==t2.hour){
if(t1.minute<=t2.minute){
returntrue;
}
}
returnfalse;
}
friendostream&operator<<(ostream&out,consttime&t1){returnout<"<}
friendistream&operator>>(istream&in,time&t1){
inth,m;
scanf("%d:
%d",&h,&m);
t1.hour=h;
t1.minute=m;
returnin;
}
public:
inthour;
intminute;
};
2•作业内容
typedefstructJOB{
charname[20];//Jobname
timein_time;
intrun_time;
timest_time;
timeend_time;
intround_time;〃周转时间
intwait_time;
doublerounds_time;//带权周转
doublereson_radio;〃响应比
}job;
六、流程图
七、源代码
#include
#include
#include
#includeusingnamespacestd;classtime{public:
time(intx=0,inty=0){time:
:
hour=x;
time:
:
minute=y;
}
time&operator=(consttime&t1)
{
this->hour=t1.hour;
this->minute=t1.minute;
return*this;
}
timeoperator+(timet2)
{
intminutes,hours;
minutes=(minute+t2.minute)%60;
hours=hour+t2.hour+(minute+t2.minute)/60;
returntime(hours,minutes);
}
timeoperator-(timet2)
{
intminutes,hours;
minutes=minute-t2.minute;
if(minute<0){
minutes+=60;
hour--;
}
hours=hour-t2.hour;
returntime(hours,minutes);
}
friendbooloperator<(timet1,timet2)
{
if(t1.hour}
elseif(t1.hour==t2.hour){
if(t1.minute<=t2.minute){returntrue;
}
}
returnfalse;
}
out,
<<
friendostream&operator<<(ostream&consttime&t1){
returnout<"tl.minute*1.00;
}
friendistream&operator>>(istream&n,time&t1){
inth,m;
scanf("%d:
%d",&h,&m);
tl.hour=h;
tl.minute=m;
returnin;
}
public:
inthour;
intminute;
};
typedefstructJOB{
charname[20];//Jobname
timein_time;
intrun_time;
timest_time;
timeend_time;
intround_time;〃周转时间
intwait_time;
doublerounds_time;〃带权周转
doublereson_radio;〃响应比
}job;
doublesum_time;〃全部作业周转时间和
doublesums_time;〃全部作业带权周转时间和intn;//jobcounts
〃重载max
timemaxn(timet1,timet2){
if(t1.hour>t2.hour){
returnt1;
}
elseif(t1.hour==t2.hour){
if(t1.minute>t2.hour){
returnt1;
}
returnt2;
//eg:
120转化成2:
0
timem_exchange_h(intrun_time){
timerun;
run.hour=run_time/60;
run.minute=run_time%60;
returnrun;
}
//eg:
2:
0转化成120
inth_exchange_m(timet1){
returntl.hour*60+tl.minute;
}
〃先来先服务;
voidjob_input(job*x){
cout<<"作业\t进入时间\t估计运行时间份钟)\t开始时间\t结束时间\t周转时间(分钟)\t带权周转时间"<for(inti=0;icout<"\t\t"«x[i].end_timevv"\t\t"v<<
}
<<
cout<<"作业平均周转时间T="sum_time/n<cout<<"作业平均带权周转时间T="
sums_time/n<}
voidFCFS(job*x){
sum_time=0;
sums_time=0;
timerun=m_exchange_h(x[0].run_time);x[0].st_time=x[0].in_time;
x[0].end_time=x[0].st_time+run;
x[0].round_time
h_exchange_m(x[0].end_time-x[0].in_time);sum_time+=x[0].round_time;
x[0].rounds_time=x[0].round_time*1.0
x[0].run_time;
sums_time+=x[0].rounds_time;
for(inti=1;ix[i].st_time=maxn(x[i].in_time,x[i
1].end_time);
x[i].end_time=x[i].st_time
m_exchange_h(x[i].run_time);
x[i].round_time
h_exchange_m(x[i].end_time-x[i].in_time);
x[i].rounds_time=x[i].round_time*1.0
x[i].run_time;
sum_time+=x[i].round_time;
sums_time+=x[i].rounds_time;
}
cout<<"\n【先来先服务作业调度算法计算结果】\n"<job_input(x);
}
〃短作业优先;
voidSJF(job*x){
intflag[100000];
memset(flag,0,sizeof(flag));
sum_time=0;
sums_time=0;
timerun=m_exchange_h(x[0].run_time);
x[0].st_time=x[0].in_time;
x[O].end_time=x[O].st_time+run;
x[0].round_time=
h_exchange_m(x[O].end_time-x[O].in_time);
sum_time+=x[0].round_time;
x[0].rounds_time=x[0].round_time*1.0/
x[0].run_time;
sums_time+=x[0].rounds_time;
inti=1;//已经运行的程序
inte=0;//上一个运行的程序
flag[0]=1;
while(iinttemp=-1;
inttime_min=99999999;
for(intj=1;jif
(x[j].in_time=1&&x[j]
.run_time〃cout<<"小于:
"<time_min=x[j].run_time;
temp=j;
}
if(temp!
=-1){
x[temp].st_time=x[e].end_time;
e=temp;
}
else{
e++;
x[e].st_time=x[e].in_time;
}
x[e].end_time=x[e].st_time+
m_exchange_h(x[e].run_time);
x[e].round_time=
h_exchange_m(x[e].end_time-x[e].in_time);
x[e].rounds_time=x[e].round_time*1.0/x[e].run_time;
sum_time+=x[e].round_time;
sums_time+=x[e].rounds_time;
flag[e]=1;
i++;
}
cout<<"\n【短作业优先调度算法计算结果】
\n"<job_input(x);
}
〃最高响应比优先;
voidHRN(job*x){
intflag[1OOOOO];
memset(flag,0,sizeof(flag));
sum_time=0;
sums_time=0;
timerun=m_exchange_h(x[0].run_time);
x[0].st_time=x[0].in_time;
x[0].end_time=x[0].st_time+run;
x[0].round_time=
h_exchange_m(x[0].end_time-x[0].in_time);
sum_time+=x[0].round_time;
x[0].rounds_time=x[0].round_time*1.0/
x[0].run_time;
sums_time+=x[0].rounds_time;
inti=1;//已经运行的程序
inte=0;//上一个运行的程序
flag[0]=1;
while(iinttemp=-1;
doubleradio_max=0;
for(intj=1;jif
(x[j].in_time=1){
x[j].reson_radio=h_exchange_m(x[e].end_time-x[j].in_time)*1.0/x[j].run_time;
if(x[j].reson_radio>radio_max){temp=j;
radio_max=x[j].reson_radio;
}
}
}
if(temp!
=-1){
x[temp].st_time=x[e].end_time;
e=temp;
}
else{
e++;
x[e].st_time=x[e].in_time;
}
m_exchange_h(x[e].run_time);
x[e].round_time=
h_exchange_m(x[e].end_time-x[e].in_time);
x[e].rounds_time=x[e].round_time*1.0/x[e].run_time;
sum_time+=x[e].round_time;
sums_time+=x[e].rounds_time;
flag[e]=1;
i++;
}
cout<<"\n【最高响应比调度算法计算结果】
\n"<job_input(x);
}
intmain()
{
cout<<"作业总数:
";
cin>>n;
cout<job*jobs=newjob[n];
cout<<"作业信息输入(请按照进入时间先后
顺序输入):
"<for(inti=0;icout<<"正在读入第"<
"<cout«endl;
cout<<"作业名称:
";
cin>>jobs[i].name;
cout<<"作业进入时间:
";cin>>jobs[i].in_time;
cout<<"作业估计运行时间(分钟):
";
cin>>jobs[i].run_time;
}
//先来先服务;
FCFS(jobs);
//短作业优先;
SJF(jobs);
//最高响应比优先;
HRN(jobs);
return0;
八、运行结果
1]
CftLteefMlamcTjDesktcipi抵花■业遇1悄手沪」三[丄审荃栏廿汪谒&已归
L'l
|乍!
h;
W
-J-U
.忏壬小审『诽二:
H雅计运行时同旳呻):
皿
(aHKjSAir->■•'•'-1:
TO••-:
:
IIE^
5:
4
.卜].
□Sfd:
J<'B
S:
W
叩才沖);
i1014
BJ1:
勺:
池花丽
纠LAsefMlengjDeskfiapy條惟业曲傾*』三[M肓室理,汪谒度心旧
址人时间估计运讦时间吩钟)
S:
CJ20
8:
TOTO
9;010
勺・5020
亚賈油矚卫T-112-5'才丰"視朗瓦T”.叶
a=i.i12翊
「24
:
!
'
J0:
Oin:
-'11:
0
10!
&10加
11:
D
1:
:
20
学严间【井神:
宇权周停工间
1202.4
12013
知4.5
■:
E4
时
sft?
roFsb^-"fcT■8,?
■.“¥.营
SH-NrFE.uchFTT^I.
估计-STO司吩钟)
120
5-J
PJ
20
T/5
时阎1^3.25
幵1rbm
B:
0luuO10;J1J;1U
塔朿时同
10;0
11;2j
:
!
;:
」
1j;3■
同诘时司•井沖J•菸札剧町司12D
15>>
40
【昱土lh「:
丄诣卡且--去-半】
-.IF-.Bl囘
均MHI■LX
Up行盯间唏沖)
12U
50
in
2C
1*102.5
S'T=177^
幵纭时司
3£0
10:
10
10:
0
li:
:
同
时
耒uH-I2结芒11:
=
rai^rB|〔歼钟:
當和郦轲同
1201
1392.6
TQT
304-S
九、结果分析
三种算法根据输入得出的输出和书上的结果相符,证明算法实现正确。
但是略有不足的是没有实现多道程序下的作业调度,可以进一步补充。
十、本次实验体会
通过实验编写作业调度算法,对作业调度的三种算法有了更加深刻的了解。
在实现单道环境之余,复习了两道环境下的作业调度。
对作业调度有了更加全面的理解。
在实现代码的时候用到了类的重载,复习了C++面向对象知识。
同时实现算法的时候也发生了很多因为粗心导致的bug,在修改代码的过程
中,提高了自己编写代码的能力。