计算机操作系统实验报告Word下载.docx
《计算机操作系统实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《计算机操作系统实验报告Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
优点:
能体现公平性;
缺点:
一旦一个较长的作业进入系统后就会长时间的占用系统的资源,这样如果有优先级较高的短作业需要执行的话需要等待很长时间。
2.短作业优先算法(SJF)
比前者改善了平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;
对长作业非常不利,可能长时间得不到执行,未能一句作业的紧迫程度来划分执行的优先级,难以准确估计作业的执行时间,从而影响调度性能。
3.最高响应比优先算法(HRN)
这种算法是对FCFS方式和SJF方式的一种综合平衡。
FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。
因此,这两种调度算法在某些极端情况下会带来某些不便。
HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRN方式时其吞吐量将小于采用SJF法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加。
5.总结
在设计中,我构想在理想情况下将每个作业用一个结构体来存储其对应的信息,并将各个结构体用结构体数组的形式组织到一起。
在每个结构体中将作业的作业名、进入时间、运行时间、周转时间、带权周转时间这些信息全部存入,以便后期的排序和输出等待队列信息。
通过这几次实验,我发现了自身的不足,比如没有很好的书写习惯,考虑问题不周到,对于调度算法的理解不够深入等。
但在编程的过程中我体验到了一分耕耘一分收获的喜悦;
多次调试后程序成功运行了,那时候的欢乐是我以前无法想象的。
果然,学习任何一门课程,只要学得用心,都可以从中体会到学习的快乐。
今后我的进步,想必都是从这一点一点敲入编译器的代码中获得的。
6.代码附录
#include<
stdio.h>
stdlib.h>
#definegetpch(type)(type*)malloc(sizeof(type))
structworktime
{
floatTb;
//作业运行时刻
floatTc;
//作业完成时刻
floatTi;
//周转时间
floatWi;
//带权周转时间
};
structjcb
{/*定义作业控制块JCB
*/
charname[10];
//作业名
floatsubtime;
//作业提交时间
floatruntime;
//作业所需的运行时间
charresource;
//所需资源
floatRp;
//后备作业响应比
charstate;
//作业状态
structworktimewt;
structjcb*link;
//链指针
}*jcb_ready=NULL,*j;
typedefstructjcbJCB;
floatT=0;
voidsort()/*
建立对作业进行提交时间排列函数*/
JCB*first,*second;
intinsert=0;
if((jcb_ready==NULL)||((j->
subtime)<
(jcb_ready->
subtime)))/*作业提交时间最短的,插入队首*/
{
j->
link=jcb_ready;
jcb_ready=j;
T=j->
subtime;
Rp=1;
}
else/*
作业比较提交时间,插入适当的位置中*/
first=jcb_ready;
second=first->
link;
while(second!
=NULL)
{
if((j->
(second->
subtime))/*若插入作业比当前作业提交时间短,*/
{/*插入到当前作业前面*/
j->
link=second;
first->
link=j;
second=NULL;
insert=1;
}
else/*
插入作业优先数最低,则插入到队尾*/
{
first=first->
second=second->
}
if(insert==0)first->
}
voidSJFget()/*
获取队列中的最短作业
JCB*front,*mintime,*rear;
intipmove=0;
mintime=jcb_ready;
rear=mintime->
while(rear!
if((rear!
=NULL)&
&
(T>
=rear->
subtime)&
(mintime->
runtime)>
(rear->
runtime))
front=mintime;
mintime=rear;
rear=rear->
ipmove=1;
else
if(ipmove==1)
front->
link=mintime->
mintime->
jcb_ready=mintime;
voidHRNget()/*
获取队列中的最高响应作业
if((rear!
Rp)<
Rp))
voidinput()/*
建立作业控制块函数*/
inti,num;
printf("
\npleseinputthenumberofthejob:
"
);
scanf("
%d"
&
num,2);
for(i=0;
i<
num;
i++)
printf("
\ntheordernumberofthejobNo.%d:
\n"
i);
j=getpch(JCB);
\npleaseinputthenameofthejob:
scanf("
%s"
j->
name);
\npleaseinputthetimewhenthejobwassubmitted:
%f"
j->
subtime);
\npleaseinputtheruntimeofthejob:
runtime);
state='
w'
;
link=NULL;
sort();
/*
调用sort函数*/
intspace()
intl=0;
JCB*jr=jcb_ready;
while(jr!
l++;
jr=jr->
return(l);
voiddisp(JCB*jr,intselect)/*建立作业显示函数,用于显示当前作业*/
if(select==3)
\nworkservicetimeresponseratioruntimecompletetimeturnovertimeweightedturnovertime\n"
\nworkservicetimeruntimecompletetimeturnovertimeweightedturnovertime\n"
|%s\t"
jr->
|%.2f\t"
|%.2f"
Rp);
if(j==jr)
wt.Tb);
wt.Tc);
wt.Ti);
wt.Wi);
voidcheck(intselect)/*建立作业查看函数*/
JCB*jr;
\n****therunningjobis:
j->
/*显示当前运行作业*/
disp(j,select);
jr=jcb_ready;
\n****thecurrentreadyqueueis:
/*显示就绪队列状态*/
while(jr!
=NULL)
jr->
Rp=(T-jr->
subtime)/jr->
runtime;
disp(jr,select);
jr=jr->
destroy();
intdestroy()/*建立作业撤消函数(作业运行结束,撤消作业)*/
\njob[%s]iscompleted.\n"
free(j);
voidrunning(JCB*jr)/*建立作业就绪函数(作业运行时间到,置就绪状态*/
if(T>
=jr->
subtime)
wt.Tb=T;
wt.Tb=jr->
wt.Tc=jr->
wt.Tb+jr->
wt.Ti=jr->
wt.Tc-jr->
wt.Wi=jr->
wt.Ti/jr->
T=jr->
wt.Tc;
intmain()/*主函数*/
intselect=0,len,h=0;
floatsumTi=0,sumWi=0;
input();
len=space();
\n\t1.FCFS2.SJF3.HRN\n\npleasechooseaAlgorithm:
&
select);
while((len!
=0)&
(jcb_ready!
=NULL))
h++;
\nexcute%djob\n"
h);
j=jcb_ready;
jcb_ready=j->
j->
link=NULL;
state='
R'
running(j);
sumTi+=j->
wt.Ti;
sumWi+=j->
wt.Wi;
check(select);
if(select==2&
h<
len-1)
SJFget();
if(select==3&
HRNget();
\npressanykeytocontinue......\n"
getchar();
\n\nthejobiscompleted.\n"
\ttheturnovertimeofthisgroupofwork:
%.2f\n"
sumTi/h);
\ttheweightedturnovertimeofthisgroupofwork:
sumWi/h);