您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 动态优先权进程调度算法模拟实验报告华北电力大学
1华北电力大学实验报告一﹑实验目的:通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。二﹑实验内容:(1)用VC++语言实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:进程标识数ID。进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。进程已占用CPU时间CPUTIME。进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。进程状态STATE。队列指针NEXT,用来将PCB排成队列。(3)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1。进程每运行一个时间片,优先数减3。(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。(5)分析程序运行的结果,谈一下自己的认识。三﹑设计思路和方法:本程序通过结构体来实现计算机的控制模组,由此构造一个PCB结构体,即为进程控制块结构体,以此来记录当前进程的状态情况,包括PCB、调度信息、控制信息和处理机状态。运用C语言模拟调度算法,对构建的PCB进程进行调度和运行,以此来实现进程调度过程仿真,完成本实验的实验目标与要求。四﹑主要数据结构和算法:数据结构包括:PCB结构体包含进程信息的顺序表结构:typedefstruct{华北电力大学实验报告intID;//定义进程标识数intPRIORITY;//定义进程优先数intCPUTIME;//定义进程已占用CPU时间intALLTIME;//定义进程还需占用的CPU时间intSTARTBLOCK;//定义进程的阻塞时间intBLOCKTIME;//定义进程被阻塞的时间intSTATE;//0-运行1-阻塞2-就绪3-结束4-未到达intREACH;//定义到达时间intTIME;//定义进程推进时刻}PROCESS;算法:优先权=(等待时间+要求服务时间)/要求服务时间Rp=(等待时间+要求服务时间)/要求服务时间=相应时间/要求服务时间计算机CPU将进程按照优先级的高低来排列,并规定一个时间片,当时间片用完后,CPU中断当前任务,下一优先级最高的进程。调度运行完成后的进程,其优先权会降低,同时,所有进程的优先级随着时间的增加或是进程的推进而增加。随着时间的推进,所有程序都会有运行的机会,以此来完成用户的要求。五﹑程序代码和输出1、程序代码如下#includeiostream.h#includewindows.h//#defineN3typedefstruct{intID;//定义进程标识数intPRIORITY;//定义进程优先数intCPUTIME;//定义进程已占用CPU时间intALLTIME;//定义进程还需占用的CPU时间华北电力大学实验报告intSTARTBLOCK;//定义进程的阻塞时间intBLOCKTIME;//定义进程被阻塞的时间intSTATE;//0-运行1-阻塞2-就绪3-结束4-未到达intREACH;//定义到达时间intTIME;//定义进程推进时刻}PROCESS;voidtextcolor(intcolor){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);}voidmain(){inti,time,max,l,l1,time1,flag=0,total=0,N,server[10],sum=0;PROCESSpro[10];textcolor(13);cout注意:本程序中状态代表如下endl0-运行1-阻塞2-就绪3-结束4-未到达endlendl;textcolor(15);cout请输入进程数:;cinN;cout请设置时间片长度:;cintime;cout请输入各进程初始状态:endl;coutIDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIMEendl;for(i=0;iN;i++){pro[i].CPUTIME=0;//令第i个进程占用CPU的时间为0pro[i].TIME=0;//令进程推进时刻等于0cinpro[i].IDpro[i].PRIORITYpro[i].REACH;//输入第i个进程的进程标识数、优先数、到达时间cinpro[i].ALLTIMEpro[i].STARTBLOCKpro[i].BLOCKTIME;//输入第i个华北电力大学实验报告进程还需占用的CPU时间、阻塞时间、被阻塞的时间server[i]=pro[i].ALLTIME;//令server[i]等于第i个进程还需占用的CPU时间if(pro[i].REACH==0)pro[i].STATE=0;//如果第i个进程的到达时间等于零,那么令其进程状态等于0elsepro[i].STATE=4;//否则,令其进程状态等于4}do{coutendl当前时刻为:total;textcolor(12);coutendl========================各进程状态为======================endl;textcolor(15);coutIDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATEendl;for(i=0;iN;i++){coutpro[i].IDpro[i].PRIORITYpro[i].CPUTIME;coutpro[i].ALLTIMEpro[i].STARTBLOCKpro[i].BLOCKTIMEpro[i].STATE;coutendl;}total+=time;//当前时刻加上时间片长度for(i=0;iN;i++){if(pro[i].STATE==4&&pro[i].REACHtotal)//如果第i个进程未到达且到达时间小于当前时刻,则运行下列程序{pro[i].STATE=1;//则阻塞第i个进程}华北电力大学实验报告}for(i=0;iN;i++){time1=pro[i].ALLTIME;//令time1等于第i个进程的还需占用CPU的时间if(pro[i].STATE==0)//如果第i个进程正在运行,则运行下列程序if(pro[i].ALLTIME=time)//如果第i个进程还需占用CPU的时间小于等于时间片长度,则{pro[i].CPUTIME+=time1;//第i个进程已经占用的CPU时间加上time1,即加上第i个进程还需占用CPU的时间pro[i].ALLTIME=0;//令第i个进程还需占用的CPU时间为0pro[i].STATE=3;//结束第i个进程pro[i].TIME=total-time+time1;//令第i个进程的推进时刻变为当前时刻减去时间片长度加上其还需占用CPU的时间}else//否则{pro[i].CPUTIME+=time;//第i个进程已经占用的CPU时间加上时间片长度pro[i].ALLTIME-=time;//第i个进程还需占用的CPU时间减去时间片长度pro[i].STARTBLOCK--;//第i个进程的阻塞时间减一if(pro[i].STARTBLOCK==0)//如果第i个进程的阻塞时间等于0{pro[i].STATE=1;//则阻塞第i个进程pro[i].BLOCKTIME=time1;//令第i个进程被阻塞的时间等于其还需占用CPU的时间pro[i].STARTBLOCK=time1;//令第i个进程的阻塞时间等于其还需占用CPU的时间}pro[i].PRIORITY-=3;//第i个进程的优先数减三pro[i].TIME=total;//令第i个进程的进程推进时刻等于当前时刻}华北电力大学实验报告}if(pro[i].STATE==1)//如果第i个进程处于阻塞状态,则{pro[i].BLOCKTIME--;//第i个进程被阻塞的时间逐一递减if(pro[i].BLOCKTIME==0)pro[i].STATE=2;//如果第i个进程被阻塞的时间等于0,则pro[i].TIME=total;//令第i个进程的进程推进时刻等于当前时刻}if(pro[i].STATE==2)//如果第i个进程处于就绪状态,则{pro[i].PRIORITY++;//令第i个进程的优先数加一pro[i].TIME=total;//令第i个进程的进程推进时刻等于当前时刻}}max=-100;//令max=-100l1=-1;//l1=-1l=-1;//l=-1for(i=0;iN;i++){if(pro[i].PRIORITYmax&&(pro[i].STATE==0||pro[i].STATE==2))//如果第i个进程的优先级大于max且第i个进程的进程状态等于0或第i个进程的进程状态等于2,则{l=i;//令l=imax=pro[i].PRIORITY;//令max等于第i个进程的优先数}if(pro[i].STATE==0)l1=i;//如果第i个进程正在运行,则令l1=i}if(l!=-1&&l!=l1)pro[l].STATE=0;//如果l不等于-1且l不等于l1,则进程l的进程状态等于0if(l1!=-1&&(pro[l].PRIORITYpro[l1].PRIORITY))pro[l1].STATE=2;//如果l1不等于-1,且进程l的优先数大于进程l1的优先数,则令进程l1处于就绪状态flag=0;华北电力大学实验报告for(i=0;iN;i++){if(pro[i].STATE!=3)//如果第i个进程未结束{flag=1;//则令flag等于1break;//退出循环}}if(flag==0)break;//如果flag等于0,则退出循环}while(1);coutendl当前时刻:total;textcolor(12);coutendl========================各进程状态为======================endl;textcolor(15);coutIDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATEendl;for(i=0;iN;i++){coutpro[i].IDpro[i].PRIORITYpro[i].CPUTIME;coutpro[i].ALLTIMEpro[i].STARTBLOCKpro[i].BLOCKTIMEpro[i].STATE;coutendl;}coutendl各进程运行结束!endl;cout进程号到达时间结束时间周转时间带权周转时间endl;textcolor(10);for(i=0;iN;i++){coutpro[i].IDpro[i].REACHpro[i].TIMEpro[i].TIME-pro[i].REACH(float)(pro[i].TIME-pro[i].REACH)/server[i]endl;//带全周转时间等于第i个进程的推华北电力大学实验报告进时刻与第i个进程的到达时刻的差sum+=pro[i].TIME-pro[i].REACH;//sum等于sum加上第i个进程的推进时刻与第i个进程的到达时刻的差}c
本文标题:动态优先权进程调度算法模拟实验报告华北电力大学
链接地址:https://www.777doc.com/doc-2614534 .html