操作系统实验先来先服务的调度算法及短作业优先.docx
《操作系统实验先来先服务的调度算法及短作业优先.docx》由会员分享,可在线阅读,更多相关《操作系统实验先来先服务的调度算法及短作业优先.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验先来先服务的调度算法及短作业优先
学号P********专业计算机科学与技术姓名
实验日期2017.10.27教师签字成绩
实验报告
【实验名称】进程调度算法FCFS、FJF
【实验目的】
在多道程序或多任务系统中,系统同时处于就绪态的进程有若干个。
也就是说能运行的进程数远远大于处理机个数,为了使系统中的各进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机,所以,要求使用某一种编程语言设计实现模拟单处理机调度的算法,以巩固和加深处理机调度的概念。
本实验要求采用先来先服务的调度算法和短作业优先的调度算法编写和调试一个简单的进程调度程序。
通过本实验可以加深理解进程调度、进程队列的概念。
【实验原理】
FCFS调度算法
先来先服务(FCFS)调度算法是一种最简单的调度算法。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
SJF调度算法
短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
【实验内容】
问题分析
输入:
进程的名称、到达时间、服务时间
输出:
进程的完成时间、周转时间、带权周转时间
其中对于任意进程有:
周转时间=完成时间-到达时间
带权周转时间=周转时间/服务时间
因此,两个算法的关键是求完成时间
●数据结构及函数说明
使用的数据结构是数组,进程的名称、到达时间、服务时间、进程的完成时间、周转时间、带权周转时间分别对应于一个数组,这些数组长度相等.
structfcfs
//定义进程的结构体
{
charname[10];//进程名
floatarrivetime;//到达时间
floatservicetime;//服务时间
floatstarttime;//开始时间
floatfinishtime;//完成时间
floatzztime;//周转时间
floatdqzztime;//带权周转时间
};
fcfsa[100];//结构体数组
函数说明
voidFinput(fcfs*p,intN);//输入函数,初始化
voidFsort(fcfs*p,intN);//按到达时间排序,先到达排在前面
voidFsort2(fcfs*p,intN);//按进程大小排序,先到达排在前面
voidF_method(fcfs*p,intN)//先来先服务算法
voidF_method2(fcfs*p,intN)//短作业优先程序
voidSJF(fcfs*p,intN);//短作业优先
voidFCFS(fcfs*p,intN);//先来先服务
voidSJF(fcfs*p,intN)//短作业优先
voidFPrint(fcfs*p,intN)//输出函数
求完成时间算法
1)FCFS算法流程图
2)SJF算法流程图
●程序
#include
structfcfs
//定义进程的结构体
{
charname[10];//进程名
floatarrivetime;//到达时间
floatservicetime;//服务时间
floatstarttime;//开始时间
floatfinishtime;//完成时间
floatzztime;//周转时间
floatdqzztime;//带权周转时间
};
floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;
fcfsa[100];
//定义先来先服务算法进程的最大数量
voidFinput(fcfs*p,intN)//输入函数
{
inti;
printf("输入进程的名称、到达时间、服务时间:
(例如:
x0100)\n");
for(i=0;i<=N-1;i++)
{
printf("输入第%d进程的名称、到达时间、服务时间:
\n",i+1);
scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
}
}
//输出函数
voidFPrint(fcfs*p,intN)//输出函数
{
intk;
printf("\n执行顺序:
\n");
printf("%s",p[0].name);
for(k=1;k{
printf("-%s",p[k].name);
}
printf("\n进程名\t到达时间\t服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n\n");
for(k=0;k<=N-1;k++)
{
printf("%s\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\t%-.2f\t\t\n\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);
}
}
voidFsort(fcfs*p,intN)//按到达时间排序,先到达排在前面
{
for(inti=0;i<=N-1;i++)
for(intj=0;j<=i;j++)
if(p[i].arrivetime
{
fcfstemp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}//运行结果
voidF_method(fcfs*p,intN)
{
intk;
for(k=0;k<=N-1;k++)
{
if(k==0)
{
p[k].starttime=p[k].arrivetime;//如果是第一个进程,开始时间等于到达时间
p[k].finishtime=p[k].arrivetime+p[k].servicetime;//结束时间等于到达时间加上服务时间
}
else
{
p[k].starttime=p[k-1].finishtime;//开始时间=上一个一个进程的完成时间
p[k].finishtime=p[k].starttime+p[k].servicetime;//结束时间=开始时间加上+现在进程的服务时间
}
}
for(k=0;k<=N-1;k++)//求每个进程的信息
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;//周转时间=完成时间-到达时间
p[k].dqzztime=p[k].zztime/p[k].servicetime;//带权周转时间=周转时间/服务时间
}
}
voidF_method2(fcfs*p,intN)//短作业优先核心程序
{
intnum;
intarrive=65535;//寻找最早到达的进程
intmin_serive=65535;//寻找最小服务时间进程
inti;
fcfsb[100];//新建一个,进行排序
intstate[100];//设置100个标志位
for(i=0;istate[i]=0;
for(i=0;iif(p[i].arrivetime{arrive=p[i].arrivetime;
num=i;
}
b[0]=p[num];
state[num]=1;
b[0].finishtime=b[0].arrivetime+b[0].servicetime;
intj=0;
for(intk=1;k{min_serive=65535;
for(i=0;i{if(state[i]==1||p[i].arrivetime>b[j].finishtime)//如果遇到已排序或者未到达的进程跳过
continue;
elseif(p[i].servicetime{
min_serive=p[i].servicetime;
num=i;
}
}
state[num]=1;//找到合适的进程并赋值到B
b[++j]=p[num];
b[j].starttime=b[j-1].finishtime;
b[j].finishtime=b[j-1].finishtime+b[j].servicetime;
}
for(j=0;j<=N-1;j++)//求每个进程的信息
{
b[j].zztime=b[j].finishtime-b[j].arrivetime;//周转时间=完成时间-到达时间
b[j].dqzztime=b[j].zztime/b[j].servicetime;//带权周转时间=周转时间/服务时间
}
for(j=0;jp[j]=b[j];
}
//先来先服务
voidFCFS(fcfs*p,intN)
{
Fsort(p,N);//对每个进程排序
F_method(p,N);
FPrint(p,N);
}
voidSJF(fcfs*p,intN)
{
F_method2(p,N);
FPrint(p,N);
}
intmain()//主函数
{
intN;
printf("输入进程数:
");
scanf("%d",&N);
Finput(a,N);
printf("先来先服务\n");
FCFS(a,N);
printf("\n\n\n");
printf("短作业优先\n");
SJF(a,N);
return0;
}
【小结或讨论】
1.能实现的功能输入进程个数Num,每个进程到达时间ArrivalTime[i],服务时间ServiceTime[i]。
采用先来先服务FCFS或者短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计Num个进程的平均周转时间和平均带权周转时间。
2、FCFS算法相对于SJF算法来说,比较简单,在FCFS算法中,主要用到的是队列,按照作业的到达时间来进行排序排序算法。
3、SJF算法中就需要考虑到很多的因素,因为0时刻到达的作业肯定第一个执行,然后再考虑剩余的作业的服务时间以决定哪一个作业先执行,但是这是在确保所有剩余的作业都处于就绪状态的情况下。
如若不然,还要考虑每一个作业执行完后,有哪些作业进入了排队状态。
4、SJF算法中还要考虑到如若同一时刻进入了多个作业,还要将这若干个作业按照服务时间进行排序,再考虑执行情况。
5、无论是FCFS还是SJF算法,关键都是求完成时间。
FCFS算法执行进程的顺序是由到达时间的先后决定的,SJF算法的顺序是由服务时间决定的。
6、SJF求完成时间时,应当注意如下情况:
A进程完成完成后,依据服务时间,轮到B执行,而A的完成时间
7、通过本次实验,我对于作业调度的机制,有了进一步的认识,对于相同的作业,不同的调度顺序,会使周转时间以及赋权周转时间产生变化。
8、先到先服务算法虽然算法实现较为简便,但是效率上存在一定的问题。
短作业优先算法可以大大提高效率方面的问题,但是实现起来较为复杂。