短作业优先调度算法.docx
《短作业优先调度算法.docx》由会员分享,可在线阅读,更多相关《短作业优先调度算法.docx(12页珍藏版)》请在冰豆网上搜索。
![短作业优先调度算法.docx](https://file1.bdocx.com/fileroot1/2023-4/24/07e520c9-52d4-47ee-a5e9-beccecc7fb2d/07e520c9-52d4-47ee-a5e9-beccecc7fb2d1.gif)
短作业优先调度算法
短作业优先调度算法
学院计算机科学与技术
专业
学号
学生姓名
指导教师姓名
2014-3-18
九参考文献………………………………………………………………………………………………………
实验题目
采用短作业优先算法的进程调度程序
课程设计的目的
●操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。
●进一步巩固和复习操作系统的基础知识。
●培养学生结构化程序、模块化程序设计的方法和能力。
●提高学生调试程序的技巧和软件设计的能力。
●提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
设计内容
设计并实现一个采用短作业优先算的进程调度算法演示程序
设计要求
1.每一个进程有一个PCB,其内容可以根据具体情况设定。
2.进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定
3.可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、进程优先级的初始化
4.可以在运行中显示各进程的状态:
就绪、执行(由于不要求设置互斥资源与进程间同步关系,故只有两种状态)
5.具有一定的数据容错性
主要数据结构及其说明
算法的简要说明:
短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。
而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
优点是SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。
缺点是该算法对长作业不利;完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)长期不被调度;由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业游戏那调度。
该程序定义了一个进程数据块(structspf),该数据块有进程名(name)、到达时间(arrivetime)、服务时间(servicetime)、开始执行时间(starttime)、完成时间(finishtime)、周转时间(zztime)、带权周转时间(dqzztime)。
用到的公式有:
完成时间=到达时间+服务时间;周转时间=完成时间-到达时间;带权周转时间=周转时间/服务时间;(第一次执行的进程的完成时间=该进程的到达时间;下一个进程的开始执行时间=上一个进程的完成时间)。
运行进程的顺序需要对进程的到达时间和服务时间进行比较。
如果某一进程是从0时刻到达的,那么首先执行该进程;之后就比较进程的服务时间,谁的服务时间短就先执行谁(如果服务时间相同则看它们的到达时间,到达时间短的先执行);如果到达时间和服务时间相同,则按先来先服务算法执行。
程序运行结果
1进入操作界面如下
2输入进程的数目
3输入进程的信息
4运行顺序
流程图
源程序文件
#include<>
#include<>
#include<>
#defineMAX100ame,&p[i].arrivetime,&p[i].servicetime);
printf("\n");
}
}
voidPrint(jcb*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatavezztime,intN)
{
intk;
printf("调度顺序:
");
printf("%s",p[0].name);
for(k=1;k{
printf("-->%s",p[k].name);
}
printf("\n\n");
printf("\t\t\t作业信息:
\n");
printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n");
for(k=0;k<=N-1;k++)
{
printf("%s\t%\t%\t%\t%\t%\t%\t\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].avezztime);
}
}
voidsort(jcb*p,intN)
{
for(inti=0;i<=N-1;i++)
for(intj=0;j<=i;j++)
if(p[i].arrivetime
{
jcbtemp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
voiddeal(jcb*p,floatarrivetime,
floatservicetime,
floatstarttime,
floatfinishtime,
float&zztime,
float&avezztime,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-1].finishtime+p[k].servicetime;
}
}
for(k=0;k<=N-1;k++)
{
p[k].zztime=p[k].finishtime-p[k].arrivetime;
p[k].avezztime=p[k].zztime/p[k].servicetime;
}
}
voidjcbf(jcb*p,intN)
{
floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,avezztime=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;ervicetime{
min=p[k+1].servicetime;
next=k+1;
}
}
jcbtemp;
temp=p[m+1];
p[m+1]=p[next];
p[next]=temp;
}
deal(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);
Print(p,arrivetime,servicetime,starttime,finishtime,zztime,avezztime,N);}
intmain(){
while
(1){
system("CLS");
intN;
printf("\t\t\t*********短作业优先调度算法*********\n");
printf("请输入作业数目:
");
scanf("%d",&N);
charch;
if(N>MAX)
{
printf("\t!
!
输入的作业数目太大,请输入不大于%d的整数\n",MAX);
printf("按Q或者q退出程序,按其他任意键继续测试...");
ch=getch();
if(ch=='Q'||ch=='q')
{
break;
}
elsecontinue;
}
input(a,N);
jcb*b=a;
jcbf(b,N);
printf("按Q或者q退出程序,按其他任意键继续测试...");
ch=getch();
if(ch=='Q'||ch=='q')
{
break;
}
}
return0;
}体会心得
每一次课程设计度让我学到了在平时课堂不可能学到的东西。
所以我对每一次课程设计的机会都非常珍惜。
不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。
整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。
当然网上的东西很乱很杂,自己要能够学会筛选。
不能决定对或错的,有个很简单的方法就是去尝试。
同学间的讨论,这是很重要的。
老师毕竟比较忙。
对于课程设计最大的讨论伴侣应该是同学了。
大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。
最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。
对于本次课设的题目,SJF算法以进入系统的作业所要求的CPU时间为标准,总选取估计计算时间最短的作业投入运行。
SJF由于考虑到作业的服务时间,只在某种程度上效率要高,但大多数上即使算法易于实现,效率也不高,主要弱点是忽视了作业等待时间,会出现饥饿现象。
参考文献
1)宗大华,宗涛,陈吉人着《操作系统》北京:
人民邮电出版社,2009
2)李爱华,程磊着《面相对象程序设计(C++语言)》北京:
清华大学出版社,2010
3)宋晓宇《windows操作系统核心编程实验教程》中国铁道出版社
4)张丽芬,刘利雄,王金玉编着《操作系统实验教程>清华大学出版社