动态优先权进程调度算法》实验报告题目:动态优先权进程调度算法的模拟实现专业:班级:学号:姓名:日期:实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。二、实验内容与基本要求编制模拟动态优先权算法的程序,并给出的例子验证所编写的程序的正确性。(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-1BLOCKTIME30000为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。格式如下:RUNNINGPROG:iREADY_QUEUE:->id1->id2BLOCK_QUEUE:->id3->id4ID01234PRIORITYP0P1P2P3P4CPUTIMEC0C1C3C4C5ALLTIMEA0A1A2A3A4STARTBLOCKT0T1T2T3T4BLOCKTIMEB0B1B2B3B4STATES0S1S2S3S4三、实验报告内容1、动态优先权算法原理动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。若所有的就绪进程具有各不相同的优先权初值,那么,对于优先权初值低的进程,在等待了足够的时间后,其优先权便可能升为最高,从而可以获得处理机。当采用抢占式优先权调度算法时,如果再规定当前进程的优先权以速率b下降,则可防止一个长作业长期地垄断处理机。2、程序流程图//进程标识数//进程优先数,优先数越大优先级越高//进程已占用的CPU时间//进程还需占用的CPU时间//进程的阻塞时间//进程被阻塞的时间//进程状态//temp2为比较结点的直接前驱结点3、程序及注释#include#include#includetypedefstructnode{intid;intpriority;intcputime;intalltime;intstartblock;intblocktime;charstate[10];structnode*next;}PCB;PCB*CreatQueue(intnum)//创建一个就绪队列{inti;//i为循环计数器PCB*head,*temp1,*temp2,*temp3;//head为就绪队列的头指针,tempi为创建进程结点的指针,temp2、temp3分别为比较结点的前驱结点和比较结点for(i=0;iid,&temp1->priority,&temp1->cputime,&temp1->alltime,&temp1->startblock,&temp1->blocktime,temp1->state);if(i==0)//如果创建的是第一个结点{head=temp1;head->next=NULL;continue;}if(head->prioritypriority)//如果创建结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前{temp1->next=head;head=temp1;continue;}temp2=head;}temp3=temp2->next;//temp3为比较的结点while(temp3!=NULL&&temp3->priority>=temp1->priority)//实现查找的功能{temp2=temp3;temp3=temp2->next;}temp2->next=temp1;temp1->next=temp3;}returnhead;}PCB*InsertQueue(PCB*head,PCB*run)//在就绪队列中插入一个结点{PCB*temp1,*temp2;//temp1和temp2分别为比较结点的前驱和比较结点if(head==NULL)//如果就绪队列为空{head=run;head->next=NULL;}elseif(head->prioritypriority)//如果插入结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前{run->next=head;head=run;}else{temp1=head;//temp1为比较结点...