计算机操作系统实验报告.docx
- 文档编号:7736049
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:16
- 大小:331.22KB
计算机操作系统实验报告.docx
《计算机操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《计算机操作系统实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
计算机操作系统实验报告
中南大学
计算机操作系统
实验报告
计算机操作系统
1.设计目的
1、增强学生对计算机操作系统基本原理、基本理论、基本算法的理解;
2、提高和培养学生的动手能力。
2.设计要求
1、每人至少选作1题,多做不限;
2、每人单独完成,可以讨论,但每人的设计内容不得完全相同,抄袭或有2人/多人设计完全一样者,不能通过;
3、设计完成后,应上交课程设计文档,文档格式应是学校课程设计的标准格式,所有学生的封面大小、格式也必须一样;
4、同时上交设计的软盘(或以班刻录光盘)。
3.设计题目
调度算法的模拟:
模拟各种调度算法,并进行调度性能分析。
4.设计过程
4.1设计思路
模拟了一个作业调度算法,其中用到了先来先服务算法(FCFS)、短作业优先算法(SJF)、最高响应比优先算法(HRN)三种算法。
如下,分别为三种算法的程序流程图。
4.2实验过程
图1-开始界面
图2–输入作业的信息(名字、提交时间、运行时间)
图3–选择算法(FCFS、SJF、HRN)
图4、5–选择FCFS算法后输出结果
图6、7–选择SJF算法后输出结果
图8、9–选择HRN算法后输出结果
4.3调度性能分析
1.先来先服务算法(FCFS)
优点:
能体现公平性;
缺点:
一旦一个较长的作业进入系统后就会长时间的占用系统的资源,这样如果有优先级较高的短作业需要执行的话需要等待很长时间。
2.短作业优先算法(SJF)
优点:
比前者改善了平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;
缺点:
对长作业非常不利,可能长时间得不到执行,未能一句作业的紧迫程度来划分执行的优先级,难以准确估计作业的执行时间,从而影响调度性能。
3.最高响应比优先算法(HRN)
优点:
这种算法是对FCFS方式和SJF方式的一种综合平衡。
FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。
因此,这两种调度算法在某些极端情况下会带来某些不便。
HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。
缺点:
由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRN方式时其吞吐量将小于采用SJF法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加。
5.总结
在设计中,我构想在理想情况下将每个作业用一个结构体来存储其对应的信息,并将各个结构体用结构体数组的形式组织到一起。
在每个结构体中将作业的作业名、进入时间、运行时间、周转时间、带权周转时间这些信息全部存入,以便后期的排序和输出等待队列信息。
通过这几次实验,我发现了自身的不足,比如没有很好的书写习惯,考虑问题不周到,对于调度算法的理解不够深入等。
但在编程的过程中我体验到了一分耕耘一分收获的喜悦;多次调试后程序成功运行了,那时候的欢乐是我以前无法想象的。
果然,学习任何一门课程,只要学得用心,都可以从中体会到学习的快乐。
今后我的进步,想必都是从这一点一点敲入编译器的代码中获得的。
6.代码附录
#include
#include
#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;
j->Rp=1;
}
else/* 作业比较提交时间,插入适当的位置中*/
{
first=jcb_ready;
second=first->link;
while(second!
=NULL)
{
if((j->subtime)<(second->subtime))/*若插入作业比当前作业提交时间短,*/
{/*插入到当前作业前面*/
j->link=second;
first->link=j;
second=NULL;
insert=1;
}
else/* 插入作业优先数最低,则插入到队尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=j;
}
}
voidSJFget()/* 获取队列中的最短作业 */
{
JCB*front,*mintime,*rear;
intipmove=0;
mintime=jcb_ready;
rear=mintime->link;
while(rear!
=NULL)
if((rear!
=NULL)&&(T>=rear->subtime)&&(mintime->runtime)>(rear->runtime))
{
front=mintime;
mintime=rear;
rear=rear->link;
ipmove=1;
}
else
rear=rear->link;
if(ipmove==1)
{
front->link=mintime->link;
mintime->link=jcb_ready;
}
jcb_ready=mintime;
}
voidHRNget()/* 获取队列中的最高响应作业 */
{
JCB*front,*mintime,*rear;
intipmove=0;
mintime=jcb_ready;
rear=mintime->link;
while(rear!
=NULL)
if((rear!
=NULL)&&(T>=rear->subtime)&&(mintime->Rp)<(rear->Rp))
{
front=mintime;
mintime=rear;
rear=rear->link;
ipmove=1;
}
else
rear=rear->link;
if(ipmove==1)
{
front->link=mintime->link;
mintime->link=jcb_ready;
}
jcb_ready=mintime;
}
voidinput()/* 建立作业控制块函数*/
{
inti,num;
printf("\npleseinputthenumberofthejob:
");
scanf("%d",&num,2);
for(i=0;i { printf("\ntheordernumberofthejobNo.%d: \n",i); j=getpch(JCB); printf("\npleaseinputthenameofthejob: "); scanf("%s",j->name); printf("\npleaseinputthetimewhenthejobwassubmitted: "); scanf("%f",&j->subtime); printf("\npleaseinputtheruntimeofthejob: "); scanf("%f",&j->runtime); printf("\n"); j->state='w'; j->link=NULL; sort();/* 调用sort函数*/ } } intspace() { intl=0; JCB*jr=jcb_ready; while(jr! =NULL) { l++; jr=jr->link; } return(l); } voiddisp(JCB*jr,intselect)/*建立作业显示函数,用于显示当前作业*/ { if(select==3) printf("\nworkservicetimeresponseratioruntimecompletetimeturnovertimeweightedturnovertime\n"); else printf("\nworkservicetimeruntimecompletetimeturnovertimeweightedturnovertime\n"); printf("|%s\t",jr->name); printf("|%.2f\t",jr->runtime); if(select==3) printf("|%.2f",jr->Rp); if(j==jr) { printf("|%.2f\t",jr->wt.Tb); printf("|%.2f",jr->wt.Tc); printf("|%.2f\t",jr->wt.Ti); printf("|%.2f",jr->wt.Wi); } printf("\n"); } voidcheck(intselect)/*建立作业查看函数*/ { JCB*jr; printf("\n****therunningjobis: %s",j->name);/*显示当前运行作业*/ disp(j,select); jr=jcb_ready; printf("\n****thecurrentreadyqueueis: \n");/*显示就绪队列状态*/ while(jr! =NULL) { jr->Rp=(T-jr->subtime)/jr->runtime; disp(jr,select); jr=jr->link; } destroy(); } intdestroy()/*建立作业撤消函数(作业运行结束,撤消作业)*/ { printf("\njob[%s]iscompleted.\n",j->name); free(j); } voidrunning(JCB*jr)/*建立作业就绪函数(作业运行时间到,置就绪状态*/ { if(T>=jr->subtime) jr->wt.Tb=T; else jr->wt.Tb=jr->subtime; jr->wt.Tc=jr->wt.Tb+jr->runtime; jr->wt.Ti=jr->wt.Tc-jr->subtime; jr->wt.Wi=jr->wt.Ti/jr->runtime; T=jr->wt.Tc; } intmain()/*主函数*/ { intselect=0,len,h=0; floatsumTi=0,sumWi=0; input(); len=space(); printf("\n\t1.FCFS2.SJF3.HRN\n\npleasechooseaAlgorithm: "); scanf("%d",&select); while((len! =0)&&(jcb_ready! =NULL)) { h++; printf("\nexcute%djob\n",h); j=jcb_ready; jcb_ready=j->link; j->link=NULL; j->state='R'; running(j); sumTi+=j->wt.Ti; sumWi+=j->wt.Wi; check(select); if(select==2&&h SJFget(); if(select==3&&h HRNget(); printf("\npressanykeytocontinue......\n"); getchar(); } printf("\n\nthejobiscompleted.\n"); printf("\ttheturnovertimeofthisgroupofwork: %.2f\n",sumTi/h); printf("\ttheweightedturnovertimeofthisgroupofwork: %.2f\n",sumWi/h); getchar(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 实验 报告