操作系统作业调度实验Word格式.docx
《操作系统作业调度实验Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统作业调度实验Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
intminute;
};
structJob//作业
stringjobname;
//作业名
timeintime;
//进入时间
intruntime;
//作业估计运行时间
timestarttime;
//作业开始时间
timeendtime;
//作业结束时间
intcycletime;
//作业周转时间
floatcltime;
//作业带权周转时间
boolhaverun;
//是否已运行
六、流程图
图1作业调度算法流程图
七、源代码
#include<
iostream>
string>
usingnamespacestd;
floatT=0;
//作业平均周转时间
floatW=0;
//作业带权平均周转时间
voidshowInput(Jobjob[],int&
n)//输入提示
cout<
<
"
**********请按作业进入时间先后顺序输入*********"
endl;
for(inti=0;
i<
n;
i++)
{
cout<
作业"
i+1<
:
作业名:
;
cin>
>
job[i].jobname;
作业进入时间:
scanf("
%d:
%d"
&
job[i].intime.hour,&
job[i].intime.minute);
作业估计运行时间:
job[i].runtime;
job[i].starttime.hour=0;
job[i].starttime.minute=0;
job[i].endtime.hour=0;
job[i].endtime.minute=0;
job[i].cycletime=0;
job[i].cltime=0;
job[i].haverun=false;
//标记为未运行
*********************"
}
}
voidInit(Jobjob[],int&
n)//初始化
T=0;
W=0;
voidshowTime(timetime)//显示时间
time.hour<
time.minute;
inttimeDiff(timet1,timet2)//计算时间差,时间t1比t2大
returnt1.hour*60+t1.minute-(t2.hour*60+t2.minute);
timetimeAdd(timetime,intaddtime)//时间相加
time.hour+=addtime/60;
time.minute+=addtime%60;
if(time.minute>
=60)
time.hour++;
time.minute-=60;
returntime;
boolcomtime(timet1,timet2)//比较两个时间的大小,第一个大就返回TRUE
if(t1.hour>
t2.hour)
returntrue;
elseif(t1.hour==t2.hour&
&
t1.minute>
=t2.minute)
else
returnfalse;
voidshowResult(Jobjob[],int&
n)//显示结果
jobname\tintime\truntime\tsttime\tendtime\t周转时间(分钟)\t带权周转时间"
*******************************************************************"
job[i].jobname<
\t"
showTime(job[i].intime);
job[i].runtime<
showTime(job[i].starttime);
showTime(job[i].endtime);
\t"
job[i].cycletime<
\t\t"
job[i].cltime<
作业平均周转时间:
T="
T/(n*1.0)<
作业带权平均周转时间:
W="
W/(n*1.0)<
intminRuntime(Jobjob[],int&
n,time&
t)//找出作业中最短作业下标
intmin=-1;
if(job[i].haverun==false&
comtime(t,job[i].intime)==true)
{
min=i;
break;
}
for(intj=min+1;
j<
j++)
if(job[j].haverun==false&
job[j].runtime<
job[min].runtime&
comtime(t,job[j].intime)==true)
min=j;
returnmin;
voidSJF(Jobjob[],int&
n)//短作业优先作业调度
structtimet;
job[0].starttime.hour=job[0].intime.hour;
job[0].starttime.minute=job[0].intime.minute;
job[0].endtime=timeAdd(job[0].starttime,job[0].runtime);
job[0].haverun=true;
job[0].cycletime=timeDiff(job[0].endtime,job[0].intime);
job[0].cltime=job[0].cycletime*1.0/job[0].runtime;
T+=job[0].cycletime;
W+=job[0].cltime;
t=job[0].endtime;
while(minRuntime(job,n,t)!
=-1)
inti=minRuntime(job,n,t);
if(comtime(job[i].intime,t))
job[i].starttime=job[i].intime;
else
job[i].starttime=t;
job[i].endtime=timeAdd(job[i].starttime,job[i].runtime);
job[i].haverun=true;
job[i].cycletime=timeDiff(job[i].endtime,job[i].intime);
job[i].cltime=job[i].cycletime*1.0/job[i].runtime;
T+=job[i].cycletime;
W+=job[i].cltime;
t=job[i].endtime;
intFirstintime(Jobjob[],int&
n)//找出作业中最先到的
if(job[i].haverun==false)
}
comtime(job[min].intime,job[j].intime))
voidFCFS(Jobjob[],int&
n)//先来先服务作业调度
while(Firstintime(job,n)!
inti=Firstintime(job,n);
voidmain()
请输入作业数:
intn;
//作业数
cin>
Job*job=newJob[n];
if(n<
=0)
输入不合法!
exit(-1);
showInput(job,n);
FCFS(job,n);
先来先服务:
showResult(job,n);
Init(job,n);
SJF(job,n);
//短作业优先
短作业优先:
system("
pause"
);
八、运行结果
用户输入作业的相关信息,程序输出相应的各种算法运行结果。
以下为程序运行后的输出数据:
输入信息:
运行结果:
九、结果分析
(1)先来先服务输出数据分析:
作业1至作业4的提交时间分别为 8:
00、8:
50、9:
00、9:
50。
所以作业的执行序列为作业1、作业2、作业3和作业4。
前一个作业的完成时间即为后一个作业的开始时间。
(2)短作业优先输出数据分析:
系统时间
时间8:
00 :
作业1提交,马上被调度运行,开始时间为8:
00,运行时间为2:
00。
50 :
作业2提交,因作业1在运行,故作业2暂时等待。
时间9:
作业3提交,因作业1在运行,故作业3暂时等待。
作业4提交,因作业1在运行,故作业4暂时等待。
时间10:
作业1完成,进入完成队列。
目前提交的作业有:
作业2、作业3、作业4;
按短作业优先原则,作业3运行时间为0:
10最短,故作业3被调度运行。
作业2和作业4继续等待。
10 :
作业3完成,进入完成队列。
作业2和作业4。
按短作业优先原则,作业4的运行时间为0:
20最短,故作业4被调度运行,作业2继续等待。
30 :
作业4完成,进入完成队列。
目前提交的作业仅有作业2,故作业2被调度运行,运行时间为0:
5。
时间11:
20 :
作业2完成,进入完成队列。
程序执行完毕。
十、本次实验体会
加深了对作业的理解,掌握了基本的作业调度算法。
通过对各种作业调度算法的综合比较,理解各种算法的优劣。
十一、参考资料
(1)陈向群杨芙清著《操作系统教程》北京大学出版社
(2)AndrewS.Tanenbaum著陈向群马洪兵等译《现代操作系统》机械工业出版社