您好,欢迎访问三七文档
《操作系统》课程实验报告实验名称:动态高优先权优先算法姓名:王智昆学号:541407110243地点:4#302指导老师:张旭专业班级:运维1402一、实验目的:1、熟悉并掌握动态高优先权优先算法。2、用C语言编程实现动态高优先权优先算法二、实验内容:用高级语言模拟实现动态分区存储管理,要求:模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:设置作业体:作业名,作业的到达时间,服务时间,初始优先权,作业状态(W——等待,R——运行,F——完成),作业间的链接指针作业初始化:由用户输入作业名、服务时间、初始优先权进行初始化,同时,初始化作业的状态为W。显示函数:在作业调度前、调度中和调度后进行显示。排序函数:对就绪状态的作业按照优先权排序。优先权相同时进入等待队列时间早的作业在前。注意考虑到达时间调度函数:每次从等待队列队首调度优先权最高的作业执行,状态变化。并在执行一个时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。删除函数:撤销状态为F的作业。#includestdio.h#includestdlib.hstructPCB{charp_name[20];intp_priority;intp_needTime;intp_runTime;charp_state;structPCB*next;};voidHighPriority();voidInformation();charChoice();structPCB*SortList(PCB*HL);intmain(){printf(《演示最高优先数优先算法》\n\n);HighPriority();return0;}voidHighPriority(){structPCB*processes,*pt;//pt作为临时节点来创建链表processes=pt=(structPCB*)malloc(sizeof(structPCB));for(inti=0;i!=5;++i){structPCB*p=(structPCB*)malloc(sizeof(structPCB));printf(进程号No.%d:\n,i);printf(输入进程名输入进程优先数输入进s程运行时间\n);scanf(%s%d%d,p-p_name,&p-p_priority,&p-p_needTime);p-p_runTime=0;p-p_state='W';p-next=NULL;pt-next=p;pt=p;printf(\n\n);}getchar();//接受回车//processes作为头结点来存储链表processes=processes-next;intcases=0;structPCB*psorted=processes;while(1){++cases;pt=processes;//对链表按照优先数排序//psorted用来存放排序后的链表psorted=SortList(psorted);printf(Theexecutenumber:%d\n\n,cases);printf(****当前正在运行的进程是:%s\n,psorted-p_name);psorted-p_state='R';printf(qnamestatesuperndtimeruntime\n);printf(%s\t%c\t%d\t%d\t\n\n,psorted-p_name,psorted-p_state,psorted-p_needTime,psorted-p_runTime);pt-p_state='W';psorted-p_runTime++;psorted-p_priority--;printf(****当前就绪状态的队列为:\n\n);//pt指向已经排序的队列pt=psorted-next;while(pt!=NULL){printf(qnamestatesuperndtimeruntime\n);printf(%s\t%c\t%d\t%d\t\n\n,psorted-p_name,psorted-p_state,psorted-p_needTime,psorted-p_runTime);pt=pt-next;}//pt指向已经排序的链表,判断链表是否有已用时间啊等于需要时间的pt=psorted;structPCB*ap;ap=NULL;//ap指向pt的前一个节点while(pt!=NULL){if(pt-p_needTime==pt-p_runTime){if(ap==NULL){pt=psorted-next;psorted=pt;}elseap-next=pt-next;}ap=pt;pt=pt-next;}if(psorted-next==NULL)break;getchar();}}structPCB*SortList(PCB*HL){structPCB*SL;SL=(structPCB*)malloc(sizeof(structPCB));SL=NULL;structPCB*r=HL;while(r!=NULL){structPCB*t=r-next;structPCB*cp=SL;structPCB*ap=NULL;while(cp!=NULL){if(r-p_prioritycp-p_priority)break;else{ap=cp;cp=cp-next;}}if(ap==NULL){r-next=SL;SL=r;}else{r-next=cp;ap-next=r;}r=t;}returnSL;}四、实验结果五、实验总结本次试验感觉难度比较大,有很多生疏的指令。但在老师和同学的帮助下都解决了。总体上还是对进程概念和进程调度过程有了一个更深的理解。在这次试验中也暴露出自己不少的缺点,希望以后试验中可以改正!本文利用C语言对动态优先权的进程调度算法进行了设计和模拟实现。程序可实现动态的进行各个进程相关信息的录入,如CPUTIME、ALLTIME、STARTBLOCK、BLOCKTIME等信息。并充分考虑了进程在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。由于抢占式调度算法与硬件密切相关,由软件实现非常困难,所以本程序实现的是非抢占式的动态优先权进程调度算法。抢占式的动态优先权进程调度算法的模拟实现有待于进一步研究。
本文标题:动态高优先权优先
链接地址:https://www.777doc.com/doc-5203746 .html