《多级反馈队列调度算法的实现.docx》由会员分享,可在线阅读,更多相关《多级反馈队列调度算法的实现.docx(10页珍藏版)》请在课桌文档上搜索。
1、学生实习报告课程名称.数据结构与数据处理应用训练题目名称多级反应队列调度算法的实现学生学院计算机与计算科学专业班级学号学生姓名指导教师2012年2月16日多级反应队列调度算法的实现【摘要】多级反应队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程任务得到响应又能使短进程任务迅速完成。UNIX操作系统便采取这种算法,而本次试验就是试用C语言模拟某多级反应队列调度算法。本次试验中前三级就绪队列采用时间片轮转法,时间片大小分别为2、4和8,最后一级就绪队列采用FlFO调度,将任务进入多级队列进行模拟,任务从优先级高的队列到优先级地的队列的顺序逐一进入,还用了算法支持抢占式,
2、最后完成模拟,得到各个任务先后完成的顺序,还有得到各个任务的响应时间、离开时间、周转时间。【关健词】队列优先级任务时间1内容与要求【内容】多级反应队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成。UNiX操作系统便采取这种算法,本次试验就是试用C语言模拟某多级反应队列调度算法,通过输入任务号、到达时间、运行时间,求出任务完成的先后顺序以及各个任务的响应时间、离开时间、周转时间。【要求】多级反应队列调度算法描述:1、该调度算法设置四级就绪队列:前三级就绪队列采用时间片轮转法,时间片大小分别为2、4和8:最后一级就绪队列采用F
3、lFo调度。2,任务在进入待调度的队列等待时,首先进入优先级最高的队列等待3、首先调度优先级高的队列中的任务。假设高优先级中队列中己没有调度的任务,那么调度次优先级队列中的任务,依次类推。4,对于同一个队列中的各个任务,按照队列指定调度方法调度。每次任务调度执行后,假设没有完成任务,就被降到下一个低优先级队列中。5、在低优先级的队列中的任务在运行时,又有新到达的任务,CPU马上分配给新到达的任务。(注:与原来的题目不同,原题是在低优先级的队列中的任务在运行时,又有新到达的任务时,要在运行完这个时间片后,CPl马上分配给新到达的任务,而此题不需要在运行完这个时间片,即正在进行的任务立刻停止,CP
4、U马上分配给新到达的任务)6、为方便实现,时间以1为单位,用整数数据表示;且每个时间点,最多只有一个任务请求效劳(即输入)。2总体设计2.1 算法总体思路:这是建立在一个时间轴上的,即时刻,一个一个时刻(时间点)进行。主函数思路:先初始化所有队列,再输入任务个数,如果输入个数为0,那么重新输入,然后输入各个任务的信息,即任务号、到达时间、运行时间,再当时刻到任务的到达时间时,就创立任务,然后运行任务,时刻自动加1,创立任务与运行任务进行循环,直到所有任务进行完或所有队列为空才跳出循环,最后清空所有队列。功能函数思路:voidcreate(LinkQucuc*x,Jobjob):使任务的己运行时
5、间为0,再使任务进入第一个队列。voidfunction(LinkQueuc*x,inttiming):四个队列从第一个到第四个,即从最高优先级开始,任务在4个队列中逐个进行,根据任务是否为第一次执行,求出响应时间,任务完成时,求出离开时间和周转时间输出信息,在前3个队列,如果任务刚完成一个就绪队列的时间片,就降低优先级,使任务进入下一个队列。2.2 功能模块介绍:voidmain()函数功能:主函数voidInitQueue(LinkQueueiHQ):队列的初始化voidEnQueue(LinkQueueHQ1ElemTypeitem)函数功能:向队列中插入一个元素ElemTypeOutQ
6、ueue(LinkQueuefcHQ)函数功能:从队列中删除一个元素ElemType*PeekQueue(LinkQueueGHQ)函数功能:读取队首元素boolEmptyQueue(LinkQueueHQ)函数功能:检查队列是否为空voidClearQueue(LinkQueuefeHQ)函数功能:去除链队中的所有元素,使之变为空队voidcreate(LinkQueue*x,Jobjob)函数功能:创立任务.voidfunction(LinkQueue*x,int.timing)函数功能:任务运行.2.3 3输入输出输入:任务号到达时间运行时间输出:任务号响应时间离开时间周转时间、2.4文
7、件介绍Inain.cpp:主函数的存放,功能函数的调用。queue,h:队列的各个根本功能函数,任务的创立函数与运行函数。3详细设计3.1 存储结构描述structJobintjobnum;任务号intarrivetime;到达时间intburst;运行时间intretime;响应时间intleavetime;离开时间introundtime;周转时间intruntime;已运行时间;任务的存储结构typedefJobElCmType;任务的类型定义structLNodeElemTypedata;值域1.NOde*nextj链接指针域;structLinkQueue1.NodU*fmnt;/队
8、首指针1.NOdU本rear;队尾指针;3.2 参数说明timing是时刻,时间轴;Job勺Obing:任务数组动态分配)irrtIeatime4;时间片大小到达时间:任务请求的时刻运行时间:任务运行完需要的时间响应时间:任务从到达时间到任务第一次执行的时间差周转时间:任务从开始请求(到达时间)到任务完成离开的时间己运行时间:任务己运行的时间离开时间:任务运行完后离开队列的时刻3.3 具体算法voidInitQueue(LinkQueueftHQ)算法:队首队尾设置为空。voidEnQucue(LinkQueuefeHQ,ElemTypeitem)算法:得到一个新结点,把item的值赋给新结点
9、的值域,再把新结点的指针域置空,假设链队为空,那么新结点既是队首又是队尾,假设链队非空,那么新结点被链接到队尾并修改队尾指针。ElemTypeOutQueue(LinkQucucfeHQ)算法:假设徒队为空那么中止运行,暂存队首元素以便返回,暂存队首指针以便收回队首节点,使队首指针指向下一个结点,假设删除后链队为空,那么使队尾指针为空,然后回收原队首节点,返回被删除的队首元素。ElemType*PeekQueue(LinkQueueftHQ)算法:假设链队为空那么中止运行,返回队首元素指针(Job*).boolEmptyQueue(LinkQueueHQ)算法:判断队首或队尾任一个指针是否为空
10、即可。voidClearQucue(LinkQueucftHQ)算法:队首指针赋给P,依次删除队列中的每个结点,然后循环结束后队首指针己经变空,置队尾指针为空。voidcreate(LinkQueue*x,Jobjob)算法:使任务的已运行时间为0,再使任务进入第一个队列。voidfunction(LinkQueue*x,inttiming)算法:将4个队列设为循环,从第一个队列开始到第四个队列逐个进行以下操作。判断队列是否为空,当队列不为空时,那么继续,假设该队列的已运行时间为1并且时刻已等于或大于任务的到达时间,即判断任务是否为第一次执行,假设是,求出任务响应时间=当前时刻-任务到达时间,
11、即发出请求到任务开始的时间差。如果运行完,求出任务离开时间=当前时刻+1,周转时间=离开时间-到达时间,输出任务信息,再判断该任务是否完成该队列的时间片,假设是,那么降低优先级,任务进入下一级队列.所有队列遍历完,任务均完成,循环结束。4程序测试测试一:测试数据:1 082 643 912测试二:测试数据:1072 543 7134 129测试三:当输入错误,输入任务个数是0,重新输入测试数据:10 72 543 7134 129测试四:测试数据:1 152 42测试五:测试数据:12 82 323 754 9105 146选作(同个时间点多个任务请求)测试六:测试数据:1 232 243 6
12、94 675总结这次实验用了多级反应队列调度算法,这个算法我们没有学过,所以理解有点困难,但是,这个算法中涉及到了队列,它是队列的升级,是多级队列,因此,我在此不仅学到了新的知识,还是对数据结构中队列局部的熟悉与加深,更好的掌握了队列知识。这次实验我的题目与原题有点差异,在低优先级的队列中的任务在运行时,又有新到达的任务,那么在运行完这个时间片后,CPU马上分配给新到达的任务,即算法支持抢占式,但我的程序确是在新到达的任务,那么这个任务立即中止,CPU马上分配给新到达的任务,我觉得这样更好。当然,这次编程中遇到过许多困难,比方存储结构顺序的错误,又比方EIemTyPe*PeekQueue(Li
13、nkQueue&HQ),这是与队列的原根底功能函数有所区别,它需要的是返回元素指针(Job*),我原来返回的是元素,后来经过调试,错误提示,才改正确等等。多级反应队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成。UNlX操作系统便采取这种算法。现实中,我们在计算机中翻开各种程序,就是多级反应队列调度算法的应用,这次是我们对操作系统操作的模拟,与实际相联系,增加了趣味性。这次是我们第一次接触操作系统,对操作系统原理有了一定的了解,为我们将来学习操作系统打下了根底.参考文献数据结构实用教程附录main,cppttinclde8
14、includetfinclude#includequeue,hvoidmain()1.inkQueue*x;intn,i;inttiming=。;时刻Job*jobing;任务数组(动态分配)X=(LinkQueue*)malIoc(sizeof(LinkQueue)*5);for(i=l:i=4;计+)初始化所有队列InitQueue(xi);COUt请输入任务个数:*n;if(n-=0)CoUt没有任务,请重新输入n;jobing=newJobn;动态空间分配cout请输入各个任务信息:endl;CoUt任务号到达时间运行时间endl;for(i=0;ijobingi.jobnumjobi
15、ngiLarrivetimejobingi.burst;i=0;while(i!=n!(EmptyQueue(xl)SftEmptyQueue(x2)&EmptyQueue(x3)&EmptyQueue(x4)while(timing=jobingi.arrivetime)Create(X,jobingi);创立任务i+:function(x,timing);任务运行liming+;for(i=l;idata=item;newptr-next=NULL;if(HQTear=NULL)HQ.fron=HQ.rear=newptr;elseHQ.rear=HQ,rear-next=newir;El
16、emTypeOu(Queue(LinkQueue&HQ)if(HQJront=NULL)cerr,QueueNULL.,data;1.Node*p=HQ.front;HQ.front=p-next;if(HQJront=NULL)HQ.rear=NULL;deletep;returntemp;ElemType*PeekQueue(LinkQueue&HQ)if(HQ.front=NULL)cerrdata;boolEmptyQueuefLinkQueue&HQ)(returnHQ.front=NULL;voidClearQueue(LinkQueuenext;deletep;p=HQ.fron
17、t;HQ.rear=NULL;voidfunction(LinkQueue*x,inttiming)任务运行intIeatime;时间片的大小leatime0=0;Ieatime1=2;leatime2=6;Ieatime3=l4;Job*t=NULL;inti=l;while(irumime+;/己运行时间+1if(t-runtime=1&timing=t-arrivetime)t-retime=timing-t-arrivetime;if(t-runtime=t-burst)t-leavetime=timing+l;t-roundtime=t-leavetime-t-arrivetime;CoUt”任务号:”jobnum”“响应时间retime;COUt”离开时间:”leavetime周转时间:roundtime;coutruntime=leatimei)&(i=3)/调整优先级EnQueue(xi+l,OutQueue(xi);)break;i+;voidcreate(LinkQueue*x,Jobjob)job.runtime=0;EnQueue(x1job);