实验二作业调度模拟程序.docx
《实验二作业调度模拟程序.docx》由会员分享,可在线阅读,更多相关《实验二作业调度模拟程序.docx(14页珍藏版)》请在冰豆网上搜索。
实验二作业调度模拟程序
实验二作业调度模拟程序
专业:
08信息管理与信息系统
姓名:
黄赞润
学号:
200806054113
一、实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。
作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。
总是首先调度在系统中等待时间最长的作业。
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:
作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。
每个作业的最初状态都是等待W。
一、模拟数据的生成
1.允许用户指定作业的个数(2-24),默认值为5。
2.允许用户选择输入每个作业的到达时间和所需运行时间。
3.(**)从文件中读入以上数据。
4.(**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。
二、模拟程序的功能
1.按照模拟数据的到达时间和所需运行时间,执行FCFS,SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间。
2.动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。
3.(**)允许用户在模拟过程中提交新作业。
4.(**)编写并调度一个多道程序系统的作业调度模拟程序。
只要求作业调度算法:
采用基于先来先服务的调度算法。
对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
三、模拟数据结果分析
1.对同一个模拟数据各算法的平均周转时间,平均带权周转时间比较。
2.(**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。
四、其他要求
1.完成报告书,内容完整,规格规范。
三、实验方法、步骤及结果测试
1.源程序名:
压缩包文件(zip)中源程序名run.c
可执行程序名:
run.exe
2.原理分析及流程图
程序主要为带指针的结构体存储
structjcb
{
charname[10];
intartime;/*到达shijian*/
intrqtime;/*服务*/
intsttime;/*调度*/
intfntime;/*完成*/
floattat;/*周转*/
floattaw;/*带权*/
floatr;/*优先权*/
charstatut;/*状态*/
structjcb*link;/*结构体指针*/,调用相关功能的子函数,实现程序!
流程图:
voidstart()//输入作业数和选择作业方式,调用input和run子函数
voidinput()//子程序--输入作业数据
voidrun(intm)//开始运算,通过for(i=0;i判断到达且状态为未到达的作业。
并把状态转为到达,然后通过switch对M进行判断选择,m=1调用fcfs,m=2为sjf,m=3调用hrn。
WN*fcfs(intm)//对作业进行排序。
返回指针*t
WN*sjf(intm)//对作业要求时间进行由小到大排序,返回*min
WN*hrn(intm)//调用jisuanr,计算权值,然后对作业优先权值进行由小到大排序,返回*min
voidjisuanr()//计算作业优先权值。
running(WN*p,intm)//将FCFS的*p或者SJF和HRN的*min传递到running,然后进行A状态转换到R状态,计算调用时间等。
voidprint(intm)//输出各状态作业。
voidprint2(WN*pr,intm)//输出最后结果
voidlast()//计算平均TAT平均TAW
main()//主函数
{
start();
last();
printf("\n结束\n");
getchar();
getchar();
}
算法实现:
存储结构为带指针的结构体,
关键函数:
包括三种作业调度方式。
与关于作业数的总循环。
主要算法实现:
通过do{}while();函数做关于指针的遍历循环,通过子函数调用,实现程序逻辑。
3.主要程序段及其解释:
首先通过structjcb{};定义带指针结构体,主函数只有main()
{
start();
last();
printf("结束");
}
其他由子函数相互调用实现。
通过for(i=0;i通过do{
if(p->statut=='u'&&p->artime<=time)
{
p->statut='a';
p=p->link;
iden=0;
}
else
p=p->link;
}while(p!
=NULL);
对已经到达的作业进行从’U’(未到达)到’A’(到达)状态转化,其中iden为标记是否有作业到达,为1的话则表示无作业到达,执行
if(iden)
{
i--;
time++;
}
直到有作业到达,iden变为0
通过switch(m)
{
case1:
p=fcfs(m);/*running*/
running(p,m);
break;
case2:
min=sjf(m);/*running*/
running(min,m);
break;
case3:
min=hrn(m);/*running*/
running(min,m);
break;
}
实现选择调度方式,并通过running子函数运行作业,其中min皆为由子函数调回的最短作业指针和最小权值指针。
通过voidjisuanr()/*计算优先权值*/
{
WN*s;
s=head;
do{
if(s->statut=='a')
s->r=(float)(time-s->artime+s->rqtime)/s->rqtime;
s=s->link;
}while(s!
=NULL);
}
通过running(WN*p,intm)运行作业并计算
{
p->sttime=time;
p->statut='r';/*a->r*/
p->fntime=p->sttime+p->rqtime;
p->tat=(float)p->fntime-p->artime;
p->taw=(float)p->tat/p->rqtime;
atat=atat+p->tat;
ataw=ataw+p->taw;
print(p,m);
p->statut='f';/*r->f*/
time=p->rqtime+time;
printf("按回车继续");
getch();
}
其中有A到R(运行中)和R到F(完成)的状态转化。
通过voidprint2(WN*pr,intm)
{
p=head;/*完成*/
printf("\n\n系统时间为=%d",time);
printf("\n全部作业已经完成:
\n");
do{
if(p->statut=='f')
{
if(m==3){
printf("%s\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\t%f\n",
p->name,p->artime,p->rqtime,p->sttime,p->fntime,p->tat,p->taw,p->r);
}
else{
printf("%s\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\t%f\n",
p->name,p->artime,p->rqtime,p->sttime,p->fntime,p->tat,p->taw);
}
}
p=p->link;
}while(p!
=NULL);
}
输出全部作业!
4.运行结果及分析
测试1:
调度方式的选择!
FCFS的结果(与SJF一样)
测试2
方式为FCFS
结果为
方式为SJF
结果为
方式为HRN
结果为
自测:
数据如上,方式为FCFS
结果为
数据如上,方式为SJF
结果为
数据如上,方式为HRN
结果为
结果与预想符合,结论:
程序能正常运行,且结果正确!
四、实验总结
这次实验让我从所未有的累,这是一个几乎结合了之前关于C语言知识,可以说是第一次用很多零碎的知识拼凑成一个程序,一个月的时间让我懂得如何去编程,事先有正确的逻辑,流程图和伪代码成为必须的工具,之前那种想到什么编什么的方式已经不适用。
虽然这次实验有参照有关程序,但还是靠自己一步一步探索做出来了,也克服了对指针和子函数迷漫,也克服了长程序无从下手的恐惧感,实验最后顺利完成!