动态优先权进程调度算法的模拟
模拟动态优先权进程调度算法

实验使用动态优先权的进程调度算法模拟1、实验目的通过动态优先权算法的模拟加深对进程概念进程调度过程的理解。
2、实验内容(1) 用C语言来实现对N个进程采用动态优先权优先算法的进程调度。
(2) 每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:•进程标识数ID。
•进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
•进程已占用的CPU时间CPUTIME。
•进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
•进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。
•进程被阻塞的时间BLOCKTIME,表示已足赛的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
•进程状态START。
•队列指针NEXT,用来将PCB排成队列。
(3) 优先数改变的原则:•进程在就绪队列中呆一个时间片,优先数加1。
•进程每运行一个时间片,优先数减3。
具体格式如下:RUNNING PROG:iREADY-QUEUE:-〉id1-〉id2BLOCK-QUEUE:-〉id3-〉id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STA TE S0 S1 S2 S3 S43、代码如下:#include<stdio.h>#include<stdlib.h>struct pro{int ID;int PRIORITY;int CPUTIME;int ALLTIME;int STARTBLOCK;int BLOCKTIME;char *STATE;}p[5]={{0,9,0,3,2,3,"READY"},{1,38,0,3,-1,0,"READY"},{2,30,0,6,-1,0,"READY"},{3,29,0,3,-1,0,"READY"},{4,0,0,4,-1,0,"READY"}};void Print(){printf("ID %-10d%-10d%-10d%-10d%-10d\n",p[0].ID,p[1].ID,p[2].ID,p[3].ID,p[ 4].ID);printf("PRIORITY %-10d%-10d%-10d%-10d%-10d\n",p[0].PRIORITY,p[1].PRIORITY ,p[2].PRIORITY,p[3].PRIORITY,p[4].PRIORITY);printf("CPUTIME %-10d%-10d%-10d%-10d%-10d\n",p[0].CPUTIME,p[1].CPUTIME ,p[2].CPUTIME,p[3].CPUTIME,p[4].CPUTIME);printf("ALLTIME %-10d%-10d%-10d%-10d%-10d\n",p[0].ALLTIME,p[1].ALLTIME,p[2]. ALLTIME,p[3].ALLTIME,p[4].ALLTIME);printf("STARTBLOCK %-10d%-10d%-10d%-10d%-10d\n",p[0].STARTBLOCK,p[1].STA RTBLOCK,p[2].STARTBLOCK,p[3].STARTBLOCK,p[4].STARTBLOCK);printf("BLOCKTIME %-10d%-10d%-10d%-10d%-10d\n",p[0].BLOCKTIME,p[1].BLO CKTIME,p[2].BLOCKTIME,p[3].BLOCKTIME,p[4].BLOCKTIME);printf("STATE %-10s%-10s%-10s%-10s%-10s\n",p[0].STATE,p[1].STATE,p[2].STA TE,p[3].STATE,p[4].STATE);}int Search(){int a=-1,i,max;if(p[0].STATE=="READY"){a=0;max=p[0].PRIORITY;}else{for(i=0;i<5;i++)if(p[i].STATE=="READY"){a=i;max=p[i].PRIORITY;break;}}for(i=0;i<5;i++)while(p[i].STATE=="READY" && p[i].PRIORITY>max) {max=p[i].PRIORITY;a=i;}return a;}void Execute(int a){int i;p[a].STATE="EXECUTE";++p[a].CPUTIME;p[a].ALLTIME=p[a].ALLTIME-1;if(p[a].ALLTIME==0){p[a].STATE="END";}p[a].PRIORITY=p[a].PRIORITY-3;if(p[a].STARTBLOCK>=0)--p[a].STARTBLOCK;for(i=0;i<5;i++)if(p[i].STATE=="BLOCK" && p[i].BLOCKTIME>0) --p[i].BLOCKTIME;if(p[a].STARTBLOCK==0)p[a].STATE="BLOCK";for(i=0;i<5;i++){if(p[i].STATE=="READY")p[i].PRIORITY=p[i].PRIORITY+1;if(p[i].STATE=="BLOCK" && p[i].BLOCKTIME==0) p[i].STA TE="READY";}if(p[a].ALLTIME>0 && p[a].STATE!="BLOCK"){p[a].STATE="READY";}}void main(){int b,i;Print();printf("按enter键继续……\n");getchar();do{ system("cls");b=Search();if(b<0)break;printf("RUNNING PROG:ID%d\n",b);printf("READY-QUEUE:");for(i=0;i<5;i++)if(p[i].STATE=="READY" && p[i].ID!=b)printf("->ID%d",i);printf("\nBLOCK-QUEUE:");for(i=0;i<5;i++)if(p[i].STATE=="BLOCK")printf("->id%d",i);printf("\n=========================================================== =====\n");Execute(b);Print();printf("按enter键继续……");getchar();}while(1);}程序运行结果如下:①开始界面②运行一个时间片后③运行二个时间片后④有进程阻塞时⑤运行结束时。
使用动态优先权的进程调度算法的模拟实验

使用动态优先权的进程调度算法的模拟实验动态优先权调度算法是一种根据进程动态表现调整优先权的进程调度算法。
它不仅考虑了进程的优先级,还将进程的实际执行情况作为调度依据。
下面将介绍一个模拟实验,以更好地理解这种调度算法。
实验背景:假设有五个待执行的进程,它们的ID和初始优先权分别为P1(3)、P2(5)、P3(2)、P4(1)、P5(4)。
这五个进程的优先权在调度过程中会根据实际情况进行动态调整。
实验过程:1.初始化:在实验开始之前,首先需要对进程的初始状态进行初始化。
每个进程有两个属性:优先级和已运行时间。
优先级用于决定进程的调度优先级,已运行时间用于记录进程已经运行了多长时间。
设置一个全局时间片,表示每个时间单元中运行的时间。
2.进程调度:根据进程的优先权,选取最高优先权的进程进行调度。
从P1到P5,进程的优先权逐渐减小。
-选择进程:比如初始时最高优先权的进程为P2-进程执行:进程P2被调度后开始执行,运行一个时间片。
每运行一个时间片,该进程的已运行时间加一,重新计算进程的优先权。
-优先权调整:根据已运行时间的加一,重新计算进程的优先权。
优先权的计算公式可以根据实际需要进行调整,比如可以设为:新的优先权=原优先权+(已运行时间/其中一常量)。
-进程阻塞:如果进程运行的时间超过了一个时间片,则该进程被阻塞,进入就绪队列等待下一次轮转调度,其他进程继续执行。
3.调度进程更新:进程在执行和阻塞的过程中,它们的优先权会发生变化。
在每一轮调度后,需要更新进程的优先权,重新确定每个进程的调度顺序。
4.实验结果:重复进行步骤2和步骤3,直到所有进程都完成执行。
记录每次调度过程中的结果,包括进程的执行顺序、时刻和优先权的变化。
实验分析:通过模拟实验,可以得出以下一些结论:1.动态优先权调度算法能够根据实际情况调整进程的优先权,更好地适应不同进程的需求,增强了调度的灵活性。
2.在实验中,进程运行时间越长,优先权越低。
使用动态优先权的进程调度算法的模拟

使用动态优先权的进程调度算法的模拟动态优先权(Dynamic Priority)调度算法是一种根据进程的行为动态调整其优先级的调度算法。
它是对静态优先权调度算法的一种改进,能够更加灵活和有效地调度进程。
下面我将通过模拟的方式详细介绍动态优先权调度算法。
在动态优先权调度算法中,每个进程都有一个初始优先级,等待时间越长,优先级越高。
当进程开始执行时,系统根据其行为调整它的优先级。
假设有五个进程ReadyQueue={P1, P2, P3, P4, P5},它们的初始优先级分别为{10, 20, 30, 40, 50}。
每个进程的服务时间分别为{6, 7, 8, 9, 10}。
1.初始化阶段:-进程P1开始执行,系统将其优先级设置为初始优先级减去正在运行的时间。
-正在运行的时间是指进程执行过程中已经消耗的时间。
2.执行阶段:-进程P1运行6个时间单位后,它已经完成了自己的服务时间。
这时,系统将调度下一个优先级最高的进程P5运行。
-进程P5开始执行,系统将其优先级设置为初始优先级减去正在运行的时间。
因为P5执行是第一次运行,所以其正在运行的时间为0。
-进程P5运行10个时间单位后,它也完成了自己的服务时间。
3.更新优先级阶段:-进程P5完成后,进程P2开始执行,系统将其优先级设置为初始优先级减去正在运行的时间。
-进程P2运行7个时间单位后,它完成了自己的服务时间。
4.重新排序阶段:-进程P3开始执行,系统将其优先级设置为初始优先级减去正在运行的时间。
-进程P3运行8个时间单位后,它也完成了自己的服务时间。
5.最后的执行阶段:-进程P4开始执行,系统将其优先级设置为初始优先级减去正在运行的时间。
-进程P4运行9个时间单位后,完成了自己的服务时间。
至此,所有的进程都已经完成了它们的服务时间。
动态优先权调度算法的核心思想是,等待时间越长,优先级越高。
这样做的原因是为了避免饥饿的产生,即一些低优先级的进程因为等待时间太长而无法得到运行。
动态优先权进程调度算法模拟实验报告

动态优先权进程调度算法模拟实验报告动态优先权调度算法是一种动态调度算法,根据进程的优先级来决定下一个要执行的进程。
进程的优先级可以根据其紧迫性、重要性和资源需求等因素来确定。
本实验利用模拟算法来模拟动态优先权调度算法,并通过实例来说明该调度算法的工作原理和优缺点。
一、实验目的通过本实验,我们可以了解动态优先权调度算法的工作原理,掌握如何使用模拟算法来模拟进程的调度过程,进一步了解该调度算法的优缺点。
二、实验环境本实验使用C++编程语言来实现动态优先权调度算法的模拟。
编译器使用Dev-C++。
三、实验步骤1.设计进程控制块(PCB)的数据结构,包括进程优先级、进程标识、进程状态等信息。
2.设计模拟算法来模拟动态优先权调度算法。
具体算法如下:a.初始化就绪队列,将所有的进程按照优先级插入到就绪队列中。
b.选择优先级最高的进程执行,并更新该进程的优先级。
c.执行完毕后更新进程的状态,并将其从就绪队列中删除。
d.如果新的进程到达,将其插入到就绪队列中。
3.实现主函数,模拟进程的创建、调度和执行过程。
4.进行多个实例的测试,观察进程的调度顺序和执行结果。
5.总结实验结果,分析动态优先权调度算法的优缺点。
四、实验结果与分析通过多个实例的测试,我们可以观察到动态优先权调度算法的工作过程和效果。
该算法可以根据进程的优先级来确定下一个要执行的进程,从而可以更好地满足不同进程的需求。
同时,动态优先权调度算法可以确保优先级高的进程能够及时得到执行,提高系统的响应速度。
然而,动态优先权调度算法存在一些缺点。
首先,该算法对进程的优先级要求较高,需要合理设置进程的优先级。
如果优先级设置不合理,可能导致优先级高的进程一直占用CPU资源,而优先级低的进程无法得到执行,造成资源浪费。
其次,该算法没有考虑进程的等待时间和执行时间,容易导致饥饿现象的发生,即一些进程无法得到执行。
五、实验总结通过本实验,我们了解了动态优先权调度算法的工作原理和模拟方法。
使用动态优先权的进程调度算法的模拟实验

使用动态优先权的进程调度算法的模拟实验进程调度算法是操作系统中对进程进行调度的一种策略,动态优先权调度算法是其中一种常用的调度算法。
下面将对动态优先权调度算法进行模拟实验,并对实验结果进行分析。
首先,我们定义进程的属性包括进程编号、到达时间、服务时间、优先权和完成时间等。
动态优先权调度算法的基本思想是根据进程的优先权决定下一个被调度的进程,优先权越高,被调度的机会越大。
实验过程如下:1.创建一个进程队列,用来存放待调度的进程。
2.输入进程的个数,并依次输入每个进程的到达时间、服务时间和优先权。
3.将所有进程按照到达时间进行排序。
4.从排好序的进程队列中选择优先权最高的进程,即优先权最大的进程。
5.通过执行该进程进行模拟,更新进程队列中的进程信息。
6.根据更新后的进程信息,重新选择下一个被调度的进程。
7.重复步骤5和6,直到所有进程执行完毕。
对于每个进程,我们可以记录其等待时间、周转时间和带权周转时间。
等待时间即为该进程在就绪队列中等待的时间,周转时间是指从进程提交到完成的时间,即完成时间减去到达时间,带权周转时间是指每个进程的周转时间除以服务时间,用来评估进程的调度效果。
下面是一个动态优先权调度算法的模拟实验示例:```pythonclass Process:self.id = idself.priority = prioritydef __lt__(self, other):return self.priority < other.prioritydef dynamic_priority_scheduling(processes):queue = []while processes or queue:for process in processes:queue.append(process)processes.remove(process)queue.sort(reverse=True) # 根据进程的优先权进行排序if queue:process = queue.pop(0)for p in queue:if __name__ == '__main__':n = int(input("Enter the number of processes: "))processes = []for i in range(n):priority = int(input("Enter priority for process {}:".format(i+1)))dynamic_priority_scheduling(processes)```以上代码定义了一个Process类来表示进程,并使用动态优先权调度算法对进程进行调度。
实验三使用动态优先权的进程调度算法的模拟

实验三使用动态优先权的进程调度算法的模拟概述:在计算机操作系统中,进程调度算法是一种非常重要的组成部分。
进程调度算法决定了系统中各个进程的执行顺序和时间分配,直接影响到系统的性能和资源利用率。
本实验将模拟一种动态优先权的进程调度算法,通过动态地调整进程的优先级来控制执行顺序。
实验目的:1.理解动态优先权的进程调度算法的原理;2.掌握模拟进程的创建、调度和执行的方法;3.通过实验模拟,对进程调度算法的性能进行评估。
实验背景:动态优先权的进程调度算法是基于进程优先级的调度算法。
每个进程被赋予一个初始优先级,随着时间的推移,根据进程的行为和状态,动态地调整进程的优先级。
实验实施步骤:1.定义进程的数据结构,包括进程ID、进程优先级、进程状态等信息;2.创建多个进程,并初始化前述的进程数据结构;3.模拟进程的执行过程,按照一定的规则和时间片来调度执行进程;4.根据进程的行为和状态,动态地调整进程的优先级;5.模拟多轮进程调度,记录进程的执行情况和性能指标;6.结果分析和实验总结。
实验具体实施:1.定义进程的数据结构:进程的数据结构可以使用类或者结构体来定义,包括进程ID(PID)、进程优先级(priority)、进程状态(state)等字段。
进程状态可以包括"就绪"、"运行"和"完成"等状态。
2.创建多个进程:创建多个进程,并为每个进程初始化进程数据结构,包括PID、priority和state等字段。
可以使用数组、链表或队列等数据结构来管理多个进程的信息。
3.模拟进程的执行过程:在模拟的过程中,将进程按照一定的规则和时间片来调度执行。
可以采用循环方式,循环执行每个进程的一小段代码,模拟进程在CPU上的执行过程。
4.动态地调整进程的优先级:根据进程的行为和状态,动态地调整进程的优先级。
例如,当进程执行完成后,将其优先级降低;当进程等待很长时间后,在没有获得CPU资源的情况下,将其优先级提高。
基于动态优先权的进程调度模拟-课程设计

计算机科学与工程学院课程设计报告题目全称:基于动态优先权的进程调度模拟课程名称:计算机操作系统、任课教师: xx指导老师:xx职称:副教授指导老师评语:签字:摘要当计算机是多道程序设计系统时,通常会有多个进程或线程同时竞争CPU,如果只有一个CPU可用,那么就只能选择一个进程来运行,完成选择工作的算法即为调度算法。
毫无疑问,不同的系统需要不同的调度算法,同一系统中不同的调度算法也决定了他们会产生不同的性能。
至今为止,还没有一种既最优又能适用于所有系统的调度算法。
于是,为深入了解调度算法的执行过程,本小组选择了一种基于动态优先权的调度算法来进行模拟,本文详细阐释了模拟调度程序的设计,实现过程,并且测试表明,该程序运行良好,准确。
关键词:进程调度算法动态优先权模拟ABSTRACTWhen a computer is based on MultiProgramming, there are always multiple processes or threads that compete for CPU. If the system has only one CPU, it can only chooses one process or thread to run, the algorithm completes choosing it named “Schedule Algorithm”.Without doubt that different systems requires different schedule algorithms, different schedule algorithms in the same system defines the different performances they will result in. Up to now, we have no schedule algorithm that with best performance and adapt to every system.Therefore, for purpose that deeply comprehend the execution process, our team choose a schedule algorithm based on dynamic priority to simulate, and this paper state detailedly the design and implement process, and test results indicate that our software runs well and accurately.Keywords: process schedule algorithm dynamic priority simulation目录第一章绪论 (1)1.1 选题背景及意义 (1)1.2 相关技术介绍 (2)1.3 主要设计内容 (3)1.4论文结构 (3)第二章需求分析 (4)2.1 环境需求 (4)2.2 功能需求 (4)2.3 性能需求 (5)2.3 本章小结 (5)第三章基于动态优先权的进程调度算法模拟程序设计 (6)3.1 总体设计 (6)3.2 功能模块设计 (6)3.3 本章小结 (10)第四章基于动态优先权的进程调度算法模拟程序实现 (11)4.1 开发环境介绍 (11)4.2 主要功能模块的实现 (12)4.3 本章小结 (26)第五章测试及成果展示 (27)5.1 测试环境 (27)5.2 测试用例和结果 (27)5.3 成果展示 (35)5.4 本章小结 (35)第六章总结与展望 (36)参考文献 (37)第一章绪论第一章绪论1.1 选题背景及意义1.1.1 选题背景操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
动态高优先权优先调度

实验三动态高优先权优先调度
实验内容:
模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:
设置作业体:作业名,作业的到达时间,服务时间,初始优先权,作业状态(W——等待,R ——运行,F——完成),作业间的链接指针
作业初始化:由用户输入作业名、服务时间、初始优先权进行初始化,同时,初始化作业的状态为W。
显示函数:在作业调度前、调度中和调度后进行显示。
排序函数:对就绪状态的作业按照优先权排序。
优先权相同时进入等待队列时间早的作业在前。
注意考虑到达时间
调度函数:每次从等待队列队首调度优先权最高的作业执行,状态变化。
并在执行一个时间单位后优先权变化,服务时间变化,状态变化。
当服务时间为0时,状态变为
F。
删除函数:撤销状态为F的作业。
实验要求:
1、测试数据可以随即输入或从文件中读入。
2、必须要考虑到作业的到达时间
3、最终能够计算每一个作业的周转时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机学院设计性实验报告一、实验目的通过动态优先权调度算法和时间片轮转调度算法的模拟加深进程概念和进程调度过程的理解。
二、实验仪器或设备一台笔记本电脑或者是一台台式机三、总体设计(设计原理、设计方案及流程等)本实验的目的就是用在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。
已知时间片轮转算法,可以根据时间片轮转的思路加以修改就行了。
时间轮转调度算法与动态优先权的区别就是时间片轮转是在FIFO进程调度的基础上,队列中的进程按照进入的顺序,每个进程每次都执行一个时间片;如果运行完就把该进程释放掉,如果在一个时间片内未结束就插到队列尾部。
而动态优先权进程调度算法就是按照优先权的大小运行进程,如果一个时间片内未运行完,则将优先权数减3后再插入到队列中(不是队尾而是队列中的适当位置,该位置前面的节点的优先级数大于该节点的优先级数,后面的节点的count值小于该节点的count值)。
四、实验要求:(1)在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。
为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程情况显示出来;(2)进程控制块是进程存在的唯一标志,因此,在模拟算法中每一个进程用一个进程控制块PCB来代表,PCB用一结构体表示。
包括以下字段:●进程标识数id,或者进程的名称name;●进程优先数priority,并规定优先数越大的进程,其优先权越高;●进程需要运行的CPU时间ntime;●进程的运行时间rtime;●进程状态state;●队列指针next,用来将PCB排成队列。
(3)进程在运行过程中其状态将在就绪、执行、阻塞(可选)、完成几种状态之间转换,同时进程可能处于不同的队列中,如就绪队列、阻塞队列(可选)。
在两种调度算法中,考虑分别可以选择什么样的队列及如何实现进程的入队、出队操作;(4)为了便于处理,优先权调度每次也仅让进程执行一个时间片,若在一个时间片内未运行结束,调整进程优先级将其插入就绪队列,进行新一轮调度;(5)优先数改变原则:●进程每运行若一个时间单位,优先数减3;●进程在就绪队列中呆一个时间片,优先数增加1。
(仅供参考,合理即可)(6)优先权调度中,对于遇到优先权一致的情况,可采用FCFS策略解决;(7)由于是模拟进程调度,所以,对被选中的进程并不实际启动运行,而是修改进程控制块的相关信息来模拟进程的一次运行;(8)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照格式如下:id cputime needtime priority(count) state0 0 2 48 ready(9)sort函数执行流程五、实验步骤(包括主要步骤、代码分析等)#include "stdio.h"#include <stdlib.h>#define getpch(type) (type*)malloc(sizeof(type))struct pcb { //定义进程控制块char name[10]; //进程的名字char state; //进程的状态int count; //进程优先级int ntime; //进程运行需要的CPU时间int rtime; //进程已运行的时间struct pcb* link; //连接pcb的指针}*ready=NULL,*tail=NULL,*p; //就绪队列指针,队尾指针typedef struct pcb PCB;int slice = 1;PCB *readyMaxProcess;int readyQueNum=0; // 就绪队列的进程数量sort() //将进程插入到就绪指针{PCB *q;if(ready==NULL) //队列为空,将p插入到队列中{ready=p;tail=p;}else //若就绪队列不为空,将p插入到队列{if(p->count>ready->count)//p指针所指节点的count值头的大于队列节点的count值,将p指针所指节点插入到对头{ p->link=ready;ready=p;}else{ bool m=false;q=ready;//q2=q1->link;while(m==false){if(tail->count>=p->count)//若p的count值小于队尾指针所指节点的的count值的话,将p插到队尾{tail->link=p;tail=p;p->link=NULL;m=true;}else{if(q->count>=p->count&&p->count>q->link->count)//若p的count值大于队尾指针所指节点的的count值的话,将p所指节点插入到队列中指定位置//必须满足插入位置的前一个节点的count值大于p->count,并且满足插入位置的后一个节点的count值小于p->count{p->link=q->link;q->link=p;m=true;}else{q=q->link;//q2=q2->link;}}}}}}input(){int i,num;printf("\n 请输入进程个数:");scanf("%d",&num);for(i=0;i<num;i++){printf("\n 进程号No.%d:\n",i);p=getpch(PCB);printf("\n 请输入进程名:");scanf("%s",p->name);printf("\n 请输入进程优先权数:");scanf("%d",&p->count);printf("\n 请输入进程运行时间:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='w';p->link=NULL;sort(); //将进程p插入就绪队列ready中}printf("\n 请输入时间片大小:");scanf("%d",&slice);}//获得就绪队列中进程的个数int space(){PCB* pr=ready;while(pr!=NULL){readyQueNum++;pr=pr->link;}return(readyQueNum);}//显示进程disp(PCB * pr){printf("\nqname \tstate \tcount \tndtime \truntime \n");printf("|%s\t",pr->name);printf("|%c\t",pr->state);printf("|%d\t",pr->count);printf("|%d\t",pr->ntime);printf("|%d\t",pr->rtime);printf("\n");}//显示当前运行进程和就绪队列中进程的信息check(){PCB* pr;printf("\n **** 当前正在运行的进程是:%s",readyMaxProcess->name);disp(readyMaxProcess);pr=ready;printf("\n ****当前就绪队列状态为:\n");while(pr!=NULL){pr->count++;disp(pr);pr=pr->link;}}//撤销进程destroy(){printf("\n 进程 [%s] 已完成.\n",readyMaxProcess->name);free(readyMaxProcess);//readyQueNum--;}//使当前进程运行一个时间片,若结束则撤销,否则插入就绪队列队尾running(){int tempt=0;tempt = readyMaxProcess->ntime - readyMaxProcess->rtime;if(tempt>slice)readyMaxProcess->rtime+=slice;elsereadyMaxProcess->rtime+=tempt;check();if(readyMaxProcess->rtime==readyMaxProcess->ntime)destroy();else{ readyMaxProcess->count=readyMaxProcess->count-3;readyMaxProcess->state='w';p=readyMaxProcess;//再将队头节点readyMaxProcess插入到队列时,现将赋给另一个指针psort();}}main(){int len,h=0;input(); //输入进程并形成就绪队列len=space(); //获得就绪队列中进程的个数while((len!=0)&&(ready!=NULL)) //若就绪队列不为空{ len=space();h++;printf("\n The execute number:%d \n",h);readyMaxProcess=ready; //将指向队优先级最大的节点的指针指向队头节点ready=ready->link; //改变对头指针readyMaxProcess->link=NULL; //将优先级最大的进程从队列中分裂出来readyMaxProcess->state='R';running();}printf("\n\n 所有进程已经完成.\n");}六、实验结果七、结果分析与总结这个实验最主要就是理解动态优先权数调度算法的原理,利用c语言程序完成该过程的模拟。