短作业优先调度算法学院计算机科学与技术专业学号学生姓名指导教师姓名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运行顺序流程图输入进程的个数:Nr队列中是否只有一个进程?执行时间处理函数:deal()Y结束Sort()调用Input()依次输入进程的信息:进程名到达时间服务时间N执行最短优先jcbf()输出最后信息:print()开始源程序文件#includestdio.h#includeconio.h#includewindows.h#defineMAX100//最多能管理的作业数目structjcb//作业控制块JCB,定义为结构体{charname[10];//作业名floatarrivetime;//作业到达时间floatservicetime;//作业服务时间floatstarttime;//作业开始执行时间floatfinishtime;//作业完成时间floatzztime;//作业周转时间floatavezztime;//作业平均周转时间};jcba[MAX];voidinput(jcb*p,intN){inti;printf(请分别输入:\n\t作业名,到达时间,服务时间(如:JOB1510)\n\n);for(i=0;i=N-1;i++){printf(请输入第%d个作业信息:,i+1);scanf(%s%f%f,&p[i].name,&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;kN;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%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\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].arrivetimep[j].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;mN-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[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=nfor(intk=m+1;km+i;k++){if(p[k+1].servicetimemin){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(NMAX){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个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。不能决定对或错的,有个很简单的方法就是去尝试。同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。大家都在研究同样的