设计一个按优先数调度算法实现处理器调度的程序-改

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

题目:设计一个按优先数调度算法实现处理器调度的程序提示:(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的格式为:进程名、指针、要求运行时间、优先数、状态。进程名——P1~P5。指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。要求运行时间——假设进程需要运行的单位时间数。优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态——假设两种状态,就绪,用R表示,和结束,用E表示。初始状态都为就绪状态。(2)每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3)处理器总是选队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。(4)进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。(5)若就绪队列为空,结束,否则,重复(3)。2.程序中使用的数据结构及符号说明:#definenum5//假定系统中进程个数为5structPCB{charID;//进程名intruntime;//要求运行时间intpri;//优先数charstate;//状态,R-就绪,F-结束};structPCBpcblist[num];//定义进程控制块数组3.流程图:(1)主程序流程图:(2)子程序init()流程图:调用初始化子程序调用运行子程序结束开始(3)子程序max_pri_process()流程图:开始定义ii=0inum输出操作提示输入ID,pri,runtimestate=’R’getchar()结束i=i+1(4)子程序show()流程图:开始定义i,key,max=100i=0inumpcblist[i].state==’r’maxpcblist[i].pri&&pcblist[i].state=='R'max=pcblist[i].prikey=ipcblist[key].state=='F'return-1returnkey结束return-1i=i+1(5)子程序run()流程图:开始定义i输出提示i=0inum输出pcblist[i]的ID,pri,runtime,state提示按键继续i=i+1结束开始定义i,j,tj=0jnumt+=pcblist[j].runtimej=j+1输出提示show()getchar()jtmax_pri_process()!=-1j=0pcblist[max_pri_process()].state='r'i=0inumpcblist[i].state=='r'pcblist[i].pri-=1pcblist[i].runtime--pcblist[i].runtime==0pcblist[i].state='F'pcblist[i].state='R'show()getchar()i=i+1j=j+1结束4.源程序清单//按优先数调度算法实现处理器调度的程序#includestdio.h#includestring.h#definenum5//假定系统中进程个数为5structPCB{charID;//进程名intruntime;//要求运行时间intpri;//优先数charstate;//状态,R-就绪,F-结束};structPCBpcblist[num];//定义进程控制块数组voidinit()//PCB初始化子程序{inti;for(i=0;inum;i++){printf(PCB[%d]:IDpriruntime\n,i+1);//为每个进程任意指定pri和runtimescanf(%s%d%d,&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime);pcblist[i].state='R';//进程初始状态均为就绪getchar();//接收回车符}}intmax_pri_process()//确定最大优先级进程子程序{intmax=-100;//max为最大优先数,初始化为-100inti;intkey;for(i=0;inum;i++){if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行return-1;//返回-1elseif(maxpcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程{max=pcblist[i].pri;//max存放每次循环中的最大优先数key=i;//将进程号赋给key}}if(pcblist[key].state=='F')//具有最大优先数的进程若已运行完毕return-1;//则返回-1else//否则returnkey;//将key作为返回值返回}voidshow()//显示子程序{inti;printf(\nIDpriruntimestate\n);printf(-------------------------------------------------\n);for(i=0;inum;i++)//依次显示每个进程的名、优先数、要求运行时间和状态{printf(%s%6d%8d%s\n,&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state);}printf(pressanykeytocontinue...\n);}voidrun()//进程运行子程序{inti,j;intt=0;//t为运行次数for(j=0;jnum;j++){t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和printf(\nbeforerun,theconditonis:\n);show();//调用show()子程序显示运行前PCB的情况getchar();//等待输入回车符for(j=0;jt;j++){while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行{pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行}for(i=0;inum;i++){if(pcblist[i].state=='r'){pcblist[i].pri-=1;//将当前运行进程的优先数减1pcblist[i].runtime--;//要求运行时间减1{if(pcblist[i].runtime==0)pcblist[i].state='F';//运行完则将该进程状态置为结束elsepcblist[i].state='R';//未运行完将其状态置为就绪}show();//显示每次运行后各PCB的情况getchar();//等待回车进入下一次运行}}}}voidmain()//按动态优先数调度主程序{init();//初始化各个进程PCBrun();//进程调度模拟}#includestdio.h#includestring.h#definenum10//进程数为10structPCB{charID;//进程名intruntime;//要求运行时间intpri;//优先数charstate;//状态,R-就绪,F-结束};structPCBpcblist[num];//定义进程控制块数组voidinit()//PCB初始化子程序{inti;for(i=0;inum;i++){printf(PCB[%d]:IDpriruntime\n,i+1);//为每个进程任意指定pri和runtimescanf(%s%d%d,&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime);pcblist[i].state='R';//进程初始状态均为就绪getchar();//接收回车符}}intmax_pri_process()//确定最大优先级进程子程序{intmax=-100;//max为最大优先数,初始化为-100inti;intkey;for(i=0;inum;i++){if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行return-1;//返回-1elseif(maxpcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程{max=pcblist[i].pri;//max存放每次循环中的最大优先数key=i;//将进程号赋给key}}if(pcblist[key].state=='F')//具有最大优先数的进程若已运行完毕return-1;//则返回-1else//否则returnkey;//将key作为返回值返回}voidshow()//显示子程序{inti;printf(\n进程名优先数行时间状态\n);printf(-------------------------------------------------\n);for(i=0;inum;i++)//依次显示每个进程的名、优先数、要求运行时间和状态{printf(%s%6d%8d%s\n,&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state);}printf(按回车继续....\n);printf(注意:如果进程运行时间不足将会继续运行知道时间用完为止\n);}voidrun()//进程运行子程序{inti,j;intt=0;//t为运行次数for(j=0;jnum;j++){t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和printf(\n运行前状态为:\n);show();//调用show()子程序显示运行前PCB的情况getchar();//等待输入回车符for(j=0;jt;j++){while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行{pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行}for(i=0;inum;i++){if(pcblist[i].state=='r'){pcblist[i].pri-=1;//将当前运行进程的优先数减1pcblist[i].runtime--;//要求运行时间减1{if(pcblist[i].runtime==0)pcblist[i].state='F';//运行完则将该进程状态置为结束elsepcblist[i].state='R';//未运行完将其状态置为就绪}show();//显示每次运行后各PCB的情况getchar();//等待回车进入下一次运行}}}}voidmain()//按动态优先数调度主程序{init();//初始化各个进程PCBrun();//进程调度模拟}

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功