您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 用时间片轮转法调度虚拟进程
《操作系统课程设计》报告学号:姓名:班级:指导教师:报告日期:一、课设目的通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。二、课设任务要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;设计PCB适用于时间片轮转法;建立进程队列;实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。○5总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。三、实验方法与设计分析每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。重复以上过程,直到所要进程都完成为止四、程序流程图是五、程序源代码#includestdafx.h#includestdio.h#includestdlib.h#includestring.h#includectype.h#includeiostream#includefstreamusingnamespacestd;ofstreammyfile(bb.txt,ios::app||ios::trunc);typedefstructnode{charname[10];/*进程名*/intround;/*进程分配的时间片*/开始设置时间片选择增加进程继续增加结束进程PCB顺序PCB顺序打印进程调度进程结束循环intcputime;/*进程消耗的CUP时间*/intneedtime;/*进程需要的CUP时间*/intcount;/*进程运行时间*/charstate;/*进程的状态:'R':运行,'W':等待,'F':结束*/structnode*next;/*指向下一个进程的指针*/}PCB;PCB*finish,*ready,*tail,*run;/*指向三个队列的队首的指针,tail为就绪队列的队尾指针*/intN;/*定义进程的数目*/voidfirstin(void){if(ready!=NULL){run=ready;ready=ready-next;run-state='R';run-next=NULL;}else{run=NULL;}}voidprt1(chara){coutnamecputimeneedtimecountroundstateendl;myfilename;myfilecputime;myfileneedtime;myfilecount;myfileround;myfilestateendl;}voidprt2(chara,PCB*p){coutp-namep-cputimep-needtimep-countp-roundp-stateendl;myfilep-name;myfilep-cputime;myfilep-needtime;myfilep-count;myfilep-round;myfilep-stateendl;}voidprt(charalgo){PCB*p;prt1(algo);if(run!=NULL){prt2(algo,run);}p=ready;while(p!=NULL){prt2(algo,p);p=p-next;}p=finish;while(p!=NULL){prt2(algo,p);p=p-next;}getchar();}voidinsert(PCB*q){tail-next=q;tail=q;q-next=NULL;}voidrcreate_task(charalgo){PCB*p;intn,time;charna[10];ready=NULL;finish=NULL;run=NULL;cout请输入进程数目N:;cinN;for(n=0;nN;n++){p=(PCB*)malloc(sizeof(PCB));coutEnterthenameofprocess:endl;cinna;coutEnterthetimeofprocess:endl;cintime;strcpy(p-name,na);p-cputime=0;p-needtime=time;p-count=0;p-state='W';p-round=2;if(ready!=NULL){insert(p);}else{p-next=ready;ready=p;tail=p;}}run=ready;ready=ready-next;run-state='R';cout创建成功。endl;}voidchakan(charalgo){if(run-count==run-round){run-count=0;if(ready!=NULL){run-state='W';insert(run);firstin();}}prt(algo);}voidroundrun(charalgo){while(run!=NULL){run-cputime=run-cputime+1;run-needtime=run-needtime-1;run-count=run-count+1;if(run-needtime==0){run-next=finish;finish=run;run-state='F';run=NULL;if(ready!=NULL){firstin();}}else{if(run-count==run-round){run-count=0;if(ready!=NULL){run-state='W';insert(run);firstin();}}}prt(algo);}}voidcaidan(){cout**************************主页************************endl;cout*******************1.I创建若干进程*******************endl;cout*******************2.C进程进行查看*******************endl;cout*******************3.O进程进行调度*******************endl;cout*******************4.H结束********************endl;}intmain(){loop1:caidan();charalgo;cinalgo;if(algo=='i'||algo=='I'){rcreate_task(algo);}elseif(algo=='c'||algo=='C'){chakan(algo);}elseif(algo=='o'||algo=='O'){roundrun(algo);}elseif(algo=='h'||algo=='H'){gotoloop2;}gotoloop1;loop2:myfile.close();return0;}六、运行结果七、问题及解决方法(1)处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实习是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行(2)进程运行一次后,若要求运行时间〉0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。(3)若“就绪”状态的进程队列不为空,则重复上面(1)和(2)的步骤,直到所有进程都成为“结束”状态。(4)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。(5)为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。八、心得体会操作系统是计算机系统中必不可少的系统软件。它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。操作系统采用时间片法调度进程,使系统资源得到充分的利用,用户也可以花更少的时间完成更多的工作,这次模拟系统调度进程,让我明白了系统时间片的调度方法,对操作系统理论的学习更加深一层。通过这次的课设也让我充分的体会到了要真正的理解计算机操作系统的工作原理应该多上机做试验和操作,这样才能领悟的更深更好。或许程序完成的有点粗糙但是也花了一些心里,感觉自己还时弄懂了它的实现过程,以前觉得操作系统都时些理论上的东西对于具体的实践说实话还确实没怎么弄过。所以这次的课程设计让我学到了更多的东西。
本文标题:用时间片轮转法调度虚拟进程
链接地址:https://www.777doc.com/doc-735372 .html