进程调度算法实验报告.docx
《进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
![进程调度算法实验报告.docx](https://file1.bdocx.com/fileroot1/2023-4/21/cf5ecec1-c6d2-487e-8071-da7fc8bb6a29/cf5ecec1-c6d2-487e-8071-da7fc8bb6a291.gif)
进程调度算法实验报告
进程调度算法实验报告
LT
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,在修改代码的过程中,提高了自己编写代码的能力。