《动态高优先权优先.docx》由会员分享,可在线阅读,更多相关《动态高优先权优先.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上操作系统课程实验报告实验名称:动态高优先权优先调度班 级: * 学 号: * 姓 名:* 指导老师: * 成 绩: 一、 实验目的:1.测试数据可以随即输入或从文件中读入。2.必须要考虑到作业的到达时间3.最终能够计算每一个作业的周转时间。二、实验内容:模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:设置作业体:作业名,作业的到达时间,服务时间,初始优先权,作业状态(W等待,R运行,F完成),作业间的链接指针作业初始化:由用户输入作业名、服务时间、初始优先权进行初始化,同时,
2、初始化作业的状态为W。显示函数:在作业调度前、调度中和调度后进行显示。排序函数:对就绪状态的作业按照优先权排序。优先权相同时进入等待队列时间早的作业在前。注意考虑到达时间调度函数:每次从等待队列队首调度优先权最高的作业执行,状态变化。并在执行一个时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。删除函数:撤销状态为F的作业。三、实验代码#include#include#includetypedefstruct PCB2 char name10;/进程名int runtime;/要求运行时间intfrist;/定义优先数 char zhuangtai; /定义状态,R为
3、就绪,F为完成;struct PCB2 PCBcontrol4;/定义进程控制块数组void youxian()/构造优先函数inti,n;printf(请输入进程的个数:n);scanf(%d,&n);printf(请输入进程的名字、优先权、运行时间n);printf(n);for(i=0;in;i+)printf(请输入第%d个进程的信息:n,i+1);scanf(%s%d%d,&PCBcontroli.name,&PCBcontroli.frist,&PCBcontroli.runtime);PCBcontroli.zhuangtai=R;/进程初始状态均为就绪getchar();/等待
4、回车进入下一次运行intmax_frist_process()/确定最大优先级进程子程序 int max=-10;/max为最大优先数,初始化为-10inti,key;for(i=0;i5;i+) if(PCBcontroli.zhuangtai=r)/r表示正在运行 return -1;/返回-1else if(maxPCBcontroli.frist&PCBcontroli.zhuangtai=R)/从就绪进程中选取优先数最大的进程 max=PCBcontroli.frist;/max存放每次循环中的最大优先数 key=i;/将进程号赋给key if(PCBcontrolkey.zhuan
5、gtai=F)/具有最大优先数的进程若已运行完毕 return -1;/则返回-1else return key;/将key作为返回值返回 void show()/显示函数 int i;printf(n进程名优先级运行时间当前状态n);printf(*n); for(i=0;i5;i+)/依次显示每个进程的名、优先数、要求运行时间和状态 printf( %st %dt %dt %stn,&PCBcontroli.name,PCBcontroli.frist,PCBcontroli.runtime,&PCBcontroli.zhuangtai); printf(n请按回车键进行查看); void
6、 run()/进程运行子程序 inti,j;int t=0;/t为运行次数for(j=0;j5;j+) t+=PCBcontrolj.runtime;/运行次数即为各个进程运行时间之和printf(n进程没运行前,当前的状态是:n); show(); /调用show()子程序显示运行前PCB的情况getchar();/等待回车进入下一次运行for(j=0;jt;j+) while(max_frist_process()!=-1)/具有最大优先数的进程没有运行完,让其运行 PCBcontrolmax_frist_process().zhuangtai=r;/将其状态置为r,表示其正在运行 for
7、(i=0;i5;i+) if(PCBcontroli.zhuangtai=r) PCBcontroli.frist-=1;/将当前运行进程的优先数减1PCBcontroli.runtime-;/要求运行时间减1 if(PCBcontroli.runtime=0)PCBcontroli.zhuangtai=F;/运行完则将该进程状态置为结束elsePCBcontroli.zhuangtai=R;/未运行完将其状态置为就绪 show();/显示每次运行后各PCB的情况getchar();/等待回车进入下一次运行 void main() int N;int number; char Tishikua
8、ng;/提示框doprintf( *n);printf(*嵌入式软件14-01班*51*杨霖*n);printf( * 输入 1高优先权优先服务法 *n);printf( * 输入 0退出该程序 *n);printf( *n);printf(n注:请根据自己的需求选择相应的操作数:n);scanf(%d,&number);/*提示输入字母,用switch语句存入到case中,最后增加提示框是否继续*/switch(number) case 0:break;case 1:printf(n您选择的是“优先服务项目”,本程序可提供5个进程的调度。nn);youxian();/初始化各个进程PCB r
9、un();/进程调度模拟break;default:printf(n你的输入有误,请确定是从0到5之间进行输入,O(_)O谢谢n);break; printf(n是否继续操作(y/n) ?);fflush(stdin);Tishikuang=getchar();while(Tishikuang=y|Tishikuang=Y);四、实验结果五、实验总结1.动态高优先权优先的执行原则是优先权高的进程先执行;2.在实验中遇到了优先权相同的问题,解决方法是执行过程中在优先权相同的前提下按照先来先服务的原则执行;3动态高优先权优先没有抢占式和非抢占式的区别,不能与静态高优先权优先混为一谈。专心-专注-专业