先来先服务调度和最短作业优先调度算法实验报告.docx
《先来先服务调度和最短作业优先调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《先来先服务调度和最短作业优先调度算法实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
先来先服务调度和最短作业优先调度算法实验报告
实验概述:
【实验目的及要求】
理解并掌握处理机调度算法
【实验原理】
基于先来先服务调度和最短作业优先调度算法思想用C语言编程实现
【实验环境】(使用的软件)
VisualC++6.0
实验内容:
本实验模拟在单处理机情况下处理机调度,用C语言编程实现先来先服务和最短作业优先调度算法。
【实验方案设计】
FCFS流程图:
SJF流程图:
试验总设计流程图:
进程等待时间=进程开始运行时间-进程提交时间(即进程处于就绪态时间)
进程周转时间=进程结束时间-进程提交时间
【实验过程】(实验步骤、记录、数据、分析)
测试用例1:
屏幕显示:
Pleaseinputthetotalnumberofjobs
输入:
4<回车>
屏幕显示:
Pleaseinputjobnumber,submittimeandruntime
输入:
19.00.2<回车>
28.50.5<回车>
38.01.0<回车>
49.10.1<回车>
屏幕显示:
Whatkindofalgorithmdoyouwant?
Pleaseinput1toselectFCFS,or2toselectSJF.
输入:
3<回车>
屏幕显示:
Youhaveinputawrongnumber,pleaseinputagain.
输入:
1<回车>
屏幕输出结果:
submitrunstartingfinalwaitturnaround
38.01.08.09.00.01.0
28.50.59.09.50.51.0
19.00.29.59.70.50.7
49.10.19.79.80.60.7
屏幕显示:
Theaverageturnaroundtimeis0.85
Whatkindofalgorithmdoyouwant?
Pleaseinput1toselectFCFS,or2toselectSJF,or0toexit.
测试数据二:
submitrun
160.5
250.9
36.30.1
FCFS和SJF算法结果一样:
submitrunstartingfinalwaitturnaround
250.955.900.9
160.566.500.5
36.30.16.56.60.20.3
Theaverageturnaroundtimeis0.567
测试数据三:
submitrun
150.2
24.20.3
35.10.3
45.20.1
FCFS:
submitrunstartingfinalwaitturnaround
24.20.34.24.500.3
150.255.200.2
35.10.35.25.50.10.4
45.20.15.55.60.30.4
Theaverageturnaroundtimeis0.325
SJF:
submitrunstartingfinalwaitturnaround
24.20.34.24.500.3
150.255.200.2
45.20.15.25.300.1
35.10.35.35.60.20.5
Theaverageturnaroundtimeis0.275
源程序:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineM50
structsjf{
intjobnumber;
floatsubmittime;
floatruntime;
floatstarttime;
floatfinishtime;
floatwaittime;
floatturnaroundtime;
}temp;
staticstructsjfst[M];
voidinput(structsjf*p,intN)
{
inti;
printf("Pleaseinputthejobnumber,submittimeandruntime:
\nForexmple:
18.52.0\n");
for(i=0;i{
scanf("%d%f%f",&p[i].jobnumber,&p[i].submittime,&p[i].runtime);
}
}
voidprint(structsjf*p,intN)
{
intk;
floath,g;
printf("runorder:
");
printf("%d",p[0].jobnumber);
for(k=1;kprintf("-->%d",p[k].jobnumber);
printf("\nTheprocess'sinformation:
\n");
printf("\njobnum\tsubmit\trun\tstart\tfinal\twait\tturnaround\n");
for(k=0;k{
h+=p[k].turnaroundtime;
printf("%d\t%-.1f\t%-.1f\t%-.1f\t%-.1f\t%-.1f\t%-.1f\t\n",p[k].jobnumber,p[k].submittime,p[k].runtime,p[k].starttime,p[k].finishtime,p[k].waittime,p[k].turnaroundtime);
}
g=h/N;
printf("\nTheaverageturnaroundtimeis%-.2f\n",g);
}
/*按提交时间从小到大排序*/
voidsort1(structsjf*p,intN)
{
inti,j;
for(i=0;ifor(j=0;j<=i;j++)
if(p[i].submittime
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
/*运行*/
voiddeal(structsjf*p,intN)
{
intk;
for(k=0;k{
if(k==0)
{
p[k].starttime=p[k].submittime;
p[k].finishtime=p[k].submittime+p[k].runtime;
}
else
{
if(p[k].submittime>p[k-1].finishtime)
{
p[k].starttime=p[k].submittime;
p[k].finishtime=p[k].submittime+p[k].runtime;
}
else
{
p[k].starttime=p[k-1].finishtime;
p[k].finishtime=p[k-1].finishtime+p[k].runtime;
}
}
}
for(k=0;k{
p[k].turnaroundtime=p[k].finishtime-p[k].submittime;
p[k].waittime=p[k].starttime-p[k].submittime;
}
}
voidsort2(structsjf*p,intN)
{
intnext,m,n,k,i;
floatmin;
sort1(p,N);
for(m=0;m{
i=0;
if(m==0)
p[m].finishtime=p[m].submittime+p[m].runtime;
else
{
if(p[m].submittime>p[m-1].finishtime)
{
p[m].finishtime=p[m].submittime+p[m].runtime;
}
else
p[m].finishtime=p[m-1].finishtime+p[m].runtime;
}
for(n=m+1;n{
if(p[n].submittime<=p[m].finishtime)/*判断内存中每次完成之后又多少到达的进程*/
i++;
}
min=p[m+1].runtime;
next=m+1;
for(k=m+1;k{
if(p[k+1].runtime{
min=p[k+1].runtime;
next=k+1;
}
}
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
deal(p,N);
print(p,N);
}
voidmain()
{
intN,i;
printf("Pleaseinputthetotalnumberofjobs:
");
scanf("%d",&N);
input(st,N);
loop2:
printf("Whatkindofalgorithmdoyouwant?
Pleaseinput1toselectFCFS,or2toselectSJFor0toexit:
");
loop:
scanf("%d",&i);
if(i==0)
exit
(1);
elseif(i==1)
{
sort1(st,N);
deal(st,N);
print(st,N);
gotoloop2;
}
elseif(i==2)
{
sort2(st,N);
gotoloop2;
}
else
{
printf("Youhaveinputawrongnumber,pleaseinputagain:
");
gotoloop;
}
}
【结论】(结果)
测试1:
测试二:
测试三:
【小结】
实验中产生的错误及原因分析:
测试用例1的结果:
错误1:
错误解决方式:
主要是子函数sort2()中出的错:
i的作用域,程序修改:
将原来:
intnext,m,n,k,i=0;
floatmin;
sort1(p,N);
for(m=0;m{
改为:
intnext,m,n,k,i;
floatmin;
sort1(p,N);
for(m=0;m{
i=0;
测试用例2的结果:
错误1:
错误原因:
未考虑到“提交时间(submittime)大于上个进程的结束时间”的情况:
解决方法:
将原来的:
else
{
p[m].finishtime=p[m-1].finishtime+p[m].runtime;
}
修改为:
else
{
if(p[m].submittime>p[m-1].finishtime)
{
p[m].finishtime=p[m].submittime+p[m].runtime;
}
else
p[m].finishtime=p[m-1].finishtime+p[m].runtime;
}
测试用例3的结果:
错误1:
错误分析:
同2一样,未在子函数sort()中未考虑到“提交时间(submittime)大于上个进程的结束时间”的情况:
解决方法:
将原来的:
else
p[m].finishtime=p[m-1].finishtime+p[m].runtime;
修改为:
else
{
if(p[m].submittime>p[m-1].finishtime)
{
p[m].finishtime=p[m].submittime+p[m].runtime;
}
else
p[m].finishtime=p[m-1].finishtime+p[m].runtime;
}
实验的体会及收获:
通过这次试验,我对处理机的调度算法特别是FCFS和SJF有了更深的理解,而且锻炼了我的思维能力,
使我能更全面地思考问题,以后还需要多做些这方面的练习。
试验不足之处:
试验未考虑同一时间提交多个进程的情况,如:
测试数据:
submitrun
170.2
27.20.5
370.1
结果应该是:
FCFS:
submitrunstartfinalwaitturnaround
170.27.07.50.00.5
370.17.57.60.50.6
27.20.57.67.80.40.6
Theaverageturnaroundtimeis0.57.
SJF:
Jobnumsubmitrunstartingfinalwaitturnaround
370.17.07.10.00.1
170.57.17.60.10.6
27.20.27.67.80.60.6
Theaverageturnaroundtimeis0.43.
而程序运行结果是:
程序结果表明该程序还是存在不足之处的。
这是需要继续改进的地方。
指导教师评语及成绩:
评语:
成绩:
指导教师签名:
批阅日期:
实验报告说明
1.实验项目名称:
要用最简练的语言反映实验的内容。
要求与实验指导书中相一致。
2.实验类型:
一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。
3.实验目的与要求:
目的要明确,要抓住重点,符合实验指导书中的要求。
4.实验原理:
简要说明本实验项目所涉及的理论知识。
5.实验环境:
实验用的软硬件环境(配置)。
6.实验方案设计(思路、步骤和方法等):
这是实验报告极其重要的内容。
概括整个实验过程。
对于操作型实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。
对于设计型和综合型实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。
对于创新型实验,还应注明其创新点、特色。
7.实验过程(实验中涉及的记录、数据、分析):
写明具体上述实验方案的具体实施,包括实验过程中的记录、数据和相应的分析。
8.结论(结果):
即根据实验过程中所见到的现象和测得的数据,做出结论。
9.小结:
对本次实验的心得体会、思考和建议。
10.指导教师评语及成绩:
指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值。
注意:
∙实验报告将记入实验成绩;
∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。