进程调度算法实验报告.docx
《进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.docx(16页珍藏版)》请在冰点文库上搜索。
进程调度算法实验报告
作业调度
一、实验名称
作业调度算法
二、实验目标
在单道环境下编写作业调度的模拟程序,以加深对作业调度的理解。
单道环境的特点使被调度的作业占有所有的资源。
实现的算法有先来先服务,最短作业优先,最高响应比三种作业调度算法。
三、实验环境要求:
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
#include
usingnamespacestd;
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;
};
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){
returnt1.hour*60+t1.minute;
}
//先来先服务;
voidjob_input(job*x){
cout<<"作业\t进入时间\t估计运行时间(分钟)\t开始时间\t结束时间\t周转时间(分钟)\t带权周转时间"<for(inti=0;icout<}
cout<<"作业平均周转时间T="<cout<<"作业平均带权周转时间T="<}
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[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;
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[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[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;
}
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);
}
intmain()
{
cout<<"作业总数:
";
cin>>n;
cout<job*jobs=newjob[n];
cout<<"作业信息输入(请按照进入时间先后顺序输入):
"<for(inti=0;icout<cout<<"正在读入第"<
"<cout<cout<<"作业名称:
";
cin>>jobs[i].name;
cout<<"作业进入时间:
";
cin>>jobs[i].in_time;
cout<<"作业估计运行时间(分钟):
";
cin>>jobs[i].run_time;
}
//先来先服务;
FCFS(jobs);
//短作业优先;
SJF(jobs);
//最高响应比优先;
HRN(jobs);
return0;
}
八、运行结果
九、结果分析
三种算法根据输入得出的输出和书上的结果相符,证明算法实现正确。
但是略有不足的是没有实现多道程序下的作业调度,可以进一步补充。
十、本次实验体会
通过实验编写作业调度算法,对作业调度的三种算法有了更加深刻的了解。
在实现单道环境之余,复习了两道环境下的作业调度。
对作业调度有了更加全面的理解。
在实现代码的时候用到了类的重载,复习了C++面向对象知识。
同时实现算法的时候也发生了很多因为粗心导致的bug,在修改代码的过程中,提高了自己编写代码的能力。