《《操作系统原理》课程设计--动态优先数高者优先进程调度算法.docx》由会员分享,可在线阅读,更多相关《《操作系统原理》课程设计--动态优先数高者优先进程调度算法.docx(13页珍藏版)》请在第一文库网上搜索。
1、操作系统原理课程设计题目:动态优先数高者优先进程调度算法目的1 .加深对进程和进程调度概念的理解;2 .熟练C/C+/VC开发工具的使用;3 .熟悉文件读写操作;4 .掌握基本的windows编程技巧。内容使用ccvc编写和调试进程调度算法的模拟程序。调度算法采用动态优先数高者优先的原则。最终程序要求(1)具有图形界面;(2)能动态显示地显示每个进程在每个CPU时间片的状态;(3)使用文件记录调度过程,便于时候查看。进程模拟的基本原理下表定义进程PCB的结构(具体编程时可以适当删减部分成员变量):序号成员变量意义或操作方法1进程名称ID进程的标识2优先数PRIORITY越大优先权越高,在运行期
2、间可以被动态改变。3到达时间ENTERTIME进程输入的时间4进程余下运行时间A11T1ME进程开始为全部时间,运行完毕A11T1ME=O5己使用CPU时间USEDTIME每在CPU上运行1个时间片就加16连续运行时间RUNTIME进程就绪前已经连续运行RUNT1ME个时间片7连续就绪时间READYTIME进程运行前已连续就绪READYTIME个时间片8进程状态STATE三个状态:READYRUNNING、FINISHED9队列指针NEXT用来将PCB排成队列10代权周转时间RIGHTTIME(ENDTIME-ENTERTIME)/USEDTIME11结束时间ENDTIME进程输出的时间pcb
3、结构体如图所示structpcb(intpid:进程的Pid进程IDTCHARname10;进程标志符进程名称TCHARUSername10;进程用户名intPriOrity:进程优先数优先数PRIORITYintfirstpriority;初始优先数优先数PRIORITYintervtertime;进程输入时间inta11time:进程余下的时间进程开始为全部时间,运行完毕A11T1ME=0intUSetime.进程占用CPU时间已使用CPU时间USEDTIME每在CPU上运行1个时间片就加1intruntime:/连续运行时间RUNTIME进程就绪前已经连续运行RUNT工ME个时间片int
4、readytime;连续就绪时间READYTIME进程运行前已连续就绪READYTIME个时间片TCHARstate10;进程状态STATE三个状态:READY、RUNNING、FINISHEDintrighttime;代权周转时间RIGHTTIME(ENDTI-ENTERTIME)/USEDTIMEintendtime:结束时间ENDTIME进程输出的时间structpcb*next;梃指针每个进程的状态可以是就绪READY、运行RUNNING或结束END三种状态之一,见下图。调度原则的详细解释:进程的优先数及需要的运行时间可以事先人为指定(也可以由随机数产生);进程的到达时间为进程输入的时
5、间;进程的运行时间以时间片为单位进行计算; 进的状态可以是就绪READY运行RUNNING或完成FINISHED三种状态; 每1个时间片结束都重新依据优先数高者优先的算法来调度进程; 进程在就绪队列中每等待1个时间片,其优先数加1; 进程每运行1个时间片,其优先数减3,并置其于就绪状态等待重新调度; 进程每运行1个时间片,其“已使用CPU时间usedtimew加1; 如果运行1个时间片后,进程的“已使用CPU时间USEDTIME”已达到所需要的运行时间,则撤消该进程; 如果运行1个时间片后,进程的“已使用CPU时间USEDT1ME”还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程
6、的优先数减3,然后把它插入就绪队列等待CPU; 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB数据,以便事后进行检查和分析; 重复以上过程,直到所要进程都完成为止。开发环境VS2013实验过程核心代码(参考了网上一份关于动态优先数高者优先进程调度算法的程序)如下图所示:targetver.hstdafx.cppConso1eAppIicationZxi(全局范围)# inc1ude# inc1ude# inc1ude# :1nC1Ude# incIude# defineNUM3进程数# definetimePieces2/Xj片数# definemva1ue2/减少优先权
7、# defineava1ue1增加优先投# definesIeeptime2000Xj片长度structpcb(TCHARname20:进程名TCHARUSername10;进程idintVaIUe;优先数intarrivetime:到达时间int;需要运行时间intJtime;已运行时间intIiantime;连续运行时间intIian/eadytime隹续就绪时间intendtime:结束时间TCHARcondition100;状态structpcb*next:/队列指针.:structpcbPCBNUM,center;structpcb*headc;intcount=NUM;voidVa
8、1ueChange(structpcb*p).EJstructpcb*Sort().BvoidPrirrtReadyO1.EJirvtRu1e()T.)EJVoidmain().运行程序如图所示程序核心流程1.添加新的进程到进程队列PCB中,然后将其添加入就绪队列中获得EDITUpdateData(true):初始化并插入一行introw=newtask_Iist.GetItemCountO;newtask-1ist.InsertItem(row,_T(*):将edit的数据放入IiStCOrrtrO1中CStringstrpid:strpid.Format(_T(*%dz,),count_p
9、id);newtask_1ist.SetItemText(rowjO,strpid).newtask_1ist.SetItemText(row,1,addproname_edit).newtask_1ist.SetItemText(rowj2,addusername-edit);strpid.Format(_T(*%dz,),addpriority_edit):newtask_1ist.SetIteinText(rowj3,strpid).strpid.Format(_T(*%d*),adda11tie-edit).newtask_1ist.SetItejnText(rowj%strpid).
10、将数据存入PCB数组中_tcscpy(PCBcount_pid.name,addproname_edit);_tcscpy(PCBcoxmt_pid.username,addusername_edit);PCBcount_pid.priority=addpriority_edit;PCBcount_pid.firstpriority=addpriority_edit;PCBcount_pid.a1Itie=adda11time_edit.PCBcount_pid.a11time=count_pid;coimt_pid-count_pid+1;2.用SortO函数对就绪队列排序,优先级最高者进入
11、CPUstructpcb*SOrt0按优先级排序(高到低)structpcb*head,*q,*p1;inti,j:for(i=0:icount-pid;i+)(for(j=i+1;jcount-pid;j+)(if(PCBi.priorityPCBj.priority)center=PCBi;PCBi=PCBj;PCBj=center;)head=(structpcb*)ma11oc(sizeof(structpcb):p1=head;for(i=0:inamejPCBi.name);_tcscpy(q-state,PCBi.state);q-a11time=PCBi.a11time;q-r
12、untie=PCBi.runtie:q-priority=PCBi.priority;q-next=NU11;p1-next-q;p1-q;)returnhead:3 .CPU中的进程运行时,每运行一个时间片,其优先数减3,并置其于就绪队列等待重新调度,重新Sort。排序,直到进程所需时间片运行完为止,运行完之后进程进入finish队列4 .动态优先数高者优先进程调度算法的规则如下图RU1eO函数所示intRu1e()structpcb*p;p=headc-next;whi1e(1)if(p-nmtime=p-a11tie)cscpy(p-state,_T(finish);p=p-next;i
13、f(p=NU11)returnO;e1se(if(p-next=NU11)whi1e(1)(S1eep(s1eeptime);p-runtime+;p-priority-=mva1ue;if(p-runtime=p-a11time)(p-righttime=(p-endtime-p-entertie)/p-rmtie;_tcscpy(p-statej_T(finish);return0;)e1se(tcscpy(p-state,T(run);)e1sefor(intk=0;kruntime+;e1se_tcscpy(p-state,_T(*run*);e1sefor(intk=0;kruntie+;p-priority-=mva1ue;if(p-runtiea1!time)_tcscpy(p-state,_T(run*);if(k=tiePieces-1)Va1ueChange(p):P=Sort()-next:break;e1sep-righttime=(p-endtime-p-entertime)/p-runtime;_tcscpy(p-statej/(finish):Va1ueChange(p):p=Sort()-next;