2022年2022年进程调度模拟程序[借 .pdf
1 衡阳师范学院操作系统课程设计题目:进程调度模拟程序系别:计算机科学系专业:物联网工程班级:1205 班学生姓名:陈毅学号:12450135 指导老师:王 玉 奇完成日期:2014 年 12 月*日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - 2 目 录一. 课程设计目的 . 错误!未定义书签。二. 课程设计要求 . 错误!未定义书签。三. 设计思想 . 3 3.1 基本概念 . 3 3.2 进程控制块 . 3 3.3 算法思想 . 5 四. 详细设计 . 5 4.1 程序设计流程图. 5 4.2 程序各模块功能介绍. 错误!未定义书签。五. 运行结果及分析 . 10 5.1 程序调试 . 10 5.2 运行结果 . 10 5.3 结果分析 . 12 六. 总结 . 13参考文献 . 13 附录 .13 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 3 一. 课程设计目的深入掌握进程调度的概念原理和实现方法,理解操作系统进程管理中进行进程调度的过程和编程方法 ,掌握先来先服务调度算法和最高优先数优先的调度算法,创建进程控制块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 基本概念优先级调度算法:按照进程的优先级大小来调度。使高优先级进程或线程得到名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - 4 优先的处理的调度策略称为优先级调度算法。进程的优先级可以由系统自动地按一定原则赋给它, 也可由系统外部来进行安排。 本次课程设计是自己给定进程的优先级。但在许多采用优先级调度的系统中,通常采用动态优先数策略。 即一个进程的优先级不是固定的,往往是随许多因素的变化而变化。尤其随作业(进程)的等待时间,已使用的处理器时间或其他系统资源的使用情况而定,以防止低优先级进程或线程长期饥饿现象发生时间片轮转算法:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则 CPU 将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则 CPU 当即进行切换。 调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后, 它被移到队列的末尾。时间片轮转算法主要用于处理器调度。采用此算法的系统, 其进程就绪队列往往按进程到达的时间来排序。 进程调度程序总是选择就绪队列中的第一个进程, 也就是说按照先进先出原则调度, 但一旦进程占有处理器仅使用一个时间片,在使用完一个时间片后,进程还没有完成其运行,它也必须释放出(被抢占)处理器给下一个就绪的进程。 而被抢占的进程返回到就绪队列的末尾重新排队等候再次运行。进程调度程序选择一个就绪状态的进程,使之在处理器上运行, 每个进程的状态信息用数据结构(进程控制块PCB )表示,进程的调度采用最高优先数优先和按时间片轮转相结合的调度算法,并且采用动态优先数策略, 选择进程占用处理器后该进程仅能使用一个时间片,运行完后优先数减1。进程的状态:运行状态 R(Run ) :进程正在处理器上运行。就绪状态W (Wait) :一个进程获得了除处理器外的一切所需资源,一旦得到处理器即可运行。完成状态 F(Finish ) :一个进程一旦完成,就停止运行。3.2 进程控制块描述进程的状态信息,用结构体定义typedef struct process char name10; /进程名名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - 5 int priority; /优先数Time ReachTime; /到达时间Time NeedTime; /需要运行时间Time UsedTime; /已用时间char state; /进程状态PCB; /进程控制块3.3 算法思想定义结构体 PCB描述进程的进程控制块,定义数组PCB pcbMax存放进程进程调度程序调用face() 函数选择所要进行的操作。输入1 则增加进程并调度进程;输入 2 则打印进程,输入0 则任务结束;增加进程,调用AddProcess()函数,将输入的进程存放在数组pcbMax 中;打印进程,调用 print()函数,在该函数中首先调用sort()函数对进程按优先级和先来先服务排序,然后显示输出排序后的进程。进程调度,调用attemper() 函数,调度优先级最高的进程分配给 CPU使之运行一个时间片,进程优先级排序,调用sort()函数,按照先来先服务和优先级排序,使排序完最优先运行的进程存放在pcb0 中。四. 详细设计4.1 程序设计流程图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 18 页 - - - - - - - - - 6 4.2 程序各模块功能介绍 进程优先级排序 sort( )函数:函数用冒泡法排序,首先按到达时间排序,使到达时间最早(即pcbn.ReachTime 最小)的进程被交换到pcb0 中,再按优先级排序,使具有最高优先级(即pcbn.priority最大)的进程被交换到pcb0 中。相同优先级的进程只按到达时间排序。主要代码如下:for (i=0;i=i;j-) if (pcbj+1.ReachTimepcbj.ReachTime) 设置时间片选择是结束进程增加进程打印进程继续增加否结束打印进程优先级排序进程调度完成真开始名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - 7 temp=pcbj; pcbj=pcbj+1; pcbj+1=temp; for (i=0;i=i;j-) if (pcbj+1.prioritypcbj.priority) temp=pcbj; pcbj=pcbj+1; pcbj+1=temp; 打印进程 print( ) 函数:先调用 sort ()排序函数对进程进行排序,排序完再打印输出进程主要代码如下: sort(); printf(n 进程名 优先级到达时间需要时间已用时间进程状态 n); for (i=0;in;i+) printf(%8s%8d%8d%10d%10d%10cn,pcbi.name,pcbi.priority,pcbi.ReachTime,pcbi.NeedTime,pcbi.UsedTime,pcbi.state); 进程调入 AddProcess() 函数:增加进程函数,输入要添加的进程的进程控制块的信息,并依次存放在数组PCB pcbMax中,每加入一个进程后判断是否还要继续增加进程,若是则继续循环的执行操作主要代码如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - 8 do printf(n请输入进程名 ); scanf(%s,pcbn.name); printf(请输入进程的优先级 ); scanf(%d,&pcbn.priority); printf(请输入进程需要的时间 ); scanf(%d,&pcbn.NeedTime); pcbn.ReachTime=n; pcbn.UsedTime=0; pcbn.state=W; n+; printf(还要继续增加进程吗 , 是(Y), 否(N); do ch=getchar(); while(ch!=Y&ch!=N&ch!=y&ch!=n); while (ch=Y|ch=y); 进程调入 attemper( )函数:调度排完序后存放在pcb0 中的进程,分配给该 进 程CPU , 使 之 运 行 一 个 时 间 片 , 然 后 比 较 进 程 的 剩 余 时 间(pcb0.NeedTime-pcb0.UsedTime)是否小于时间片的大小pTime,若是,则该进程调度完成,进程处于完成状态,若非,则已用时间加上一个时间片,进程处于就绪状态继续等待运行,然后调用print( )函数打印输出当前进程的状态并排序,直至所有进程处于完成状态后结束运行。主要代码如下:do if (pcb0.NeedTime-pcb0.UsedTime)pTime) pcb0.UsedTime+=pTime; /已用时间加时间片 pcb0.priority-;/优先级减一 pcb0.state=W; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 18 页 - - - - - - - - - 9 else pcb0.UsedTime=pcb0.NeedTime; /已用时间等于需要时间 pcb0.priority=-1000;/优先级置为零 pcb0.state=F;/完成进程,将状态置为完成 print(); while(pcb0.state!=F); 选择操作 face( )函数:函数打印所能进行的操作以供选择。输入1 则是增加进程后调度进程,输入2 则是打印进程,输入0 则是任务结束。主要代码如下:char choose; printf(n增加进程并调度进程,请按1); printf(n打印进程,请按 2); printf(n任务结束 , 请按 0); printf(n请选择 :); do choose=getchar(); while(choose!=1&choose!=2&choose!=0); return choose; main( )函数:首先设置时间片的大小pTime,然后调用 face() 函数选择要进行的操作,choose=1 则增加进程并调度, choose=2 则打印进程,choose=0 则任务结束。主要代码如下:char choose; n=0; /初始化进程数为 0 printf(设置时间片的大小 :); scanf(%d,&pTime); choose=face(); do 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18 页 - - - - - - - - - 10 if (choose=1) AddProcess(); print(); attemper(); if (choose=2) print(); if (choose=0) return; choose=face(); while(1); 函数间的关系: 1)sort( )函数嵌套在 print()函数中调用 2) 调用 AddProcess() 函数前必须先调用print()函数对进程进行排序并打印。五. 运行结果及分析5.1 程序调试此次 课 程 设 计 进 程调 度 模 拟程 序 是 用 C 编 写 的 程 序 , 运 行 环 境是codeblocks 。5.2 运行结果首先设置时间片大小,然后根据提示,选择1 创建进程,输入进程的名称,该进程的优先级, 该进程需要的运行时间。 然后依次创建三个进程, 详细信息如图所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 18 页 - - - - - - - - - 11 点击回车键,运行创建的三个进程,运行过程如图所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 18 页 - - - - - - - - - 12 上述创建的三个进程运行完以后,还可以继续创建新的进程继续运行。5.3 结果分析运行程序后,首先根据提示设置时间片大小为10,然后顺序创建三个进程cy,cx,cxw,它们的优先级依次为5,8,4,需要运行的时间为20,10,16,程序默认三个进程到达的时间依次为0,1,2。运行进程, 首先比较优先级大小,选择进程 cx 运行,其进程状态为R (运行) ,其运行一个时间片时间以后,该进程运行完成,优先级减变为-1000(程序默认),然后其进程状态变为F(完成) ;再选择 llg进程运行,首先其进程状态从W (等待)变为 R (运行) ,然后运行一个时间片时间以后, 该进程还没运行完成, 其优先级减 1 变为 4,相比 cxw进程,他们具有相同的优先级,所以继续运行cy 进程,再运行一个时间片以后,该进程运行完成,其优先级变为-1000(程序默认),其进程状态从 R(运行)变为 F(完成) ;最后运行 cxw进程,首先它的进程状态运行一个时间片以后,换没结束,再运行 6 以后运行结束,其优先级变为-1000(程序默认),其进程状态从 R(运行)变为F(完成) 。至此,创建的三个进程运行完毕,换可以创建新的进程运行,如上图所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 18 页 - - - - - - - - - 13 六. 总结通过此次课程设计, 我掌握进程调度的相关知识,特别是对最高优先级优先算法和按时间轮转算法有了新的认识。课程设计与平时的上的实验课比较起来有很大的差距, 实验课只是将这一章中的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西, 这要更难一些。此次课程设计主要遇到的困难就是,最高级优先数优先算法和按时间片轮转法的算法的结合,经过查阅资料和自己多次的调试,终于使编写的程序达到了预期的效果。总体来说我认为操作系统这门学科在计算机科学当是中非常重要的。这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西。参考文献1刘振安、刘燕君著.C+ 程序设计课程设计.北京 : 机械工业出版社,2004 2美Abraham Silberschatz, Peter Baer Galvin, Greg Gagne 著. 郑扣根译. 操作系统概念(第六版) . 北京:高等教育出版社,2004 3陈向群,向勇等. Windows操作系统原理(第二版). 北京:机械工业出版社,2004. 4Mark E.Russinovich, David A. Solomon. Microsoft Windows Internals 2005 5Jhnson M.Hart. Windows System,3rd Edition. Addsion wesley Profession.2004 附录:#include #include #include #define Time int #define Max 100 typedef struct process char name10; /进程名int priority; /优先数Time ReachTime; /到达时间Time NeedTime; /需要运行时间名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 18 页 - - - - - - - - - 14 Time UsedTime; /已用时间char state; /进程状态PCB; int n;/进程的总数PCB pcbMax; int pTime;/时间片大小void AddProcess() char ch; do printf(n 请输入进程名 ); scanf(%s,pcbn.name); printf( 请输入进程的优先级 ); scanf(%d,&pcbn.priority); printf( 请输入进程需要的时间 ); scanf(%d,&pcbn.NeedTime); pcbn.ReachTime=n; pcbn.UsedTime=0; pcbn.state=W; n+; printf( 还要继续增加进程吗 ,是(Y),否(N); do ch=getchar(); while(ch!=Y&ch!=N&ch!=y&ch!=n); while (ch=Y|ch=y); / 排序函数,将最先运行的进程放在最先即pcb0 void sort () / 用冒泡法排序int i,j; PCB temp; for (i=0;i=i;j-) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 18 页 - - - - - - - - - 15 if (pcbj+1.ReachTimepcbj.ReachTime) temp=pcbj; pcbj=pcbj+1; pcbj+1=temp; for (i=0;i=i;j-) if (pcbj+1.prioritypcbj.priority) temp=pcbj; pcbj=pcbj+1; pcbj+1=temp; if(pcb0.state!=F) pcb0.state!=R;/将优先级最高的状态置为运行 void print() int i; sort(); printf(n 进程名 优先级到达时间需要时间已用时间进程状态n); for (i=0;ipTime) pcb0.UsedTime+=pTime; /已用时间加时间片pcb0.priority-;/ 优先级减一pcb0.state=W; else pcb0.UsedTime=pcb0.NeedTime; /已用时间等于需要时间pcb0.priority=-100;/ 优先级置为零pcb0.state=F;/完成进程,将状态置为完成 printf( 调度后:n); print(); char face() char choose; printf(n 增加进程并调度进程,请按1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 18 页 - - - - - - - - - 17 printf(n 打印进程,请按 2); printf(n 任务结束 , 请按 0); printf(n 请选择 :); do choose=getchar(); while(choose!=1&choose!=2&choose!=0); return choose; int main() char choose; n=0; /初始化进程数为 0 printf( 设置时间片的大小 :); scanf(%d,&pTime); system(cls); choose=face(); do if (choose=1) AddProcess(); print(); attemper(); if (choose=2) system(cls); print(); if (choose=3) attemper(); if (choose=0) return 0; choose=face(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 18 页 - - - - - - - - - 18 while(1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 18 页 - - - - - - - - -