1、操作系统B进程调度综合性实验报告计算机系综合性实验实 验 报 告 课程名称 操作系统B 实验学期 2010 至 2011 学年 第 二 学期学生所在系部 年级 专业班级 学生姓名 学号 任课教师 实验成绩 计算机系制操作系统B课程综合性实验报告 开课实验室: 2011年 6 月9日实验题目进程调度算法程序设计一、实验目的通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C C+Java 等编程语言环境。三、实验
2、内容(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段: 进程标识数ID。 进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 进程已占用CPU时间CPUTIME。 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进
3、程状态STATE。 队列指针NEXT,用来将PCB排成队列。(3)优先数改变的原则: 进程在就绪队列中呆一个时间片,优先数增加1。 进程每运行一个时间片,优先数减3。(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。(5)分析程序运行的结果,谈一下自己的认识。四、实验结果及分析1.实验设计说明动态优先权是指在创建进程时所赋予的优先权,是指可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。此程序可以对进程进行动态优先权调度,首先输入进程后,判断进程的优先权,优先权大的先执行,程序将
4、其放入运行队列,而其他进程则位于就绪队列,当一个时间片结束后,上一个时间运行的进程优先权则减3,而位于就绪队列的进程优先权加1,而完成的队列优先权不改变,运行进程的ALLTIME减去1,CPUTIME加1。当下一个时间片开始时,判断就绪队列中进程的优先权,优先权高者进入运行队列进行执行。这样直到所有进程的ALLTIME减为0,即所以进程运行完毕,程序结束。2.实验代码#include iostream.h#define M 10 /最多可以运行的进度数typedef struct int ID; /进程ID int PRIORITY; /进程优先级 int CPUTIME; /进程已占用cpu
5、时间 int ALLTIME; /还需占用的CPU时间 int STARTBLOCK; /进程的阻塞时间 int BLOCKTIME; /进程被阻塞的时间 int STATE; /进程状态 int REACH; /进程是否到达,0为到达 int TIME; /进程开始运行时间 PROCESS;/进程控制块PCBvoid main() int i,l,l1,flag=0,serverM,time1,max; int time; /时间片长度 int total=0; /运行时刻 int N; /进程数目 int turn=0; /进程周转时间 int wturn=0; /进程平均周转时间 PRO
6、CESS proM; /定义进程控制块 coutendlt欢迎使用“动态优先权调度算法”endlendl; cout程序中各个进程状态如下:endl; cout运行:0 阻塞:1 就绪:2 结束:3 未到达:4endl; coutN; couttime; cout请输入各进程初始状态:endl; coutID PRIORITY REACH ALLTIME STARTBLOCK BLOCKTIMEendl; /进程初始状态信息输入 for(i=0;iproi.IDproi.PRIORITYproi.REACH; cinproi.ALLTIMEproi.STARTBLOCKproi.BLOCKTI
7、ME; serveri=proi.ALLTIME; /服务时间设置 if(proi.REACH=0) /进程已经到达 proi.STATE=0; /初始状态下到达时即进入就绪队列 else proi.STATE=4; /初始状态下未到达 do /各个时间片时刻进程信息显示输出 coutendl当前时刻为:total; coutendl=各进程状态为=endl; coutID PRIORITY ALLTIME STARTBLOCK BLOCKTIME STATEendl; for(i=0;iN;i+) coutproi.ID proi.PRIORITY ; coutproi.ALLTIME pr
8、oi.STARTBLOCK ; coutproi.BLOCKTIME proi.STATEendl; 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.ALLTIME=0; proi.STATE=3; /运行完 即结束状态 proi.TIME=total-time+
9、time1; else proi.ALLTIME-=time; /未运行完则所需的CPU时间减少 proi.STARTBLOCK-; /未运行完则阻塞时间减少一个时间片 if(proi.STARTBLOCK=0) /阻塞时间为0则进入阻塞队列 proi.STATE=1; proi.BLOCKTIME=time1; proi.STARTBLOCK=time1; proi.PRIORITY-=3; /优先数-3 proi.TIME=total; if(proi.STATE=1) /阻塞状态 proi.BLOCKTIME-; if(proi.BLOCKTIME=0) proi.STATE=2; pr
10、oi.TIME=total; if(proi.STATE=2) proi.PRIORITY+; /优先数加1 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;
11、for(i=0;iN;i+) if(proi.STATE!=3) /未结束 flag=1; break; if(flag=0) break; while(1);/循环执行 coutendl当前时刻:total; coutendl=各进程状态为=endl; coutID PRIORITY ALLTIME STARTBLOCK BLOCKTIME STATEendl; for(i=0;iN;i+) coutproi.ID proi.PRIORITY ; coutproi.ALLTIME proi.STARTBLOCK; cout proi.BLOCKTIME proi.STATE; coutend
12、l; coutendl各进程运行结束!endlendl; cout进程号 到达时间 结束时间 周转时间 带权周转时间endl; for(i=0;iN;i+) cout proi.ID proi.REACH ; coutproi.TIME proi.TIME-proi.REACH ; cout(float)(proi.TIME-proi.REACH)/serveriendl; turn+=proi.TIME-proi.REACH; /计算进程周转时间 wturn+=(proi.TIME-proi.REACH)/serveri; cout平均周转时间为:(float)turn/Nendl; cou
13、t平均周转时间为:(float)wturn/Nendl;3.实验结果(1)输入进程的初始状态(2)各进程运行“动态优先权算法”的过程 (3)运用“动态优先权算法”运行各进程的结果:4.实验结果分析 此程序可以对进程进行动态优先权调度,首先输入进程后,判断进程是否已到达,进程(2)到达则进入就绪队列,然后判断进入就绪队列的进程的优先权,首先运行进程(2),然后起ALLTIME减2,并且其优先权减3,;然后循环执行上述过程,若是继续执行上一过程的进程,则此进程优先数加1,而其他进入运行队列的进程的阻塞时间STARTBLOCK减1,当STARTBLOCK减为0时,此进程进入阻塞队列,而其优先数加1,
14、如此循环下去。 就在例子中,当运行到27时,进程1结束运行,则其周转时间即为:27-5(REACH)=22,所以其带全周转时间为:22/7(ALLTIME)。一次得出其他两个进程的周转及带权周转时间,并得出平均周转及带权周转时间,结果正确。5.实验心得本次综合实验,让我学到了很多东西。加深了对所学的进程调度算法的理解,尤其是对“高优先权优先调度算法”中的“动态优先权调度算法”的理解。在编码实现的过程中,也遇到了很多困难,对于动态优先权调度算法我已经基本掌握,但用编程语言实现起来却并不容易。通过图书馆借阅书籍、问同学等方式都最终基本解决。我觉得这样的综合实验很有必要,我们对于理论性知识的掌握,并
15、不能代表我们的实践动手能力好,通过这次综合实验,我认识到了理论和实践的差距,在以后的学习中,应该更注重实践环节,才能真正的提高自己的能力。对于以后的就业也是很有帮助的,为我们的以后找工作奠定基础。通过对该算法程序的编程实现,也让我对C程序以及C+程序编程语言进行了更深入的学习,巩固了编程语言的知识点与技能,提高了自己的编程能力。同时,我也发现了自己的很多不足,希望在以后的学习工作中,不断实践,不断地完善编程方法与编程技能的学习。教 师 评 价评定项目ABCD评定项目ABCD算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告规范题解正确其他:评价教师签名:年 月 日
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2