操作系统实验——动态优先级进程调度实验报告(总19页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小-1. 实验名称:动态优先权调度过程中就绪队列的模拟2. 实验要求:采用动态优先权的进程调度算法,用 C 语言编程模拟调度过程中每个时间片内 的就绪队列3. 实验内容:(1)每个进程控制块 PCB 用结构描述,包括以下字段:*进程标识符 id*进程优先数priority,并规定优先数越大的进程,其优先权越高进程已占用的 CPU 时间 cputime*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入 阻塞状态*进程被阻塞的时间blocktime已阻塞的进程再等待blocktime个时间片后,将 转换成就绪状态*进程状态 state*队列指针next,将PCB排成队列2)调度前,系统中有五个进程,它们的初始状态如下:ID01234PRIORITY93830290CPUTIME00000ALLTIME33634STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEREADYREADYREADYREADYREADY3)进程在就绪队列呆一个时间片,优先数增加1。
4)进程每运行一个时间片,优先数减35)按下面格式显示每个时间片内就绪队列的情况:READY_QUEUE :->id1->id24. 任务分析进程控制块用结构体来表示,包含它的各项属性建立两个队列:一个就 绪队列,一个阻塞队列创建一个进程控制块表示当前正在运行的进程程序 开始运行时,所有进程都在就绪队列中当 startblock 减少到 0 时,进程进入 阻塞队列在阻塞队列中的进程,当 blocktime 减少到 0 时,转入就绪队列 在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前 进程获取时间片当前进程如果运行完毕,就绪队列中优先级最高的进程就可 以成为新当前进程5. 程序流程6. 程序清单#include size > 0) {temp 二 q->data[0];for (int i 二 0; i < q->size - 1; i++) { q->data[i]二 q->data[i + 1];}q_>size__;return temp;}return NULL;//入队void push(Queue *q, PCB *p) {if (q->size < LEN) {//将入队的进程放在队尾q->data[q->size]二 p;}return;}//运行进程 void r un() {if > 0 II> 0) {if (cp二二NULL) { 〃程序一开始运行时,从就绪队列取出首进程cp 二 pop(&r Queue);}//当前进程没有结束,但优先级比就绪队列首进程低if (cp->alltime > 0 && cp->priority < [0]->priority) {push(&r Queue, cp); cp 二 pop(&r Queue);}//将当前进程放入就绪队列//就绪队列队首进程成为当前进程if (cp->alltime 二二 0) { cp->state 二 END;cp 二 pop(&r Queue); }//如果当前进程运行结束//改变进程状态//从就绪队列取出新的当前进程cp->p rior ity -二 3;//修改当前进程的优先级cp->state 二 BLOCK; push(&bQueue, cp); cp 二 pop(&r Queue);}else if (cp->startblock > 0) { cp->sta rtblock--;}cp->cputime+ + ;// startblock为0,标志着当前进程要进入阻塞状态if (cp->startblock 二二 0 && cp->blocktime > 0) {//修改当前进程的状态〃将当前进程加入阻塞队列//从就绪队列取出新的当前进程//当前进程的startblock为正数时〃运行一次减一个时间片//当前进程占用CPU时间片+1if(cp->alltime > 0){ cp->alltime--;if (cp->alltime 二二 0) { cp->state 二 END;}}//当前进程还需运行的时间片-1//减到0时,修改进程状态for (int i 二 0; i < ; i++) {[i]->p rior ity++;〃每运行一个时间片//就绪队列中的进程优先级+1}for (int i 二 0; i < ; i++) {if [i]->blocktime > 0) {[i]->blocktime--;//每运行一个时间片//阻塞队列中的进程blocktime-1}//当阻塞队列队首进程blocktime为0时if > 0 && [0]->blocktime 二二 0) {[0]->state 二 READY; // 修改进程状态push(&r Queue, pop(&bQueue)); 〃将阻塞队列首进程取出,放入就绪队列〃每运行一个时间片,就绪队列排一次序 r QueueSo rt();}} //主函数int main() {init(); //初始化print(); //打印进程信息while (1) {_sleep(1000);if二二0 &&二二0) { 〃当两个队列都为空时,结束程序cp->state 二 END;br eak;}run(); //运行进程print(); //打印进程信息}retu rn 0;}7. 实验过程记录O| C:\WIN [:K3WS\system32\cmd.exeRUNNING PROG:READY.QUEUE>l->2->3->0->4BLOCK.QUEUE:IDPRIORITYCH.TIME ALLTIME STARTBLOCK BLOCKTIME STATERUNNING PROG: 1READY.QUEUE:->2->3->0->4BLOCK.QUEUE:0g0323READY13803-10READY230329IDPRIORITYCP1.TIME ALLTIME STARTBLOCK BLOCKTIME STATE0100323READY3512-10READY3130程序开始执行,当前进程是优先级最高的 1 号进程,1 号进程的优先级减 3、cputime++、alltime 。
在就绪队列中的进程优先级全部加 1注 C\WI NDOWS^y5tem32\cmdjExeRUNNING PROG: 1 READY_QlELE:->2->3->0->4 BLOCK.QIELE:[D PRIORITY pPUTIME ALLTIMESTAfiTBLOl'K BLOCKTIME STATEDYEARL 2930 -10END23306-10READY33203-10READY-1 0 READYRUNNING PROG: 2 READY_QlEl:E:->3- >0->4 BLOCK.QIEIE:[D PRIORITY fcPUTIME fcLTIME STARTBLOCKBLOCKTIMECTATE0130 3 2 32930 -10END23015-10READY执行几次之后1 号进程执行完毕而且优先级也不是最高的了所以优先级为33 的 2 号进程成为当前进程,开始执行國I C\WINDOWS\EyEtem32\cmd.eseRUNNING PROG: 2READY_QlElE:->3->0->4 BLOCK_QLELE:ilDPRIORITY fcPUTIMEALLTIME STARTBLOCK BLOCKTIM:E CTATE2930-10END23015-10READY33303-10READYRUNNING PROG: 3READY_QtElE:->2->0->4 BLOCK_QLELE:IDPRIORITY fPUT[ME ALLTIMESTARTBLOCK BLOC KT I htE CTATE0140 3 CM 312931NDQ E-10READY33012-10READY2 号进程执行一次后,优先级由 33 降低到 30,于是 3 号进程成为当前进程,2 号进程进入就绪队列等待。
ILLTIME31302STATEREADY21290 -10 END-1 0 READY-1 0 READY-1 0 READY0140【G PROG:QUEUE :->3->(b>4QUEUE::PUT[ME ILLTIME STARTBLOCK國I C\WI NDOW8\5ystem32\cmd.eKetUNNING PROG: 3 4EADY_QlELE:->2->0->4□ X0150 3 CM 32930-10END22824-10READY33112-10READY同理,执行一次后,3 号进程的优先级由 33 降低到30,2 号进程再次成为当前进程,3 号进程进入就绪队列等待这个过程会重复几次,就不重复了m CAWI NDOWS\syEtem32\cmd.esePROG: 3ELE:->2->0->4ILLUMEOL8O 3 CM 32930-10END22733-10READY32630 -10ENDILLUMEPROG:2:->0->40190 3 CM 3L2924J)-10READY32630 -10END41004-10READY3 号进程执行完毕后退出,2 号进程成为当前进程m CAWI NDOWS\syEtem32\cmd.esePROG: 2ELE:->0->4ILLUME0210 3 CM 32930-10END21860 -10END32630 -10END41204-10READYILLUMEPROG:0:->4018L2L3READYL29J)18-1 0 END32630 -10END41304-10READY2 号进程执行完毕后,0 号进程成为当前进程m CAWINDOWS\5y5tem32\cmd.exe - □ XRUNNING PROG: 0READY QUEUE:->4 BLOCK QLELE:ID01234PRIORITY1529182614fPUT[ME23630^LLTIMEL0004STARTBLOCK0-1-1-1-1BLQCKTIME30000CTATEREADYENDENDENDREADYRUNNING PROG: 4READY QUEUE:BLOCK QUEUE:->0ID0L234PRIORITY1229182614fcPUTIME23631^LLTIME100033TARTBLOCK0-1-1-1-1BLOCKTIME20000CTATEBLOCKENDENDENDREADY0号进程执行2次后,startblock为0 了,进入阻塞队列,停止运行,4号进程开始执行ILLUME11-I0READYSTATEPROG:4 QUEUE:->O QUEUE::PUTIME ILLTIME STARTBLOCK131 SI£C:\WI NDOWS\5y5tem32\cmd.e3cePROG: 4:->0□ X29IXJJ1293 OT O0122L0LBLOCK21860 -10END32630 -10END0122 L00READY21860 -10END32630 -10END4831-10READY4 号进程运行几次后,0 号进程的 blocktime 为 0 了,0 号进程从阻塞队列转入就绪队列QI BT?C:\WI NDOWS\5^tem32\cmd.exeRUNNING PROG: 4S?EAD¥_QUEUE: ->0 BLOCK_QUEUE:IDPRIORITY fPUT[ME ALLTIMESTARTBLOCKBLOCKTIMEISTATERUNNING PROG: 0 READY QlELE:->4 BLOCK.QUELE:0 L22 L00READY293NDQ ED oEND oEN4831-10READY[D PRIORITY fcPUTIME ALLTIME STAFTBLOCK ELOCKTIME RATEND o E9CS 3ND o ED oEND oEN-10READY号进程停止运行,0 号进程再次运此时,4 号进程的优先级低于 0 号进程,4 行。
SI W£C=\WINDOWS\5>r5tem32\cmd.EKe 一 □ XRUNNING PROG: 0 READY QLELE:->4 BLOCK QLELE:[D0L3PRIORITY9291826fcPUTIME333kLLTIME000STARTBLOCK0-1-1-1-1BbOCKTIME00000feTATEENDENDENDENDREADYRUNNING PROG: 4 READY QVELE: BL0CK_QUEUE:[D0LPRIORITY929IS26fcPUTIME33kLLTIME00STARTBLQCK0-1-1-1-1BLOCKTIME00000PTATEENDENDENDENDEND请按任意键继续”E E0 号进程执行完毕后,只剩下 4 号进程了,4 号进程执行一次也完成了程序总体执行完毕8. 实验结果分析实验中,没有运行完毕的进程的优先级都会实时变化每次时间片结束, 就会选择就绪队列中优先级最高的进程和当前进程进行比较如果当前进程没 有运行完毕,就被优先级更高的进程替换了,则进入就绪队列等待。