短作业优先算法.docx
《短作业优先算法.docx》由会员分享,可在线阅读,更多相关《短作业优先算法.docx(7页珍藏版)》请在冰豆网上搜索。
![短作业优先算法.docx](https://file1.bdocx.com/fileroot1/2023-2/28/2583c8b8-d3cd-4892-a34c-0201d970a89b/2583c8b8-d3cd-4892-a34c-0201d970a89b1.gif)
短作业优先算法
1.短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。
该算法对长作业不利,完全未考虑作业的紧迫程度。
2.流程图
3•代码
#include
#includevstring.h>
#include
structsjf{
charname[10];
floatarrivetime;
floatservicetime;
floatstarttime;
floatfinishtime;
floatzztime;
floatdqzztime;
};
sjfa[100];
voidinput(sjf*p,intN)
{inti;
printf("intputtheprocess'sname&arrivetime&
servicetime:
\nforexmple:
a0100\n");
for(i=0;i<=N-1;i++)
{
printf("inputthe%dthprocess'sinformation:
\n”,i+1);
scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);
}
voidPrint(sjf*p,floatarrivetime,floatservicetime,float
starttime,floatfinishtime,floatzztime,floatdqzztime,intN)
{intk;
printf("runorder:
");
printf("%s",p[O].name);
for(k=1;k{printf("-->%s",p[k].name);
}
printf("\ntheprocess'sinformation:
\n");
printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n");
for(k=0;k<=N-1;k++)
{printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].na
me,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,
p[k].zztime,p[k].dqzztime);
〃paixu
voidsort(sjf*p,intN)
{
for(inti=0;i<二N-1;i++)
for(intj=0;j<=i;j++)
if(p[i].arrivetime
{
sjftemp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
〃yunxingjieduan
voiddeal(sjf*p,floatarrivetime,floatservicetime,float
starttime,floatfinishtime,float&zztime,float&dqzztime,intN)
{intk;
for(k=0;k<=N-1;k++)
if(k==O)
{
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-1].finishtime+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;
voidsjff(sjf*p,intN)
{floatarrivetime=O,servicetime=O,starttime=O,finishtime=O,zztime=O,dqzztime=0;
sort(p,N);
for(intm=0;m{if(m==0)
p[m].finishtime=p[m].arrivetime+p[m].servicetime;
else
p[m].finishtime=p[m-1].finishtime+p[m].servicetime;inti=0;
for(intn二m+1;n<二N-1;n++)
{if(p[n].arrivetime<=p[m].finishtime)
i++;
}
floatmin=p[m+1].servicetime;
intnext=m+1;//m+1=n
for(intk=m+1;kif(p[k+1].servicetime{min=p[k+1].servicetime;
next=k+1;}
}
sjftemp;
temp=p[m+1];
p[m+1]=p[next];
p[next]二temp;
}
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime
N);
Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);
intmain(){intN;
printf(”短作业优先调度算法\n");
printf("inputtheprocess'snumber:
\n");
seanf("%d",&N);
input(a,N);
sjf*b=a;
sjf*e=a;
sjff(b,N);
system("PAUSE");
4.运行结果
5•心得体会
课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去做一件事情,又如何完成一件事情的能力。
通过模拟进程的调度问题,更加深了我对于操作系统理论的理解,在自己的动手操作过程中,能够体会成功的喜悦和遇到问题自己解决的能力,对于我来说是一次提高,让自己多多的在实践中可以加深对理论的理解,也让我明白了以后应该如何更好,更高效的学习,在以后,我会更加努力。