动态优先权进程调度算法模拟实验报告.pdf
华北电力大学 实 验 报 告 实验名称 动态优先权进程调度算法模拟 课程名称 计算机操作系统 专业班级:学生姓名:学 号:成 绩:指导教师:实验日期:一实验目的:通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。二实验内容:(1)用 C 语言(或其它语言,如 Java)实现对 N 个进程采用某种进程调度算法(如动态优先权调度)的调度。(2)每个用来标识进程的进程控制块 PCB 可用结构来描述,包括以下字段:进程标识数 ID。进程优先数 PRIORITY,并规定优先数越大的进程,其优先权越高。进程已占用 CPU 时间 CPUTIME。进程还需占用的 CPU 时间 ALLTIME。当进程运行完毕时,ALLTIME 变为 0。进程的阻塞时间 STARTBLOCK,表示当进程再运行 STARTBLOCK 个时间片后,进程将进入阻塞状态。进程被阻塞的时间 BLOCKTIME,表示已阻塞的进程再等待 BLOCKTIME 个时间片后,将转换成就绪状态。进程状态 STATE。队列指针 NEXT,用来将 PCB 排成队列。(3)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加 1。进程每运行一个时间片,优先数减 3。(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。(5)分析程序运行的结果,谈一下自己的认识。三、设计思路和方法 通过 VC+程序模拟动态优先权程序调度算法,主要思路和方法就是,通过结构体模拟计算机的控制模组,构造一个 PCB 结构体即进程控制块结构体,用来记录当前进程的的相关状态信息,包括进程标识符、处理机状态、进程调度信息、进程控制信息。并通过C+语言模拟计算机的相关调度算法,对构建的 PCB 进程进行模拟调度和运行,从而实现用计算机对进程的调度过程进行过程仿真。四、数据结构和算法 数据结构:1.包含 PCB 信息的结构体 2.包含进程信息的顺序表结构 算法:优先权=(等待时间+要求服务时间)/要求服务时间 Rp=(等待时间+要求服务时间)/要求服务时间=相应时间/要求服务时间 系统将所有就绪队列按优先级高低排成一个队列,每次调度时,将 CPU 分配给优先级最高的进程,并令其执行一个时间片,而后中断,寻找并运行下一个优先级最高的进程。而所有进程的优先权在随进程的推进或随其等待时间的增加而增加,而被调度之后的程序则降低一定的优先级,从而使所有进程都有运行的机会,从而保证系统能在给定的时间内响应所有用户的请求。五程序代码和输出 1 程序代码如下#include iostream.h#include windows.h/#define N 3 typedef struct int ID;int PRIORITY;int CPUTIME;int ALLTIME;int STARTBLOCK;int BLOCKTIME;int STATE;/0-运行 1-阻塞 2-就绪 3-结束 4-未到达 int REACH;int TIME;PROCESS;void textcolor(int color)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);void main()int i,time,max,l,l1,time1,flag=0,total=0,N,server10,sum=0;PROCESS pro10;textcolor(13);cout注意:本程序中状态代表如下endl0-运行 1-阻塞 2-就绪 3-结束 4-未到达endlendl;textcolor(15);coutN;couttime;cout请输入各进程初始状态:endl;coutID PRIORITY REACH ALLTIME STARTBLOCK BLOCKTIMEendl;for(i=0;iproi.IDproi.PRIORITYproi.REACH;cinproi.ALLTIMEproi.STARTBLOCKproi.BLOCKTIME;serveri=proi.ALLTIME;if(proi.REACH=0)proi.STATE=0;else proi.STATE=4;do coutendl当前时刻为:total;textcolor(12);coutendl=各进程状态为=endl;textcolor(15);coutID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATEendl;for(i=0;iN;i+)coutproi.ID proi.PRIORITY proi.CPUTIME ;coutproi.ALLTIME proi.STARTBLOCK proi.BLOCKTIME proi.STATE;coutendl;total+=time;for(i=0;iN;i+)if(proi.STATE=4&proi.REACHtotal)proi.STATE=1;for(i=0;iN;i+)time1=proi.ALLTIME;if(proi.STATE=0)if(proi.ALLTIME=time)/proi.CPUTIME+=time1;proi.ALLTIME=0;proi.STATE=3;proi.TIME=total-time+time1;else /proi.CPUTIME+=time;proi.ALLTIME-=time;proi.STARTBLOCK-;if(proi.STARTBLOCK=0)proi.STATE=1;proi.BLOCKTIME=time1;proi.STARTBLOCK=time1;proi.PRIORITY-=3;proi.TIME=total;if(proi.STATE=1)proi.BLOCKTIME-;if(proi.BLOCKTIME=0)proi.STATE=2;proi.TIME=total;if(proi.STATE=2)/proi.CPUTIME+=time;proi.PRIORITY+;proi.TIME=total;max=-100;l1=-1;l=-1;for(i=0;imax&(proi.STATE=0|proi.STATE=2)l=i;max=proi.PRIORITY;if(proi.STATE=0)l1=i;if(l!=-1&l!=l1)prol.STATE=0;if(l1!=-1)prol1.STATE=2;flag=0;for(i=0;iN;i+)if(proi.STATE!=3)flag=1;break;if(flag=0)break;while(1);coutendl当前时刻:total;textcolor(12);coutendl=各进程状态为=endl;textcolor(15);coutID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATEendl;for(i=0;iN;i+)coutproi.ID proi.PRIORITY proi.CPUTIME ;coutproi.ALLTIME proi.STARTBLOCK proi.BLOCKTIME proi.STATE;coutendl;coutendl各进程运行结束!endl;cout进程号 到达时间 结束时间 周转时间 带权周转时间endl;textcolor(10);for(i=0;iN;i+)cout proi.ID proi.REACH proi.TIME proi.TIME-proi.REACH (float)(proi.TIME-proi.REACH)/serveriendl;sum+=proi.TIME-proi.REACH;cout平均周转时间为:(float)sum/Nendl;textcolor(15);2 输入 注意:本程序中状态代表如下 0-运行 1-阻塞 2-就绪 3-结束 4-未到达 请输入进程数:5 请设置时间片长度:4 请输入各进程初始状态:ID PRIORITY REACH ALLTIME STARTBLOCK BLOCKTIME 1 2 3 0 1 4 2 6 4 0 3 1 2 0 3 4 5 2 2 1 2 4 3 4 1 5 2 4 5 3 3 输出结果 当前时刻为:0=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 2 0 0 1 4 4 2 6 0 0 3 1 4 2 0 0 4 5 2 4 2 1 0 4 3 4 4 1 5 0 4 5 3 4 当前时刻为:4=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 2 0 0 1 3 1 2 6 0 0 3 1 4 2 0 0 4 5 1 1 2 1 0 4 3 3 1 1 5 0 4 5 2 1 当前时刻为:8=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 2 0 0 1 2 1 2 7 0 0 3 0 0 2 1 0 4 5 0 2 2 1 0 4 3 2 1 1 5 0 4 5 1 1 当前时刻为:12=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 2 0 0 1 1 1 2 7 0 0 3 0 3 2 2 0 4 5 0 2 2 1 0 4 3 1 1 1 6 0 4 5 0 0 当前时刻为:16=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 3 0 0 1 0 0 2 7 0 0 3 0 3 2 3 0 4 5 0 2 2 2 0 4 3 0 2 1 6 0 0 5 0 3 当前时刻为:20=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 3 0 0 1 0 3 2 7 0 0 3 0 3 2 4 0 4 5 0 0 2 3 0 4 3 0 2 1 6 0 0 5 0 3 当前时刻为:24=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 3 0 0 1 0 3 2 7 0 0 3 0 3 2 4 0 0 5 0 3 2 4 0 4 3 0 0 1 6 0 0 5 0 3 当前时刻:28=各进程状态为=ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 1 3 0 0 1 0 3 2 7 0 0 3 0 3 2 4 0 0 5 0 3 2 4 0 0 3 0 3 1 6 0 0 5 0 3 各进程运行结束!进程号 到达时间 结束时间 周转时间 带权周转时间 1 3 16 13 1.#INF 2 4 8 4 1.#INF 2 3 24 21 5.25 2 2 28 26 6.5 1 2 16 14 3.5 平均周转时间为:15.6 六遇到问题和体会 本次试验感觉难度比较大,有很多生疏的指令。但在老师和同学的帮助下都解决了。总体上还是对进程概念和进程调度过程有了一个更深的理解。在这次试验中也暴露出自己不少的缺点,希望以后试验中可以改正!本文利用C 语言对动态优先权的进程调度算法进行了设计和模拟实现。程序可实现动态的进行各个进程相关信息的录入,如CPUTIME、ALLTIME、STARTBLOCK、BLOCKTIME 等信息。并充分考虑了进程在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。由于抢占式调度算法与硬件密切相关,由软件实现非常困难,所以本程序实现的是非抢占式的动态优先权进程调度算法。抢占式的动态优先权进程调度算法的模拟实现有待于进一步研究。