作业调度先来先服务实验分析Word下载.docx
- 文档编号:19356888
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:33
- 大小:411.52KB
作业调度先来先服务实验分析Word下载.docx
《作业调度先来先服务实验分析Word下载.docx》由会员分享,可在线阅读,更多相关《作业调度先来先服务实验分析Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
intfinishtime;
//作业完成时间
floatcycletime;
//作业周转时间
floatcltime;
//作业带权周转时间
charstate;
//作业状态
structjcb*next;
//结构体指针
}*ready=NULL,*p,*q;
typedefstructjcbJCB;
voidinize()//初始化界面
printf("
\n\n\t\t*********************************************\t\t\n"
);
\t\t\t\t单道批处理作业调度系统\n"
\t\t*********************************************\t\t\n"
\n\n\n\t\t\t\t软件143赵媛媛\n\n"
\t\t\t\t\t\n"
\n\n\n\t\t请输入任意键进入……\n"
getch();
}
voidinital()//建立作业控制块队列,先将其排成先来先服务的模式队列
inti;
printf("
\n输入作业数:
"
scanf("
%d"
&
n);
for(i=0;
i<
n;
i++)
{
p=getpch(JCB);
\n输入作业名:
scanf("
%s"
p->
name);
p->
reachtime=i;
作业默认到达时间:
i);
\n输入作业要运行的时间:
p->
needtime);
state='
W'
;
next=NULL;
if(ready==NULL)ready=q=p;
else{
q->
next=p;
q=p;
}
voiddisp(JCB*q,intm)//显示作业运行后的周转时间及带权周转时间等
if(m==3)//显示高响应比算法调度作业后的运行情况
\n作业%s正在运行,估计其运行情况:
\n"
q->
开始运行时刻:
%d\n"
starttime);
完成时刻:
finishtime);
周转时间:
%f\n"
cycletime);
带权周转时间:
cltime);
相应比:
super);
else//显示先来先服务,最短作业优先算法调度后作业的运行情况
voidrunning(JCB*p,intm)//运行作业
if(p==ready)//先将要运行的作业从队列中分离出来
ready=p->
next;
else
q=ready;
while(q->
next!
=p)q=q->
next=p->
starttime=times;
//计算作业运行后的完成时间,周转时间等等
R'
finishtime=p->
starttime+p->
needtime;
cycletime=(float)(p->
finishtime-p->
reachtime);
cltime=(float)(p->
cycletime/p->
T1+=p->
cycletime;
T2+=p->
cltime;
disp(p,m);
//调用disp()函数,显示作业运行情况
times+=p->
F'
\n%shasbeenfinished!
\npressanykeytocontinue...\n"
free(p);
//释放运行后的作业
voidsuper()//计算队列中作业的高响应比
JCB*padv;
padv=ready;
do{
if(padv->
state=='
&
padv->
reachtime<
=times)
padv->
super=(float)(times-padv->
reachtime+padv->
needtime)/padv->
padv=padv->
}while(padv!
=NULL);
voidfinal()//最后打印作业的平均周转时间,平均带权周转时间
floats,t;
t=T1/n;
s=T2/n;
\n\n作业已经全部完成!
\n%d个作业的平均周转时间是:
%f"
n,t);
\n%d个作业的平均带权周转时间是%f:
\n\n\n"
n,s);
voidhrn(intm)//高响应比算法
JCB*min;
inti,iden;
system("
cls"
inital();
for(i=0;
p=min=ready;
iden=1;
super();
if(p->
if(iden)
min=p;
iden=0;
elseif(p->
super>
min->
super)min=p;
p=p->
}while(p!
i--;
times++;
//printf("
\ntime=%d:
\tnoJCBsubmib...wait..."
time);
if(times>
1000)
{printf("
\nruntimeistoolong...error..."
getch();
running(min,m);
//调用running()函数
}//for
final();
voidsjf(intm)//最短作业优先算法
if(iden){
needtime<
needtime)min=p;
=NULL);
if(iden){
//printf("
times++;
100){printf("
\nruntimeistoolong...error"
voidfcfs(intm)//先来先服务算法
p=ready;
=times)iden=0;
if(iden)p=p->
=NULL&
iden);
\n没有满足要求的进程,需等待"
\n时间过长"
running(p,m);
voidmune()
intm;
\t\t\t\t作业调度演示\n"
\n\n\n\t\t\t1.先来先服务算法."
\n\t\t\t2.最短作业优先算法."
\n\t\t\t3.响应比高者优先算法"
\n\t\t\t0.退出程序."
\n\n\t\t\t\t选择所要操作:
m);
switch(m)
{case1:
fcfs(m);
mune();
break;
case2:
sjf(m);
case3:
hrn(m);
case0:
default:
选择错误,重新选择."
main()//主函数
inize();
实验截图
2、编写并调度一个多道程序系统的作业调度模拟程序。
采用基于先来先服务的调度算法。
可以参考课本中的方法进行设计。
对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
实验代码:
#definegetjch(type)(type*)malloc(sizeof(type))
#defineN10
structjcb{/*定义作业控制块PCB*/
floatneedtime;
/*运行时间*/
floatarrivetime;
/*提交时刻*/
floatstorage[N];
/*系统资源*/
structjcb*link;
}*ready=NULL,*pb=NULL,*p;
floatTc,Ti,Wi,T=0;
/*完成时刻,周转时间,带权周转时间,时间量*/
floatTiSum=0,WiSum=0;
/*平均周转时间,带权a平均周转时间*/
floatsource[N];
voidinput();
/*输入作业信息*/
intspace();
/*返回就绪队列中作业的数目*/
voidfcfs();
/*先来先服务算法*/
voiddisp(JCB*pr);
/*显示相应的作业*/
voidrunning();
/*运行作业组*/
voiddestroy();
/*撤销作业*/
voidinput()/*建立作业控制块函数*/
inti,k,num;
请输入所拥有的资源种类:
输入系统所拥有资源数:
printf("
资源[%d]:
scanf("
source[i]);
\n输入作业数量:
num);
num;
\n作业号[%d]:
p=getjch(JCB);
输入作业名:
输入提交时间:
arrivetime);
输入运行时间:
输入所需资源数:
for(k=0;
k<
k++)
{
printf("
scanf("
storage[k]);
}
p->
link=NULL;
fcfs();
intspace()
intl=0;
JCB*pr=ready;
while(pr!
=NULL)
l++;
pr=pr->
link;
return(l);
voiddisp(JCB*pr)/*建立作业显示函数,用于显示当前作业*/
inti;
\n%6s\t%6s\t%6s\t"
"
作业名"
运行时间"
提交时刻"
资源[%d]\t"
\n%6s\t%6.2f\t\t%6.2f\t"
pr->
name,pr->
needtime,pr->
\t%6.2f"
storage[i]);
voiddestroy()/*建立作业撤消函数(作业运行结束,撤消作业)*/
voidcheck()
JCB*first,*fir,*p;
intflag=0,i,test=0;
first=pb;
while(first&
(T>
=first->
arrivetime)&
(flag==0))
for(i=0;
if(source[i]>
storage[i])
source[i]=source[i]-first->
storage[i];
else
test=1;
if(test==0)
p=first;
first=first->
p->
if(ready==NULL)
ready=p;
{
fir=ready;
while(fir->
link!
{
fir=fir->
}
fir->
link=p;
}
else
flag=1;
pb=first;
voidfcfs()
JCB*first,*second;
intins=0;
if((pb==NULL)||(p->
arrivetime<
pb->
arrivetime))
link=pb;
pb=p;
first=pb;
second=first->
while(second!
if(p->
second->
arrivetime)
p->
link=second;
second=NULL;
first->
ins=1;
first=first->
second=second->
if(ins==0)
first->
voidrunning()
JCB*pr;
正在运行的作业是:
%s\n"
disp(p);
if(ready!
就绪队列如下:
pr=ready;
while(pr!
disp(pr);
pr=pr->
就绪队列为空队列!
if(pb!
后备队列如下:
pr=pb;
后备队列为空队列!
作业%s的开始运行时刻T:
%4.2f\n"
name,T);
Tc=T+p->
T=Tc;
Ti=Tc-p->
arrivetime;
Wi=Ti/(p->
source[i]=source[i]+p->
完成时刻Tc:
Tc);
周转时间Ti:
Ti);
带权周转时间Wi:
Wi);
TiSum+=Ti;
WiSum+=Wi;
destroy();
intlen;
charch;
input();
T=pb->
check();
len=space();
while((len!
=0)&
(ready!
=NULL))
system("
pause"
p=ready;
ready=p->
running();
if(pb!
if(T<
T=pb->
check();
len=space();
\n该作业组的平均周转时间:
TiSum/len);
该作业组的带权平均周转时间:
WiSum/len);
ch=getchar();
实验截图:
3、编写并调试一个多道程序系统的作业调度模拟程序。
采用基于优先级的作业调度。
可以参考课本中的例子自行设计。
structjcb
/*定义作业控制块PCB*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 调度 先来先 服务 实验 分析