您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > 进程调度模拟程序课程设计
《操作系统》课程设计报告专业:计算机科学与技术班级:09计本班学号姓名成绩200981010118刘利刚题目名称:进程调度模拟程序完成日期:2012年6月20日甘肃政法学院计算机科学学院目录第一章课程设计目的3第二章课程设计要求3第三章设计思想43.1基本概念43.2进程控制块53.3算法思想5第四章详细设计64.1程序设计流程图64.2程序各模块功能介绍6第五章运行结果及分析145.1程序调试145.2运行结果155.3结果分析17第六章总结17参考文献18进程调度模拟程序第一章课程设计目的深入掌握进程调度的概念原理和实现方法,理解操作系统进程管理中进行进程调度的过程和编程方法,掌握先来先服务调度算法和最高优先数优先的调度算法,创建进程控制块PCB。理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。进程调度是处理机管理的核心内容。本次课程设计用C语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会最高优先数优先与按时间片轮转调度结合算法的优缺点。第二章课程设计要求编写一个进程调度程序,允许多个进程并行执行。1、进程调度算法:采用最高优先数优先与按时间片轮转调度结合算法。2、每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。3、进程的优先数及需要的运行时间可在运行时输入,进程的到达时间为输入进程的时间。4、进程的运行时间以时间片为单位进行计算。5、每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。6、就绪进程获得CPU后都只能运行一个时间片。7、如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。8、每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。第三章设计思想3.1基本概念优先级调度算法:按照进程的优先级大小来调度。使高优先级进程或线程得到优先的处理的调度策略称为优先级调度算法。进程的优先级可以由系统自动地按一定原则赋给它,也可由系统外部来进行安排。本次课程设计是自己给定进程的优先级。但在许多采用优先级调度的系统中,通常采用动态优先数策略。即一个进程的优先级不是固定的,往往是随许多因素的变化而变化。尤其随作业(进程)的等待时间,已使用的处理器时间或其他系统资源的使用情况而定,以防止低优先级进程或线程长期饥饿现象发生时间片轮转算法:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。时间片轮转算法主要用于处理器调度。采用此算法的系统,其进程就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先进先出原则调度,但一旦进程占有处理器仅使用一个时间片,在使用完一个时间片后,进程还没有完成其运行,它也必须释放出(被抢占)处理器给下一个就绪的进程。而被抢占的进程返回到就绪队列的末尾重新排队等候再次运行。进程调度程序选择一个就绪状态的进程,使之在处理器上运行,每个进程的状态信息用数据结构(进程控制块PCB)表示,进程的调度采用最高优先数优先和按时间片轮转相结合的调度算法,并且采用动态优先数策略,选择进程占用处理器后该进程仅能使用一个时间片,运行完后优先数减1。进程的状态:运行状态R(Run):进程正在处理器上运行。就绪状态W(Wait):一个进程获得了除处理器外的一切所需资源,一旦得到处理器即可运行。完成状态F(Finish):一个进程一旦完成,就停止运行。3.2进程控制块描述进程的状态信息,用结构体定义typedefstructprocess{charname[10];//进程名intpriority;//优先数TimeReachTime;//到达时间TimeNeedTime;//需要运行时间TimeUsedTime;//已用时间charstate;//进程状态}PCB;//进程控制块进程调度模拟程序进程调入AddProcess()函数打印进程print()函数进程调度attemper()函数选择操作face()函数进程优先级排序sort()函数图1进程调度模拟程序模块图3.3算法思想定义结构体PCB描述进程的进程控制块,定义数组PCBpcb[Max]存放进程进程调度程序调用face()函数选择所要进行的操作。输入1则增加进程并调度进程;输入2则打印进程,输入0则任务结束;增加进程,调用AddProcess()函数,将输入的进程存放在数组pcb[Max]中;打印进程,调用print()函数,在该函数中首先调用sort()函数对进程按优先级和先来先服务排序,然后显示输出排序后的进程。进程调度,调用attemper()函数,调度优先级最高的进程分配给CPU使之运行一个时间片,进程优先级排序,调用sort()函数,按照先来先服务和优先级排序,使排序完最优先运行的进程存放在pcb[0]中。第四章详细设计4.1程序设计流程图设置时间片选择是结束进程增加进程打印进程继续增加否结束打印进程优先级排序进程调度完成真开始图2程序设计流程图4.2程序各模块功能介绍1进程优先级排序sort()函数:函数用冒泡法排序,首先按到达时间排序,使到达时间最早(即pcb[n].ReachTime最小)的进程被交换到pcb[0]中,再按优先级排序,使具有最高优先级(即pcb[n].priority最大)的进程被交换到pcb[0]中。相同优先级的进程只按到达时间排序。主要代码如下:for(i=0;in-1;i++)//先按到达时间排序{for(j=n-2;j=i;j--){if(pcb[j+1].ReachTimepcb[j].ReachTime){temp=pcb[j];pcb[j]=pcb[j+1];pcb[j+1]=temp;}}}for(i=0;in-1;i++)//再按优先级进行排序{for(j=n-2;j=i;j--){if(pcb[j+1].prioritypcb[j].priority){temp=pcb[j];pcb[j]=pcb[j+1];pcb[j+1]=temp;}}}进程优先级排序Sort()函数的流程图如图3所示。开始i=0j=n-2i=0pcb[j+1].prioritypcb[j].priorityj=n-2pcb[j+1].ReachTimepcb[j].ReachTimetemp=pcb[j];pcb[j]=pcb[j+1];pcb[j+1]=temp;temp=pcb[j];pcb[j]=pcb[j+1];pcb[j+1]=temp;j=j-1Yj=ij=j-1j=iNYi=i+1Ni=i+1in-1NYin-1NY结束图3sort()函数流程图2打印进程print()函数:先调用sort()排序函数对进程进行排序,排序完再打印输出进程主要代码如下:sort();printf(\n进程名优先级到达时间需要时间已用时间进程状态\n);for(i=0;in;i++){printf(%8s%8d%8d%10d%10d%10c\n,pcb[i].name,pcb[i].priority,pcb[i].ReachTime,pcb[i].NeedTime,pcb[i].UsedTime,pcb[i].state);3进程调入AddProcess()函数:增加进程函数,输入要添加的进程的进程控制块的信息,并依次存放在数组PCBpcb[Max]中,每加入一个进程后判断是否还要继续增加进程,若是则继续循环的执行操作主要代码如下:do{printf(\n请输入进程名);scanf(%s,pcb[n].name);printf(请输入进程的优先级);scanf(%d,&pcb[n].priority);printf(请输入进程需要的时间);scanf(%d,&pcb[n].NeedTime);pcb[n].ReachTime=n;pcb[n].UsedTime=0;pcb[n].state='W';n++;printf(还要继续增加进程吗,是(Y),否(N));do{ch=getchar();}while(ch!='Y'&&ch!='N'&&ch!='y'&&ch!='n');}while(ch=='Y'||ch=='y');打印进程print()函数和进程调入函数AddProcess()函数的流程图如图4和图5所示。开始开始输入pcb[n]进程信息sort()排序n=n+1i=0继续增加进程输出pcb[i]进程信息ch=getchar()i=i+1YYch!='Y'&&ch!='N'&&ch!='y'&&ch!='n'inNN结束ch=='Y'||ch=='y'YN结束图4print()函数流程图图5AddProcess()函数流程图4进程调入attemper()函数:调度排完序后存放在pcb[0]中的进程,分配给该进程CPU,使之运行一个时间片,然后比较进程的剩余时间(pcb[0].NeedTime-pcb[0].UsedTime)是否小于时间片的大小pTime,若是,则该进程调度完成,进程处于完成状态,若非,则已用时间加上一个时间片,进程处于就绪状态继续等待运行,然后调用print()函数打印输出当前进程的状态并排序,直至所有进程处于完成状态后结束运行。主要代码如下:do{if((pcb[0].NeedTime-pcb[0].UsedTime)pTime){pcb[0].UsedTime+=pTime;//已用时间加时间片pcb[0].priority--;//优先级减一pcb[0].state='W';}{pcb[0].UsedTime=pcb[0].NeedTime;//已用时间等于需要时间pcb[0].priority=-1000;//优先级置为零pcb[0].state='F';//完成进程,将状态置为完成}print();}while(pcb[0].state!='F');进程调入attemper()函数流程图如图6所示。开始(pcb[0].NeedTime-pcb[0].UsedTime)pTimeNYpcb[0].UsedTime=pcb[0].NeedTimepcb[0].priority=-1000pcb[0].state='F'pcb[0].UsedTime+=pTimepcb[0].priority—pcb[0].state='W'print()打印pcb[0].state!='F'NY结束图6attemper()函数流程图5选择操作face()函数:函数打印所能进行的操作以供选择。输入1则是增加进程后调度进程,输入2则是打印进程,输入0则是任务结束。主要代码如下:charchoose;printf(\n增加进程并调度进程,请按1);printf(\n打印进程,请按2);printf(\n任务结束,请按0);printf(\n请选择:);do{choose=getchar();}while(choose!='1'&&choose!='2'&&choose!='0');returnchoose;}选择操作face()函数流程图如图7所示。开始增加进程并调度进程,请按1打印进程,请按2任务结束,请按0请选择:choose=getchar()choose!='1'&&choose!='2'&&choose!='0'
本文标题:进程调度模拟程序课程设计
链接地址:https://www.777doc.com/doc-5713123 .html