操作系统综合实验报告作业调度算法模拟.docx
《操作系统综合实验报告作业调度算法模拟.docx》由会员分享,可在线阅读,更多相关《操作系统综合实验报告作业调度算法模拟.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统综合实验报告作业调度算法模拟
综合性、设计性实验报告
姓名:
_____张越男_学号______33号______
专业:
软件工程班级_软件1002班_
实验课程名称《计算机操作系统》
指导教师及职称_____宋秋艳____
开课学期2012至_2013学年_第1_学期
实验时间2012-12-8至2012-12-20
湖南科技学院教务处编印
设计题目
作业调度算法模拟
小组合作
是()否(√)
小组成员
张越男
一.实验目的:
1.用高级语言编写和调试单道环境下的作业调度的模拟程序,以加深对作业
调度的理解。
单道环境的特点是被调度的作业占有所有资源。
2.在完成了单道环境的作业调度后,有余力的同学可以完成多道环境下的作
业调度,多道的特点是:
内存中可以同时存在一道以上的进程,所有进程
共享系统资源,这样作业调度过程中还要考虑资源分配情况。
3.通过两种环境下作业调度的模拟,比较两种环境下作业调度的异同,从而
达到理解作业调度的功能。
二.实验要求:
1.复习作业调度的各种算法的思路;
2.认真完成实验内容,并对代码进行测试;
3.完成实验报告,并于17周周三之前由学习委员按学号整理好提交给任课
教师。
4.实验报告要求:
①实验目的;
②源程序并附注释;
③对测试结果进行截图;
三.软硬件环境:
电脑,配置Vc++6.0等软件环境
四.实验内容:
为单道批处理系统设计一个作业调度程序,由于单道批处理系统中,
作业一投入运行,它就占有计算机的一切资源知道作业完成为止,因此调
度作业时不必考虑它所有的资源是否得到满足,它所占用的CPU时限等因
素。
作业调度算法:
①先来先服务调度算法(FCFS);
②短作业优先算法;
③最高响应比调度算法;
④最高优先级调度算法;
输入:
每个作业包括数据项,作业调度所需要的数据项:
作业名、提
交时间、运行时间等。
输出:
要求打印每个作业完成后该作业的开始运行时间、完成时间、
周转时间和平均周转时间。
【源程序】
#include
usingnamespacestd;
structjob
{
charname[20];//作业名
intsubtime;//提交时间
intruntime;//运行时间
intstime;//开始时间
intftime;//完成时间
intztime;//周转时间
intwtime;//等待时间
doubledtime;//带权周转时间
doublerratio;//响应比
};
intflag=0;
doublesumztime,sumdtime;
doubleavgztime,avgdtime;
voidinput(job*p,intn);//输入
voidoutput(job*p,intn);//输出
voiddatahandle(job*p,intn);//数据处理
voidsort(job*p,intn);//按提交时间排序
voidfcfs(job*p,intn);//先来先服务
voidsjf(job*p,intn);//短作业优先
voidhrf(job*p,intn);//最高响应比
intmain()
{
intn;
cout<cout<<"/********计算机操作系统综合实验********/"<cout<<"/***********作业调度算法模拟***********/"<cout<<"/****************张越男****************/"<cout<<"/************2012年12月18日**********/"<cout<<"输入作业数目:
";
cin>>n;
job*a=newjob[n];
input(a,n);
fcfs(a,n);
cout<<"\n";
sjf(a,n);
cout<<"\n";
hrf(a,n);
deletea;
return0;
}
voidinput(job*p,intn)
{
cout<<"请输入作业信息:
"<for(inti=0;i{
cout<<"作业名:
";
cin>>p[i].name;
cout<<"提交时间:
";
cin>>p[i].subtime;
p[i].subtime=(p[i].subtime)/100*60+p[i].subtime%100;
cout<<"运行时间:
";
cin>>p[i].runtime;
p[i].runtime=(p[i].runtime)/100*60+p[i].runtime%100;
cout<<"\n";
}
}
voidoutput(job*p,intn)
{
cout<<"作业调度顺序:
";
for(intk=0;k{
cout<
}
cout<<"\n";
cout<<"name\t"<<"subtime\t"<<"runtime\t"<<"stime\t"<<"ftime\t"<<"ztime\t"<<"dtime\t"<for(inti=0;i{
cout<
cout<
cout<
cout<
cout<
cout<<(int)p[i].dtime/60*100+p[i].dtime-((int)p[i].dtime)/60*60<}
cout<<"平均周转时间="<cout<<"平均带权周转时间="<}
voidsort(job*p,intn)
{
for(inti=n-1;i>=1;i--)
for(intj=0;j
if(p[i].subtime>p[j+1].subtime)
{
jobtemp;
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
voiddatahandle(job*p,intn)
{
sumztime=sumdtime=0;
p[0].stime=p[0].subtime;
p[0].ftime=p[0].subtime+p[0].runtime;
for(inti=1;i{
if(p[i-1].ftime>p[i].subtime)
{
p[i].stime=p[i-1].ftime;
p[i].ftime=p[i-1].ftime+p[i].runtime;
/*这里要特别小心,刚开始没考虑到下一个的开始时间可能大于上一个
的结束时间*/
}
else
{
p[i].stime=p[i].subtime;
p[i].ftime=p[i].subtime+p[i].runtime;
}
}
for(intj=0;j{
p[j].ztime=p[j].ftime-p[j].subtime;
p[j].dtime=p[j].ztime*1.0/p[j].runtime*1.0;
sumztime+=p[j].ztime;
sumdtime+=p[j].dtime;
}
avgztime=sumztime/n;
avgdtime=sumdtime/n;
}
voidfcfs(job*p,intn)
{
sort(p,n);
datahandle(p,n);
cout<<"先来先服务调度算法:
"<output(p,n);
}
voidsjf(job*p,intn)
{
sort(p,n);
for(inti=0;i{
intk=0;
if(i==0)
p[i].ftime=p[i].subtime+p[i].runtime;
else
p[i].ftime=p[i].runtime+p[i-1].ftime;
for(intj=i+1;j{
if(p[j].subtime<=p[i].ftime)
k++;
}
doubleminstime=p[i+1].runtime;
intps=i+1;
for(intm=i+1;m
{
if(p[m+1].runtime{
minstime=p[m+1].runtime;
ps=m+1;
}
}
jobtemp;
temp=p[i+1];
p[i+1]=p[ps];
p[ps]=temp;
}
datahandle(p,n);
cout<<"短作业优先算法:
"<output(p,n);
}
voidhrf(job*p,intn)
{
sort(p,n);
for(inti=0;i{
intk=0;
if(i==0)
p[i].ftime=p[i].subtime+p[i].runtime;
else
p[i].ftime=(p[i].runtime+p[i-1].ftime);
for(intj=i+1;j{
if(p[j].subtime<=p[i].ftime)
k++;
}
doublemaxrratio=(p[i].ftime-p[i+1].subtime)/(1.0*p[i+1].runtime);
intps=i+1;
for(intm=i+1;m
{
if((p[i].ftime-p[m+1].subtime)/p[m+1].runtime>=maxrratio)
{
maxrratio=(p[i].ftime-p[m+1].subtime)/(1.0*p[m+1].runtime);
ps=m+1;
}
}
jobtemp;
temp=p[i+1];
p[i+1]=p[ps];
p[ps]=temp;
}
datahandle(p,n);
cout<<"最高响应比调度算法:
"<output(p,n);
}
五.实验结果
1输入作业数目:
4
输入作业信息:
作业名:
job1作业名:
job2
提交时间:
800提交时间:
850
运行时间:
200运行时间:
50
作业名:
job3作业名:
job4
提交时间:
900提交时间:
950
运行时间:
10运行时间:
20
2如果自己输入的顺序不是按时间顺序输入的或者第一个作业结束的时候
第二个作业还没开始:
六.实验总结:
首先写代码的时候没考虑到一个问题,也就是下一个作业的开始时间可
能大于上一个作业的结束时间,直接算出:
p[i].ftime=p[i-1].ftime+p[i].runtime;
但这是错误的,因为可能第一个作业结束的时候,第二个作业还没开始。
所以经过调试,把它修改为:
if(p[i-1].ftime>p[i].subtime)
{
p[i].stime=p[i-1].ftime;
p[i].ftime=p[i-1].ftime+p[i].runtime;
}
else
{
p[i].stime=p[i].subtime;
p[i].ftime=p[i].subtime+p[i].runtime;
}
所以在写代码之前一定要考虑好各种可能出现的情况。
之后,是浮点数和整型数之间的问题。
比如,计算带权周转时间的时候
必须要(p[j].dtime=p[j].ztime*1.0/p[j].runtime*1.0)乘以1.0!
因为
runtime,ztime都是整型数。
最后,虽然本次实验占用了我很多时间和精力,但完完整整的做出整个
实验后还是很替自己高兴。
总的来说,收获很多。
七.指导老师评语及得分:
签名:
年月日