下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 进程调度模拟实验说明书

进程调度模拟实验说明书.doc

进程调度模拟实验说明书

西可可可
2017-10-06 0人阅读 举报 0 0 暂无简介

简介:本文档为《进程调度模拟实验说明书doc》,可适用于综合领域

进程调度模拟实验说明书目录前言错误~未定义书签。摘要错误~未定义书签。正文错误~未定义书签。设计思想错误~未定义书签。算法中用到的主要数据结构(采用类C语言定义)……………………相关的各程序伪代码……………………………………………………调试分析…………………………………………………………………测试结果………………………………………………………………(源程序(带注释)总结………………………………………………………………………………参考文献…………………………………………………………………………致谢………………………………………………………………………………附件部分源代码………………………………………………………………前言理解操作系统进程管理中进行进程调度的过程和编程方法掌握先来先服务调度算法和最高优先数优先的调度算法创建进程控制块PCB。理解进程的状态及变化动态显示每个进程的当前状态及进程的调度情况进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动进程的状态:运行状态:进程正在处理器上运行就绪状态:一个进程获得了除处理器外的一切所需资源一旦得到处理器即可运行等待状态:一个进程正在等待某一事件发生而暂时停止运行先进先出调度算法:其基本原则是按照作业到达系统或进程进入就绪对列的先后次序来选择。对于进程调度来说一旦一个进程占有了处理器它就一直运行下去直到该进程完成其工作或者因等待事件而不能继续运行时才释放出处理器。优先级调度算法:按照进程的优先级大小来调度。使高优先级进程或线程得到优先的处理的调度策略称为优先级调度算法。进程的优先级可以由系统自动地按一定原则赋给它也可由系统外部来进行安排但在许多采用优先级调度的系统中通常采用动态优先数策略。即一个进程的优先级不是固定的往往是随许多因素的变化而变化。尤其随作业(进程)的等待时间已使用的处理器时间或其他系统资源的使用情况而定以防止低优先级进程或线程长期饥饿现象发生时间片轮转算法:时间片轮转算法主要用于处理器调度。采用此算法的系统其进程就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程也就是说按照先进先出原则调度但一旦进程占有处理器仅使用一个时间片在使用完一个时间片后进程还没有完成其运行它也必须释放出(被抢占)处理器给下一个就绪的进程。而被抢占的进程返回到就绪队列的末尾重新排队等候再次运行。摘要编写一个进程调度程序允许多个进程共行的进程调度程序)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。)每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。)(进程的运行时间以时间片为单位进行计算。)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。)就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加来表示。)如果运行一个时间片后进程的已占用CPU时间已达到所需要的运行时间则撤消该进程如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间也就是进程还需要继续运行此时应将进程的优先数减(即降低一级)然后把它插入就绪队列等待CPU。)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB以便进行检查。重复以上过程直到所要进程都完成为止。关键字:进程、优先级、时间片、需要运行时间正文、设计思想设置时间片选择增加进程是结束进程打印进程继续增加结束否优先级排序打印进程进程调度完成真图程序设计流程图定义结构体PCB描述进程的进程控制块定义数组PCBpcbMax存放进程进程调度程序调用face()函数选择所要进行的操作。输入则增加进程并调度进程输入则打印进程输入则任务结束增加进程调用AddProcess()函数将输入的进程存放在数组pcbMax中打印进程调用print()函数在该函数中首先调用sort()函数对进程按优先级和先来先服务排序然后显示输出排序后的进程进程调度调用attemper()函数调度优先级最高的进程分配给CPU使之运行一个时间片进程优先级排序调用sort()函数按照先来先服务和优先级排序使排序完最优先运行的进程存放在pcb中。进程调度程序选择一个就绪状态的进程使之在处理器上运行每个进程的状态信息用数据结构(进程控制块PCB)表示进程的调度采用最高优先数优先的调度算法和先来先服务调度算法相结合的算法并且采用动态优先数策略选择进程占用处理器后该进程仅能使用一个时间片运行完后优先数减、算法中用到的主要数据结构(采用类C语言定义))进程控制块:描述进程的状态信息用结构体定义typedefstructprocess{charname进程名intpriority优先数TimeReachTime到达时间TimeNeedTime需要运行时间TimeUsedTime已用时间charstate进程状态}PCB进程控制块进程调度模拟程序进程调入打印进程进程调度选择操作进程优先AddProcessprint()attemper(face()级排序()函数函数)函数函数sort()函数图进程调度模拟程序模块图)sort()函数:函数用冒泡法排序首先按到达时间排序使到达时间最早(即pcbnReachTime最小)的进程被交换到pcb中再按优先级排序使具有最高优先级(即pcbnpriority最大)的进程被交换到pcb中。相同优先级的进程只按到达时间排序)print()函数:打印函数先调用sort()排序函数对进程进行排序排序完再打印输出进程)AddProcess()函数:增加进程函数输入要添加的进程的进程控制块的信息并依次存放在数组PCBpcbMax中每加入一个进程后判断是否还要继续增加进程若是则继续循环的执行操作)attemper()函数:进程调度函数调度排完序后存放在pcb中的进程分配给该进程CPU使之运行一个时间片然后比较进程的剩余时间(pcbNeedTimepcbUsedTime)是否小于时间片的大小pTime若是则该进程调度完成进程处于完成状态若非则已用时间加上一个时间片进程处于就绪状态继续等待运行然后调用print()函数打印输出当前进程的状态并排序直至所有进程处于完成状态后结束运行)face()函数:函数打印所能进行的操作以供选择。输入则是增加进程后调度进程输入则是打印进程输入则是任务结束。)main()函数:首先设置时间片的大小pTime然后调用face()函数选择要进行的操作choose=''则增加进程并调度choose=''则打印进程choose=''则任务结束。函数间的关系:)sort()函数嵌套在print()函数中调用)调用AddProcess()函数前必须先调用print()函数对进程进行排序并打印、相关的各模块的伪代码算法)进程控制块:描述进程的状态信息用结构体定义typedefstructprocess{charname进程名intpriority优先数TimeReachTime到达时间TimeNeedTime需要运行时间TimeUsedTime已用时间charstate进程状态}PCB进程控制块)sort()函数主要代码如下:for(i=i<ni)先按到达时间排序{for(j=nj>=ij){if(pcbjReachTime<pcbjReachTime){temp=pcbjpcbj=pcbjpcbj=temp}}}for(i=i<ni)再按优先级进行排序{for(j=nj>=ij){if(pcbjpriority>pcbjpriority){temp=pcbjpcbj=pcbjpcbj=temp}}})print()函数主要代码如下:sort()printf("n进程名优先级到达时间需要时间已用时间进程状态n")for(i=i<ni){printf("sddddcn",pcbiname,pcbipriority,pcbiReachTime,pcbiNeedTime,pcbiUsedTime,pcbistate)})AddProcess()函数主要代码如下:do{printf("n请输入进程名")scanf("s",pcbnname)printf("请输入进程的优先级")scanf("d",pcbnpriority)printf("请输入进程需要的时间")scanf("d",pcbnNeedTime)pcbnReachTime=npcbnUsedTime=pcbnstate='W'nprintf("还要继续增加进程吗,是(Y),否(N)")do{ch=getchar()}while(ch!='Y'ch!='N'ch!='y'ch!='n')}while(ch=='Y'||ch=='y'))attemper()函数主要代码如下:do{if((pcbNeedTimepcbUsedTime)>pTime){pcbUsedTime=pTime已用时间加时间片pcbpriority优先级减一pcbstate='W'}else{pcbUsedTime=pcbNeedTime已用时间等于需要时间pcbpriority=优先级置为零pcbstate='F'完成进程将状态置为完成}print()}while(pcbstate!='F'))face()函数要代码如下:charchooseprintf("n增加进程并调度进程请按")printf("n打印进程请按")printf("n任务结束,请按")printf("n请选择:")do{choose=getchar()}while(choose!=''choose!=''choose!='')returnchoose})main()函数主要代码如下:charchoosen=初始化进程数为printf("设置时间片的大小:")scanf("d",pTime)choose=face()do{if(choose==''){AddProcess()print()attemper()}if(choose==''){print()}if(choose==''){return}choose=face()}while()、调试分析运行程序如图所示:选择增加进程并调度进程输入进程名字process,进程优先级为进程需要的时间为输入进程名字process,进程优先级为进程需要的时间为输入进程名字process,进程优先级为进程需要的时间为再次添加进程process,优先级为进程需要的时间为是否还需要继续添加测试结果经过测试分析可知道进程调度按照最高优先级算法和先来先服务算法调度程序来使用CPU的就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加来表示。如果运行一个时间片后进程的已占用CPU时间已达到所需要的运行时间则撤消该进程如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间也就是进程还需要继续运行此时应将进程的优先数减(即降低一级)然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB以便检查源程序(带注释)#include<stdioh>#defineTimeint#defineMaxtypedefstructprocess{charname进程名intpriority优先数TimeReachTime到达时间TimeNeedTime需要运行时间TimeUsedTime已用时间charstate进程状态}PCB进程控制块intn标示进程的总数PCBpcbMaxintpTime时间片大小voidAddProcess(){charchdo{printf("n请输入进程名")scanf("s",pcbnname)printf("请输入进程的优先级")scanf("d",pcbnpriority)printf("请输入进程需要的时间")scanf("d",pcbnNeedTime)pcbnReachTime=npcbnUsedTime=pcbnstate='W'nprintf("还要继续增加进程吗,是(Y),否(N)")do{ch=getchar()}while(ch!='Y'ch!='N'ch!='y'ch!='n')}while(ch=='Y'||ch=='y')}排序函数将最先运行的进程放在最先即pcbvoidsort(){用冒泡排序inti,jPCBtemp先按到达时间排序for(i=i<ni){for(j=nj>=ij){if(pcbjReachTime<pcbjReachTime){temp=pcbjpcbj=pcbjpcbj=temp}}}再按优先级进行排序for(i=i<ni){for(j=nj>=ij){if(pcbjpriority>pcbjpriority){temp=pcbjpcbj=pcbjpcbj=temp}}}if(pcbstate!='F'){pcbstate='R'将优先级最高的状态置为运行}}voidprint()打印{intisort()printf("n进程名优先级到达时间需要时间已用时间进程状态n")for(i=i<ni){printf("sddddcn",pcbiname,pcbipriority,pcbiReachTime,pcbiNeedTime,pcbiUsedTime,pcbistate)}}voidattemper()调度{do{if((pcbNeedTimepcbUsedTime)>pTime){pcbUsedTime=pTime已用时间加时间片pcbpriority优先级减一pcbstate='W'}else{pcbUsedTime=pcbNeedTime已用时间等于需要时间pcbpriority=优先级置为零pcbstate='F'完成进程将状态置为完成}print()}while(pcbstate!='F')}charface(){charchooseprintf("n增加进程并调度进程请按")printf("n打印进程请按")printf("n任务结束,请按")printf("n请选择:")do{choose=getchar()}while(choose!=''choose!=''choose!='')returnchoose}voidmain(){charchoosen=初始化进程数为printf("设置时间片的大小:")scanf("d",pTime)choose=face()do{if(choose==''){AddProcess()print()attemper()}if(choose==''){print()}if(choose==''){return}choose=face()}while()}总结在设计过程中的思考和讨论使我对现有知识能够运用计算机来解决现实生活中的实际问题确立了信心对模块化程序设计思想有了比较清晰的印象为今后的程序设计奠定了一定的心理和技术上的准备。这期为期两周的课程设计期间有喜有忧有欢呼声有叹息声有烦闷有惊喜在这样一次又一次的砺炼中我得到的不仅仅是知识更多的是自身能力的提高。经过这次课设我学到了很多。这次课程设计加强了我对计算机操作系统的认识对我个人而言是对所学课程内容掌握情况的一次自我验证。通过此次课程设计加深理解了什么是进程熟悉了UNIXLINUX支持的进程的控制方式。了解了LINUX的命令及使用格式熟悉了UNIXLINUX的常用基本命令练习并掌握了LINUX提供的vi编辑器来编译C程序学会了利用gcc编译、调试C程序。通过这次课设加深了我对操作系统的认识进一步了解了进程调度的过程在老师的指导下对进程模拟程序做了进一步的改进并且学会了怎么分析问题和解决问题更重要的是通过此次课程设计使我懂得了三思而后行学到了严谨的学习态度、永不放弃的精神也增加了去面对更大挑战的信心和勇气同时也培养了把学到的知识用于解决实际问题培养了我的独立动手能力。参考文献汤子瀛哲凤屏《计算机操作系统》西安电子科技大学学出版社王清李光明《计算机操作系统》冶金工业出版社孙钟秀等操作系统教程高等教育出版社曾明Linux操作系统应用教程陕西科学技术出版社张丽芬刘利雄《操作系统实验教程》清华大学出版社孟静操作系统教程,,原理和实例分析高等教育出版社周长林计算机操作系统教程高等教育出版社张尧学计算机操作系统教程清华大学出版社任满杰操作系统原理实用教程电子工业出版社致谢首先非常感谢我的指导老师王旭阳老师她在我的课程设计过程中提出了指导性的方案和架构并指引我阅读相关的资料和书籍使我在不熟悉的领域中仍能迅速掌握新的技术。此外还要感谢我的操作系统老师王旭阳老师在以往的基础课学习中为我打下良好的基础这是我这次课程设计能够顺利完成的前提。在此也感谢我的同学在设计完成后对程序的测试没有他们也许就难以发现一些潜在的错误在此一并表示感谢。另外通过本次课程设计我深刻体会到在遇到问题时要沉着冷磨刀不误砍柴工”。首先对问题进行全面静不要盲目去做须知“的分析勾勒出大致思路然后根据思路决定解决问题的大致方向制定相应的解决方案进而逐步解决问题。附件部分源程序代码#include<stdioh>#defineTimeint#defineMaxtypedefstructprocess{charname进程名intpriority优先数TimeReachTime到达时间TimeNeedTime需要运行时间TimeUsedTime已用时间charstate进程状态}PCB进程控制块intn标示进程的总数PCBpcbMaxintpTime时间片大小voidAddProcess(){charchdo{printf("n请输入进程名")scanf("s",pcbnname)printf("请输入进程的优先级")scanf("d",pcbnpriority)printf("请输入进程需要的时间")scanf("d",pcbnNeedTime)pcbnReachTime=npcbnUsedTime=pcbnstate='W'nprintf("还要继续增加进程吗,是(Y),否(N)")do{ch=getchar()}while(ch!='Y'ch!='N'ch!='y'ch!='n')}while(ch=='Y'||ch=='y')}排序函数将最先运行的进程放在最先即pcbvoidsort(){用冒泡排序inti,jPCBtemp先按到达时间排序for(i=i<ni){for(j=nj>=ij){if(pcbjReachTime<pcbjReachTime){temp=pcbjpcbj=pcbjpcbj=temp}}}再按优先级进行排序for(i=i<ni){for(j=nj>=ij){if(pcbjpriority>pcbjpriority){temp=pcbjpcbj=pcbjpcbj=temp}}}if(pcbstate!='F'){pcbstate='R'将优先级最高的状态置为运行}}voidprint()打印{intisort()printf("n进程名优先级到达时间需要时间已用时间进程状态n")for(i=i<ni){printf("sddddcn",pcbiname,pcbipriority,pcbiReachTime,pcbiNeedTime,pcbiUsedTime,pcbistate)}}voidattemper()调度{do{if((pcbNeedTimepcbUsedTime)>pTime){pcbUsedTime=pTime已用时间加时间片pcbpriority优先级减一pcbstate='W'}else{pcbUsedTime=pcbNeedTime已用时间等于需要时间pcbpriority=优先级置为零pcbstate='F'完成进程将状态置为完成}print()}while(pcbstate!='F')}charface(){charchooseprintf("n增加进程并调度进程请按")printf("n打印进程请按")printf("n任务结束,请按")printf("n请选择:")do{choose=getchar()}while(choose!=''choose!=''choose!='')returnchoose}voidmain(){charchoosen=初始化进程数为printf("设置时间片的大小:")scanf("d",pTime)choose=face()do{if(choose==''){AddProcess()print()attemper()}if(choose==''){print()}if(choose==''){return}choose=face()}while()}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/28

进程调度模拟实验说明书

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利