您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统课程设计报告.
肇庆学院计算机科学与软件学院《操作系统》课程设计报告设计题目:采用优先数算法模拟进程调度程序完成日期:2008年6月3日设计小组成员姓名班级学号05科技20052415112105科技20052415111705科技20042405182605科技200524151113设计题目采用优先数调度算法的模拟进程调度程序设计形式小组合作设计目的加深对进程概念及进程管理各部分内容的理解设计预备知识(1)进程管理。(2)优先数调度算法。设计内容采用动态优先数的方法,编写一进程调度程序模拟程序。模拟程序只进行相应的调度模拟操作。小组成员分工算法设计:刘海峰程序编码:黎国标阮永杰过程监控:李素丽项目负责人:刘海峰采用优先数算法模拟进程调度程序分析、设计与实现一、设计理论描述进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。另有一种定义方法是“程序在处理器上的执行”。为了模拟的方便,本设计采用这种定义。简单地说,进程包括三种状态:运行状态、就绪状态、完成状态。通常操作系统用一个称为进程控制块(PCB)的数据结构来记录进程的属性信息。PCB一般应包含以下信息:进程标识信息(本进程的标志ID、父进程的标志ID、用户标识);处理机状态信息(用户使用的寄存器、控制和状态寄存器、堆栈指针);进程调度和控制信息(进程的状态、进程的调度优先级、程序和数据的地址、进程同步和通信机制、进程已等待时间、已使用的处理器时间、进程在有关队列中的链接指针、分给进程的主存大小和位置、进程使用的其他资源信息、进程得到有关服务的优先级、进程调度所需的其他信息)。优先级调度算法:按照进程的优先级大小来调度,是高优先级进程得到优先的处理的调度策略,可使用非抢占或可抢占两种策略。二、设计思想、设计分析及数据结构模型这个设计需要考虑两个问题:如何组织进程、如何实现进程模拟调度。考虑如何组织进程,首先就要设置进程控制块的内容。进程控制块PCB记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的设计只使用了必不可少的信息。一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类:(1)标识信息每个进程都要有一个唯一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序中,采用符号方式,也就是为每个进程依次分配一个不相同符号。(2)说明信息用于记录进程的基本情况,例如,进程的状态、等待原因、进程程序存放位置、进程数据存放位置等。设计中,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。(4)管理信息管理信息记录进程管理和调度的信息。例如进程优先数和进程队列指针等。设计中,包括队列指针、进程优先数、已运行时间、还需运行时间。因此可将进程控制块结构定义如下:ClassPCB{Stringproname;//进程标识符Stringstate;//进程状态Intpri;//进程优先数Intruntime;//进程已运行时间Intneedtime;//还需要运行时间PCB*next;//下一个进程控制块的指针}确定进程控制块内容后,要考虑的就是如何将进程控制块组织在一起。多道程序设计系统,往往同时创建多个进程。在单处理机的情况下,每次只能有一个进程处于运行态,其他的进程处于就绪状态或等待状态。为了便于管理,通常把处于相同状态的进程的进程控制块链接在一起。单处理机系统中,正在运行的进程只有一个,因此,单处理机系统中进程控制块分成一个正在运行进程的进程控制块、就绪进程的进程控制块组织成的就绪队列和等待进程的进程控制块组成的等待队列。由于设计模拟的是进程调度,没有对等待队列的操作,所以设计中只有一个指向正在运行进程的进程控制块指针和一个就绪进程的进程控制块队列指针和一个指向已完成进程的进程控制块队列指针。这样,进程控制块的链表实际上是数据结构中使用的静态链表。进程控制块的链接方式可以采用单向和双向链表,设计中,进程控制块队列采用单向不循环静态链表。在各队列中,各进程按照进程的优先数进行排列,队首指向的是优先数最高的进程,每次向各队列中插入一个进程时都会先按照插入排序法按优先数从高到低把进程插入到队列的相应位置。以上是如何组织进程,下面考虑如何调度进程,一开始,调度程序将就绪队列的队首进程加入到运行队列,运行一周期后用当前正在运行的进程的优先数与就绪队列队首进程的优先数对比,如果当前运行的进程的优先数小于就绪队列队首的进程,则把当前运行的进程按照按优先数的顺序插入到就绪队列的相应位置,把就绪队列队首的进程加入到运行队列中。三、程序流程图开始就绪队列队首进程加入运行队列运行队列是否为空?结束是否延时1秒:当前运行进程优先数减1当前运行进程运行时间加1当前运行进程还需时间减1所需时间是否为0?否是设进程状态为完成,将该进程加入完成队列,将运行队列设为空.就绪队列是否为空?否是就绪队列是否为空?是否就绪队列队首进程加入到运行队列中.就绪队列队首进程的优先数是否大于当前运行进程的优先数?否是当前运行的进程状态设为就绪.将当前运行的进程插入就绪队列.将就绪队列的队首进程插入到运行队列.四、源代码#includestdafx.h#includeiostream#includetime.h#includestringusingnamespacestd;intn;classPCB{public:stringprocname;//进程名intpri;//进程优先数stringstate;//进程状态intruntime;//进程已运行CPU时间intneedOftime;//还需要时间PCB*next;//指针};PCB*run=NULL;//运行队列头指针PCB*ready=NULL;//就绪队列头指针PCB*finish=NULL;//完成队列头指针voidDtime(intt){time_tcurrent_time;time_tstart_time;time(&start_time);do{time(¤t_time);}while((current_time-start_time)t);}voidPrinft(){PCB*p;system(cls);//清屏p=run;if(p!=NULL){p-next=NULL;}cout当前正在运行的进程:endl;cout进程名称\t优先数\t还需要时间\t已运行时间\t状态:endl;while(p!=NULL){coutp-procname\t\tp-pri\tp-needOftime\t\tp-runtime\t\tp-stateendl;p=p-next;}coutendlendl;cout当前的就绪队列:endl;cout进程名称\t优先数\t还需要时间\t已运行时间\t状态:endl;p=ready;while(p!=NULL){coutp-procname\t\tp-pri\tp-needOftime\t\tp-runtime\t\tp-stateendl;p=p-next;}coutendlendl;cout当前已经完成的进程:endl;cout进程名称\t优先数\t还需要时间\t已运行时间\t状态:endl;p=finish;while(p!=NULL){coutp-procname\t\tp-pri\tp-needOftime\t\tp-runtime\t\tp-stateendl;p=p-next;}}voidinsert(PCB*p)//按Pri大小插入就绪队列{PCB*S1,*S2;if(ready==NULL){p-next=NULL;ready=p;}else{S1=ready;S2=S1;while(S1!=NULL){if(S1-pri=p-pri){S2=S1;S1=S1-next;}elsebreak;}if(S2-pri=p-pri){S2-next=p;p-next=S1;}else{p-next=ready;ready=p;}}}voidpriority(){run=ready;ready=ready-next;run-state=运行;while(run!=NULL)/*当运行队列不空时,有进程正在运行*/{Dtime(1);//延时1秒run-runtime=run-runtime+1;run-needOftime=run-needOftime-1;run-pri=run-pri-1;/*每运行一次优先数降低1个单位*/if(run-needOftime==0)/*如所需时间为0将其插入完成队列*/{run-state=完成;run-next=finish;finish=run;run=NULL;/*运行队列头指针为空*/if(ready!=NULL)/*如就绪队列不空*/{run=ready;run-state=运行;ready=ready-next;}}elseif((ready!=NULL)&&(run-priready-pri)){run-state=就绪;insert(run);run=ready;run-state=运行;ready=ready-next;}Prinft();/*输出进程PCB信息*/}}voidCTProcessOfPri()//创建进程{PCB*Node;stringc[5]={P1,P2,P3,P4,P5};srand((int)time(0));for(intj=0;j5;j++){Node=newPCB;if(Node==NULL){return;}else{Node-procname=c[j];Node-needOftime=1+(int)(15.0*rand()/(RAND_MAX+1.0));//为进程随机分配占用CPU时间.Node-runtime=0;Node-state=就绪;Node-pri=1+(int)(20.0*rand()/(RAND_MAX+1.0));//为进程随机分配优先数.}insert(Node);}}voidmain(){cout*******************************************endl;cout*优先数调度算法*endl;cout*******************************************endl;cout按任意键开始创建进程……endl;CTProcessOfPri();//新建进程Prinft();coutendl;cout按任意键开始运行进程模拟调度程序……endl;getchar();priority();//运行模拟进程调度。}五、程序运行结果及分析图5.1系统运行的初始画面图5.2按任意键后开始执行的画面图5.3执行一段时间时的画面图5.4执行完毕后的画面六、课程设计心得与体会(包括对课程设计的改进建议)附录
本文标题:操作系统课程设计报告.
链接地址:https://www.777doc.com/doc-2454688 .html