《操作系统B》进程调度综合性实验报告.docx
《《操作系统B》进程调度综合性实验报告.docx》由会员分享,可在线阅读,更多相关《《操作系统B》进程调度综合性实验报告.docx(14页珍藏版)》请在冰点文库上搜索。
![《操作系统B》进程调度综合性实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/35524fcb-c937-4b15-8813-25d372fff1d6/35524fcb-c937-4b15-8813-25d372fff1d61.gif)
《操作系统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
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法、语义正确
解析完整
实验结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日