《操作系统B》进程调度综合性实验报告.docx
- 文档编号:2569343
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:14
- 大小:117.62KB
《操作系统B》进程调度综合性实验报告.docx
《《操作系统B》进程调度综合性实验报告.docx》由会员分享,可在线阅读,更多相关《《操作系统B》进程调度综合性实验报告.docx(14页珍藏版)》请在冰点文库上搜索。
《操作系统B》进程调度综合性实验报告
计算机系综合性实验
实验报告
课程名称操作系统B
实验学期2010至2011学年第二学期
学生所在系部
年级专业班级
学生姓名学号
任课教师
实验成绩
计算机系制
《操作系统B》课程综合性实验报告
开课实验室:
2011年6月9日
实验题目
进程调度算法程序设计
一、实验目的
通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。
二、设备与环境
1.硬件设备:
PC机一台
2.软件环境:
安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C\C++\Java等编程语言环境。
三、实验内容
(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)分析程序运行的结果,谈一下自己的认识。
四、实验结果及分析
1.实验设计说明
动态优先权是指在创建进程时所赋予的优先权,是指可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
此程序可以对进程进行动态优先权调度,首先输入进程后,判断进程的优先权,优先权大的先执行,程序将其放入运行队列,而其他进程则位于就绪队列,当一个时间片结束后,上一个时间运行的进程优先权则减3,而位于就绪队列的进程优先权加1,而完成的队列优先权不改变,运行进程的ALLTIME减去1,CPUTIME加1。
当下一个时间片开始时,判断就绪队列中进程的优先权,优先权高者进入运行队列进行执行。
这样直到所有进程的ALLTIME减为0,即所以进程运行完毕,程序结束。
2.实验代码
#include"iostream.h"
#defineM10//最多可以运行的进度数
typedefstruct
{
intID;//进程ID
intPRIORITY;//进程优先级
intCPUTIME;//进程已占用cpu时间
intALLTIME;//还需占用的CPU时间
intSTARTBLOCK;//进程的阻塞时间
intBLOCKTIME;//进程被阻塞的时间
intSTATE;//进程状态
intREACH;//进程是否到达,0为到达
intTIME;//进程开始运行时间
}PROCESS;//进程控制块PCB
voidmain()
{
inti,l,l1,flag=0,server[M],time1,max;
inttime;//时间片长度
inttotal=0;//运行时刻
intN;//进程数目
intturn=0;//进程周转时间
intwturn=0;//进程平均周转时间
PROCESSpro[M];//定义进程控制块
cout< cout<<"程序中各个进程状态如下: "< cout<<"运行: 0阻塞: 1就绪: 2结束: 3未到达: 4"< cout<<"请输入进程数: "; cin>>N; cout<<"请设置时间片长度: "; cin>>time; cout<<"请输入各进程初始状态: "< cout<<"IDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIME"< //进程初始状态信息输入 for(i=0;i { pro[i].CPUTIME=0; pro[i].TIME=0; cin>>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH; cin>>pro[i].ALLTIME>>pro[i].STARTBLOCK>>pro[i].BLOCKTIME; server[i]=pro[i].ALLTIME;//服务时间设置 if(pro[i].REACH==0)//进程已经到达 pro[i].STATE=0;//初始状态下到达时即进入就绪队列 else pro[i].STATE=4;//初始状态下未到达 } do {//各个时间片时刻进程信息显示输出 cout< "< cout< cout<<"IDPRIORITYALLTIMESTARTBLOCKBLOCKTIMESTATE"< for(i=0;i { cout< cout< cout< } total+=time;//当前时刻自加时间片时间 for(i=0;i { if(pro[i].STATE==4&&pro[i].REACH //未到达或到达时间小于运行时间 pro[i].STATE=1; } for(i=0;i { time1=pro[i].ALLTIME; if(pro[i].STATE==0)//运行状态 { if(pro[i].ALLTIME<=time) { pro[i].ALLTIME=0; pro[i].STATE=3;//运行完即结束状态 pro[i].TIME=total-time+time1; } else { pro[i].ALLTIME-=time;//未运行完则所需的CPU时间减少 pro[i].STARTBLOCK--;//未运行完则阻塞时间减少一个时间片 if(pro[i].STARTBLOCK==0)//阻塞时间为0则进入阻塞队列 { pro[i].STATE=1; pro[i].BLOCKTIME=time1; pro[i].STARTBLOCK=time1; } pro[i].PRIORITY-=3;//优先数-3 pro[i].TIME=total; } } if(pro[i].STATE==1)//阻塞状态 { pro[i].BLOCKTIME--; if(pro[i].BLOCKTIME==0) pro[i].STATE=2; pro[i].TIME=total; } if(pro[i].STATE==2) { pro[i].PRIORITY++;//优先数加1 pro[i].TIME=total; } } max=-100; l1=-1; l=-1; for(i=0;i {//选择优先数最大的进程 if(pro[i].PRIORITY>max&&(pro[i].STATE==0||pro[i].STATE==2)) { l=i;//标记进入就绪队列的进程 max=pro[i].PRIORITY; } if(pro[i].STATE==0) l1=i;//进入就绪队列的进程用其标号标记 } if(l! =-1&&l! =l1) pro[l].STATE=0;//就绪状态 if(l1! =-1) pro[l1].STATE=2;//阻塞状态 //判断是否进程运行结束 flag=0; for(i=0;i { if(pro[i].STATE! =3)//未结束 { flag=1; break; } } if(flag==0) break; }while (1);//循环执行 cout< "< cout< cout<<"IDPRIORITYALLTIMESTARTBLOCKBLOCKTIMESTATE"< for(i=0;i { cout< cout< cout<<""< cout< } cout< "< cout<<"进程号到达时间结束时间周转时间带权周转时间"< for(i=0;i { cout<<""< cout< cout<<(float)(pro[i].TIME-pro[i].REACH)/server[i]< turn+=pro[i].TIME-pro[i].REACH;//计算进程周转时间 wturn+=(pro[i].TIME-pro[i].REACH)/server[i]; } cout<<"平均周转时间为: "<<(float)turn/N< cout<<"平均周转时间为: "<<(float)wturn/N< } 3.实验结果 (1)输入进程的初始状态 (2)各进程运行“动态优先权算法”的过程 (3)运用“动态优先权算法”运行各进程的结果: 4.实验结果分析 此程序可以对进程进行动态优先权调度,首先输入进程后,判断进程是否已到达,进程 (2)到达则进入就绪队列,然后判断进入就绪队列的进程的优先权,首先运行进程 (2),然后起ALLTIME减2,并且其优先权减3,;然后循环执行上述过程,若是继续执行上一过程的进程,则此进程优先数加1,而其他进入运行队列的进程的阻塞时间STARTBLOCK减1,当STARTBLOCK减为0时,此进程进入阻塞队列,而其优先数加1,如此循环下去。 就在例子中,当运行到27时,进程1结束运行,则其周转时间即为: 27-5(REACH)=22,所以其带全周转时间为: 22/7(ALLTIME)。 一次得出其他两个进程的周转及带权周转时间,并得出平均周转及带权周转时间,结果正确。 5.实验心得 本次综合实验,让我学到了很多东西。 加深了对所学的进程调度算法的理解,尤其是对“高优先权优先调度算法”中的“动态优先权调度算法”的理解。 在编码实现的过程中,也遇到了很多困难,对于动态优先权调度算法我已经基本掌握,但用编程语言实现起来却并不容易。 通过图书馆借阅书籍、问同学等方式都最终基本解决。 我觉得这样的综合实验很有必要,我们对于理论性知识的掌握,并不能代表我们的实践动手能力好,通过这次综合实验,我认识到了理论和实践的差距,在以后的学习中,应该更注重实践环节,才能真正的提高自己的能力。 对于以后的就业也是很有帮助的,为我们的以后找工作奠定基础。 通过对该算法程序的编程实现,也让我对C程序以及C++程序编程语言进行了更深入的学习,巩固了编程语言的知识点与技能,提高了自己的编程能力。 同时,我也发现了自己的很多不足,希望在以后的学习工作中,不断实践,不断地完善编程方法与编程技能的学习。 教师评价 评定项目 A B C D 评定项目 A B C D 算法正确 界面美观,布局合理 程序结构合理 操作熟练 语法、语义正确 解析完整 实验结果正确 文字流畅 报告规范 题解正确 其他: 评价教师签名: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统B 操作系统 进程 调度 综合性 实验 报告