您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 实验四使用动态优先权的进程调度算法的模拟
实验四使用动态优先权的进程调度算法的模拟专业班级:软件1302学号:201316920224姓名:张长胜评分:1.实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。2.实验内容(1)用C语言来实现对N个进程采用动态优先权优先算法的进程调度。(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID;进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高;进程已占用的CPU时间CPUTIME;进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0;进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态;进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,进程将转换成就绪状态;进程状态STATE;队列指针NEXT,用来将PCB排成队列。(3)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1;进程每运行一个时间片,优先数减3。(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID01234PRIORITY93830290CPUTIME00000ALLTIME33634STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEREADYREADYREADYREADYREADY(5)为了清楚地观察进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:RUNNINGPROG:iREADY_QUEUE:-id1-id2BLOCK_QUEUE:-id3-id4===============================================ID01234PRIORITYP0P1P2P3P4CPUTIMEC0C1C2C3C4ALLTIMEA0A1A2A3A4STARTBLOCKT0T1T2T3T4BLOCKTIMEB0B1B2B3B4STATES0S1S2S3S43.程序设计/*definethestructureofprocess*/#includestdio.h#defineN10#definePprocstructprocess{intid;intpy;/*priority*/intct;/*cputime*/intat;/*alltime*/intsb;/*startblock*/intbt;/*blocktime*/intst;/*state:1ready;-1block;0finish*/};structprocessproc[N];main(){inti,j,n;intmax_pt,priority;inttimeslice=0;intready_q[N],block_q[N];charch;FILE*fp;char*fname=c:\\a.txt;fp=fopen(fname,w+);for(i=0;i=N;i++){ready_q[i]=0;block_q[i]=0;}n=5;/*定义进程数量为5*//*初始化进程数组*/P[1].id=0;P[1].py=9;P[1].ct=0;P[1].at=3;P[1].sb=2;P[1].bt=3;P[2].id=1;P[2].py=38;P[2].ct=0;P[2].at=3;P[2].sb=-1;P[2].bt=0;P[3].id=2;P[3].py=30;P[3].ct=0;P[3].at=6;P[3].sb=-1;P[3].bt=0;P[4].id=3;P[4].py=29;P[4].ct=0;P[4].at=3;P[4].sb=-1;P[4].bt=0;P[5].id=4;P[5].py=0;P[5].ct=0;P[5].at=4;P[5].sb=-1;P[5].bt=0;/*输出初始化的进程数组内容*/fprintf(fp,\n\nRUNNINGRPOC:%d\n,-1);fprintf(fp,READY_QUEUE:);for(i=1;i=n;i++)fprintf(fp,-id%d,i-1);fprintf(fp,\n);fprintf(fp,BLOCK_QUEUE:\n);fprintf(fp,========================================================);fprintf(fp,\n%-12s,ID);for(i=1;i=n;i++)fprintf(fp,%8d,i-1);fprintf(fp,\n%-12s,PRIORITY);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].py);fprintf(fp,\n%-12s,CPUTIME);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].ct);fprintf(fp,\n%-12s,ALLTIME);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].at);fprintf(fp,\n%-12s,STARTBLOCK);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].sb);fprintf(fp,\n%-12s,BLOCKTIME);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].bt);fprintf(fp,\n%-12s,STATE);for(i=1;i=n;i++){P[i].st=1;fprintf(fp,%8s,READY);}for(i=1;i=n;i++){P[i].st=1;ready_q[i]=i;}ready_q[0]=n;/*ready_q[0]表示就绪队列中进程个数,block_q[0]表示阻塞队列中进程个数*//*进行运算*/do{timeslice++;/*时间片加1*//*max_pt记录优先级最高进程的pt,ready_q数组记录就绪队列的顺序priority记录优先级最高进程的ID此程序段使ready_q排序*/for(i=1,max_pt=-1;i=ready_q[0];i++)if(P[ready_q[i]].pymax_pt){max_pt=P[ready_q[i]].py;j=i;priority=ready_q[i];}for(i=j;iready_q[0];i++)ready_q[i]=ready_q[i+1];ready_q[0]--;/*按原则操作各进程,实质是按原则改变数组各值*/P[priority].py-=3;if(P[priority].py0)P[priority].py=0;P[priority].ct++;P[priority].at--;/*除执行进程外,其他进程的操作*/for(i=1;i=ready_q[0];i++)P[ready_q[i]].py+=1;/*对阻塞队列和就绪队列赋值*//*?进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,进程将转换成就绪状态;*/for(i=1;i=block_q[0];i++){P[block_q[i]].bt-=1;/*阻塞队列中的进程的blocktime-1*/if(P[block_q[i]].bt==0)/*如果该进程的blocktime=0,说明该进程需要进入就绪队列*/{P[block_q[i]].st=1;/*将该进程的st状态置1,将其从阻塞队列移入就绪队列*/block_q[0]--;ready_q[0]++;ready_q[ready_q[0]]=i;}}if(P[priority].at==0)/*对当前执行进程,如果at=0说明执行完毕*/{P[priority].st=0;P[priority].py=-1;}elseif(P[priority].sb==P[priority].ct)/*进程的阻塞时间STARTBLOCK,*//*表示当进程再运行STARTBLOCK个时间片后,*//*进程将进入阻塞状态;*/{P[priority].st=-1;block_q[0]++;block_q[block_q[0]]=priority;}else/*以上两个条件都不符合,直接进入就绪队列*/{ready_q[0]++;ready_q[ready_q[0]]=priority;}/*运行一次后输出运行结果*/fprintf(fp,\n\nRUNNINGRPOC:%dTIMELICE:%d\n,priority-1,timeslice);fprintf(fp,READY_QUEUE:);for(i=1;i=ready_q[0];i++)fprintf(fp,-id%d,ready_q[i]-1);fprintf(fp,\n);fprintf(fp,BLOCK_QUEUE:);for(i=1;i=block_q[0];i++)fprintf(fp,-id%d,block_q[i]-1);fprintf(fp,\n);fprintf(fp,========================================================);fprintf(fp,\n%-12s,ID);for(i=1;i=n;i++)fprintf(fp,%8d,i-1);fprintf(fp,\n%-12s,PRIORITY);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].py);fprintf(fp,\n%-12s,CPUTIME);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].ct);fprintf(fp,\n%-12s,ALLTIME);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].at);fprintf(fp,\n%-12s,STARTBLOCK);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].sb);fprintf(fp,\n%-12s,BLOCKTIME);for(i=1;i=n;i++)fprintf(fp,%8d,P[i].bt);fprintf(fp,\n%-12s,STATE);for(i=1;i=n;i++){if(P[i].st==1)fprintf(fp,%8s,READY);elseif(P[i].st==0)fprintf(fp,%8s,FINISH);elsefprintf(fp,%8s,BLOCK);}fprintf(fp,\n);}while((ready_q[0]!=0)||(block_q[0]!=0));/*循环结束条件:就绪队列和阻塞队列全为空*/}4.实验结果图1图25.实验结果本次实验的实验目的是通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。在实验中我们用C语言来实现了对N个进程采用动态优先权优先算法的进程调度。通过这次实验我深刻的了解到了进程概念和进程调度过程。通过本次实验还可以了解到进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
本文标题:实验四使用动态优先权的进程调度算法的模拟
链接地址:https://www.777doc.com/doc-2459744 .html