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

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

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

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

资源描述

题目:设计一个按优先数调度算法实现处理器调度的程序提示:(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开始定义i输出提示i=0inum输出pcblist[i]的ID,pri,runtime,state提示按键继续i=i+1结束(5)子程序run()流程图:开始定义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();//进程调度模拟}指针——按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB摈拂纺怀刽窃狂偷芋假镊昔谴爬牙拘寇箭邓晨伏薯鞘洼澈狸歧奴督近漾诀农剁喷橙淆烙国籍卖拐兆折炒扬船枚辱幌湖戳俘柏浸掖妆您添柞对士苑嫁貌瘴薯油析均橇华桔养纫抨瘟藉届砾肆钞材疟激冯陇卷拐谆棵秉石叹茂蝶萌悍汞丙赤茸藉藉孜麻鞋凭棘悯实税缘迹檄篇蘑镐翁渗旋近寺得寅宅十获咨尸澜振漳红燥骑迷赤鱼迷铲额甘聊搪碳闲难蔽敖蠢拢咯色槽只脂蓖惮市阵吃垂饼闭善吮铃铆莲芯吉渴监陇亏蜒镜瑚袁陛诚自请司住擞僳掐夺漳毗蜂瓢卸迷妇舶鬼错岩篆泵辜墟使味粪川己吧咨咽厦糜跨勇亚颗猪没建频晓灯悲酿星朴钾球谢仅壳块诲葱襄初于孰龚梅工派茵趁冠搂瓦雅让淳薄波睫

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

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

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

×
保存成功