您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 操作系统实验——动态优先级进程调度实验报告
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-1BLOCKTIME30000STATEREADYREADYREADYREADYREADY(3)进程在就绪队列呆一个时间片,优先数增加1。(4)进程每运行一个时间片,优先数减3。(5)按下面格式显示每个时间片内就绪队列的情况:READY_QUEUE:-id1-id24.任务分析进程控制块用结构体来表示,包含它的各项属性。建立两个队列:一个就绪队列,一个阻塞队列。创建一个进程控制块表示当前正在运行的进程。程序开始运行时,所有进程都在就绪队列中。当startblock减少到0时,进程进入阻塞队列。在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。5.程序流程图开始结束程序初始化就绪队列和阻塞队列是否为空取出就绪队列首进程Cputime++Alltime--Priority-=3Startblock0?Startblock--当前进程进入阻塞队列就绪队列Priority++阻塞队列Blocktime--阻塞队列首进程Blocktime==0?就绪队列按优先级排序将阻塞队列首进程加入就绪队列打印信息是否是否是6.程序清单#includeiostream#includestringusingnamespacestd;#defineLEN5//进程最大数量typedefenumSTATE//进程状态{READY,//就绪BLOCK,//阻塞END//完成}STATE;//定义进程控制块typedefstructPCB{intid;//进程标识符intpriority;//进程优先级intcputime;//已占用的CPU时间intalltime;//还需占用的CPU时间intstartblock;//阻塞时间intblocktime;//被阻塞时间STATEstate;//进程状态}PCB;//定义队列typedefstructqueue{intsize;//队列中进程的数量PCB*data[LEN];//进程的指针}Queue;PCBps[LEN];//进程数组PCB*cp;//当前正在运行的进程QueuerQueue,bQueue;//就绪队列和阻塞队列//就绪队列按优先级降序排序(使用了冒泡排序法)voidrQueueSort(){PCB*temp;for(inti=0;irQueue.size-1;i++){for(intj=0;jrQueue.size-1-i;j++){if(rQueue.data[j]-priorityrQueue.data[j+1]-priority){temp=rQueue.data[j];rQueue.data[j]=rQueue.data[j+1];rQueue.data[j+1]=temp;}}}}//初始化voidinit(){//给进程赋值for(inti=0;iLEN;i++){ps[i].id=i;ps[i].state=READY;ps[i].cputime=0;ps[i].alltime=3;ps[i].blocktime=0;ps[i].startblock=-1;}ps[0].priority=9;ps[1].priority=38;ps[2].priority=30;ps[3].priority=29;ps[4].priority=0;ps[2].alltime=6;ps[4].alltime=4;ps[0].startblock=2;ps[0].blocktime=3;cp=NULL;//当前进程赋空bQueue.size=0;//阻塞队列没有进程for(inti=0;iLEN;i++){bQueue.data[i]=NULL;rQueue.data[i]=&ps[i];}rQueue.size=5;//所有进程全部进入就绪队列rQueueSort();//对就绪队列排序}//打印voidprint(){cout\nRUNNINGPROG:;if(cp!=NULL){coutcp-id;}cout\nREADY_QUEUE:;for(inti=0;irQueue.size;i++){cout-rQueue.data[i]-id;}cout\nBLOCK_QUEUE:;for(inti=0;ibQueue.size;i++){cout-bQueue.data[i]-id;}cout\n-------------------------------------------------------endl;coutID\t\t;for(inti=0;iLEN;i++){coutps[i].id\t;}cout\nPRIORITY\t;for(inti=0;iLEN;i++){coutps[i].priority\t;}cout\nCPUTIME\t\t;for(inti=0;iLEN;i++){coutps[i].cputime\t;}cout\nALLTIME\t\t;for(inti=0;iLEN;i++){coutps[i].alltime\t;}cout\nSTARTBLOCK\t;for(inti=0;iLEN;i++){coutps[i].startblock\t;}cout\nBLOCKTIME\t;for(inti=0;iLEN;i++){coutps[i].blocktime\t;}cout\nSTATE\t\t;for(inti=0;iLEN;i++){if(ps[i].state==READY){coutREADY\t;}elseif(ps[i].state==BLOCK){coutBLOCK\t;}elseif(ps[i].state==END){coutEND\t;}}coutendl;}//出队,返回进程指针PCB*pop(Queue*q){PCB*temp;if(q-size0){temp=q-data[0];//取出队首进程for(inti=0;iq-size-1;i++){q-data[i]=q-data[i+1];//其他进程依次向前移动}q-size--;returntemp;//返回队首进程}returnNULL;}//入队voidpush(Queue*q,PCB*p){if(q-sizeLEN){q-data[q-size]=p;//将入队的进程放在队尾q-size++;}return;}//运行进程voidrun(){if(rQueue.size0||bQueue.size0){if(cp==NULL){//程序一开始运行时,从就绪队列取出首进程cp=pop(&rQueue);}//当前进程没有结束,但优先级比就绪队列首进程低if(cp-alltime0&&cp-priorityrQueue.data[0]-priority){push(&rQueue,cp);//将当前进程放入就绪队列cp=pop(&rQueue);//就绪队列队首进程成为当前进程}if(cp-alltime==0){//如果当前进程运行结束cp-state=END;//改变进程状态cp=pop(&rQueue);//从就绪队列取出新的当前进程}cp-priority-=3;//修改当前进程的优先级//startblock为0,标志着当前进程要进入阻塞状态if(cp-startblock==0&&cp-blocktime0){cp-state=BLOCK;//修改当前进程的状态push(&bQueue,cp);//将当前进程加入阻塞队列cp=pop(&rQueue);//从就绪队列取出新的当前进程}elseif(cp-startblock0){//当前进程的startblock为正数时cp-startblock--;//运行一次减一个时间片}cp-cputime++;//当前进程占用CPU时间片+1if(cp-alltime0){//当前进程还需运行的时间片-1cp-alltime--;if(cp-alltime==0){//减到0时,修改进程状态cp-state=END;}}for(inti=0;irQueue.size;i++){//每运行一个时间片rQueue.data[i]-priority++;//就绪队列中的进程优先级+1}for(inti=0;ibQueue.size;i++){//每运行一个时间片if(bQueue.data[i]-blocktime0){//阻塞队列中的进程blocktime-1bQueue.data[i]-blocktime--;}}//当阻塞队列队首进程blocktime为0时if(bQueue.size0&&bQueue.data[0]-blocktime==0){bQueue.data[0]-state=READY;//修改进程状态push(&rQueue,pop(&bQueue));//将阻塞队列首进程取出,放入就绪队列}//每运行一个时间片,就绪队列排一次序rQueueSort();}}//主函数intmain(){init();//初始化print();//打印进程信息while(1){_sleep(1000);if(rQueue.size==0&&bQueue.size==0){//当两个队列都为空时,结束程序cp-state=END;break;}run();//运行进程print();//打印进程信息}return0;}7.实验过程记录程序开始执行,当前进程是优先级最高的1号进程,1号进程的优先级减3、cputime++、alltime--。在就绪队列中的进程优先级全部加1。执行几次之后,1号进程执行完毕而且优先级也不是最高的了,所以优先级为33的2号进程成为当前进程,开始执行。2号进程执行一次后,优先级由33降低到30,于是3号进程成为当前进程,2号进程进入就绪队列等待。同理,执行一次后,3号进程的优先级由33降低到30,2号进程再次成为当前进程,3号进程进入就绪队列等待。这个过程会重复几次,就不重复了。3号进程执行完毕后退出,2号进程成为当前进程。2号进程执行完毕后,0号进程成为当前进程。0号进程执行2次后,startblock为0了,进入阻塞队列,停止运行,4号进程开始执行。4号进程运行几次后,0号进程的blocktime为0了,0号进程从阻塞队列转入就绪队列此时,4号进程的优先级低于0号进程,4号进程停止运行,0号进程再次运行。0号进程执行完毕后,只剩下4号进程了,4号进程执行一次也完成了。程序总体执行完毕
本文标题:操作系统实验——动态优先级进程调度实验报告
链接地址:https://www.777doc.com/doc-7248462 .html