《使用动态优先权的进程调度算法的模拟实验.pdf》由会员分享,可在线阅读,更多相关《使用动态优先权的进程调度算法的模拟实验.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.使用动态优先权的进程调度算法的模拟使用动态优先权的进程调度算法的模拟1 1、实验目的、实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。2 2、实验容、实验容(1 1)用)用 CC 语言来实现对语言来实现对 N N 个进程采用动态优先算法的进程调度;个进程采用动态优先算法的进程调度;(2 2)每个用来标识进程的进程控制块)每个用来标识进程的进程控制块PCBPCB 用结构来描述,包括以下字段:用结构来描述,包括以下字段:进程标识符进程标识符 idid进程优先数进程优先数 prioritypriority,并规定优先数
2、越大的进程,其优先权越高;,并规定优先数越大的进程,其优先权越高;进程已占用的进程已占用的 CPUCPU 时间时间 cputimecputime;进程还需占用的进程还需占用的 CPUCPU 时间时间 alltimealltime,当进程运行完毕时,当进程运行完毕时,alltimealltime 变为变为 0 0;进程的阻塞时间进程的阻塞时间 startblockstartblock,表示当进程再运行表示当进程再运行 startblockstartblock 个时间片后,个时间片后,进进程将进入阻塞状态;程将进入阻塞状态;进程被阻塞的时间进程被阻塞的时间 blocktimeblocktime,表
3、示已阻塞的进程再等待,表示已阻塞的进程再等待 blocktimeblocktime 个时个时间片后,将转换成就绪态间片后,将转换成就绪态进程状态进程状态 statestate;队列指针队列指针 nextnext,用来将,用来将 PCBPCB 排成队列排成队列(3 3)优先数改变的原则:)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加进程在就绪队列中呆一个时间片,优先数增加 1 1进程每运行一个时间片,优先数减进程每运行一个时间片,优先数减 3 3。(4 4)假设在调度前,系统中有)假设在调度前,系统中有 5 5 个进程,它们的初始状态如下:个进程,它们的初始状态如下:IDIDPRI
4、ORITYPRIORITY0 09 91 138382 230303 329294 40 0.专业.CPUTIMECPUTIMEALLTIMEALLTIME0 03 30 03 3-1-10 0READYREADY0 06 6-1-10 0READYREADY0 03 3-1-10 0READYREADY0 04 4-1-10 0READYREADYSTARTBLOCKSTARTBLOCK2 2BLOCKTIMEBLOCKTIMESTATESTATE3 3READYREADY(5 5)为了清楚地观察诸进程的调度过程,程序应将每个时间片的进程的情况显)为了清楚地观察诸进程的调度过程,程序应将每个
5、时间片的进程的情况显示出来,参照的具体格式如下:示出来,参照的具体格式如下:RUNNINGRUNNINGPROGPROG:i iREADY_QUEUE:-id1-id2READY_QUEUE:-id1-id2BLOCK_QUEUE:-id3-id4BLOCK_QUEUE:-id3-id4=IDID0 01 1P1P1C1C1A1A1T1T1B1B1S1S12 2P2P2C2C2A2A2T2T2B2B2S2S23 3P3P3C3C3A3A3T3T3B3B3S3S34 4P4P4C4C4A4A4T4T4B4B4S4S4PRIORITYPRIORITYP0P0CPUTIMECPUTIMEC0C0AL
6、LTIMEALLTIMEA0A0STARTBLOCKSTARTBLOCKT0T0BLOCKTIMEBLOCKTIMEB0B0STATESTATES0S0.专业.程序代码:程序代码:/A.4使用动态优先权的进程调度算法的模拟/by YanQiwei#include#define N 5voidvoid init();init();voidvoid print();print();intint getRunning();getRunning();voidvoid sort();sort();intint run(run(intint time);time);enum STATEReady,Run,
7、Block,RunOut;struct PROCESSint ID;int Priority;int Cputime;int Alltime;int Startblock;int Blocktime;enum STATE State;ProcessN;int READYN;int BLOCKN;int RUNOUTN2;intint main()main()voidvoid init()init().专业.int Time=0;init();printf(Time:%dn,Time);sort();print();while(1)/print(Time);return 0;Time+;getc
8、har();if(run(Time)break;sort();printf(Time:%dn,Time);.voidvoid print()print()int i;if(getRunning()=0)printf(tRUNNING PROG:%dn,getRunning();printf(tREADY_QUEUE:);for(i=0;iN;+i)printf(ntBLOCK_QUEUE:);for(i=0;i=0)printf(-%d,ProcessBLOCKi.ID);break;elseif(READYi=0)printf(-%d,ProcessREADYi.ID);break;else
9、int i;/printf(Input properties of%d process(PRIORITY,ALLTIME,STARTBLOCK,BLOCKTIME):n,/*Process0.Priority=9;Process0.Alltime=3;Process0.Startblock=2;Process0.Blocktime=3;Process1.Priority=38;Process1.Alltime=3;Process2.Priority=30;Process2.Alltime=6;Process3.Priority=29;Process3.Alltime=3;Process4.Pr
10、iority=0;Process4.Alltime=4;N);for(i=0;iN;+i)READYi=-1;BLOCKi=-1;RUNOUTi0=-1;RUNOUTi1=-1;Processi.ID=i;Processi.Cputime=0;Processi.State=Ready;printf(Number%d:,i);scanf(%d,%d,%d,%d,&Processi.Priority,&Processi.Alltime,&Processi.Startblock,&Processi.Blocktime);*/Processi.Startblock=-1;Processi.Blockt
11、ime=0;.专业.printf(n=n);printf(IDt);for(i=0;iN;+i)printf(nPRIORITY);for(i=0;iN;+i)printf(nCPUTIMEt);for(i=0;iN;+i)printf(nALLTIMEt);for(i=0;iN;+i)printf(nSTARTBLOCK);for(i=0;iN;+i)printf(nBLOCKTIME);for(i=0;iN;+i)printf(nSTATEt);for(i=0;iN;+i)printf(n);printf(tRUNOUT LIST:);for(i=0;iN;+i)switch(Proces
12、si.State)case 0:printf(tReady);break;case 1:printf(tRun);if(Processi.Alltime=0)else Processi.State=Ready;break;Processi.State=RunOut;printf(t%d,Processi.Blocktime);printf(t%d,Processi.Startblock);printf(t%d,Processi.Alltime);printf(t%d,Processi.Cputime);printf(t%d,Processi.Priority);printf(t%d,Proce
13、ssi.ID);case 2:printf(tBlock);break;case 3:printf(tRunOut);break;.专业.intint getRunning()getRunning()voidvoid sort()sort()int i,j,k;for(i=0;iN;+i)for(i=0;iN;+i)if(Processi.State=Ready|Processi.State=Run)/Processi.State=Ready;if(Processi.Alltime=0)continue;if(READYj0)else if(Processi.Priorityj;-k)READ
14、Yj=i;break;for(j=0;jN;+j)READYi=-1;BLOCKi=-1;int i;for(i=0;iN;+i)for(i=0;i=0)printf(-%d(%d),ProcessRUNOUTi0.ID,RUNOUTi1);printf(n);break;else.专业.intint run(run(intint time)time)int i,runNum;runNum=READY0;if(runNum0&BLOCK0=0)ProcessrunNum.Priority-=3;ProcessrunNum.Alltime-=1;ProcessrunNum.Cputime+=1;
15、ProcessrunNum.State=Run;for(i=0;iN;+i)if(i!=runNum)if(Processi.State=Ready)printf(Every process is OVER!n);return 1;else if(Processi.State=Block)for(j=0;jN;+j)if(BLOCKj=ProcessBLOCKj.Blocktime)continue;elsefor(k=N-1;kj;-k)BLOCKj=i;break;BLOCKk=BLOCKk-1;BLOCKj=i;break;READYj=i;break;READYk=READYk-1;.
16、专业.sort();/for(i=0;i=0)ProcessrunNum.Startblock-=1;if(ProcessrunNum.Startblock=0)ProcessrunNum.State=Block;/ProcessrunNum.Startblock-=1;/ProcessrunNum.State=RunOut;for(i=0;iN;+i)if(RUNOUTi0=0).专业.print();return 0;.专业.专业.专业.专业.专业.3 3、思考题、思考题(1 1)在实际的调度中,除了按调度算法选择下一个执行的进程外,还应处理哪)在实际的调度中,除了按调度算法选择下一个执行的进程外,还应处理哪些工作?些工作?答:1.记录系统中所有进程的执行情况作为进程调度的准备,进程管理模块必须将系统中各个进程的执行特征记录在各个进程的PCB 表中。2.进行进程上下文交换一个进程的上下文包括进程的状态,有关变量和数据结构的值。机器寄存器的值和PCB 以及有关程序,数据等。.专业.