caozuoxitong.docx
《caozuoxitong.docx》由会员分享,可在线阅读,更多相关《caozuoxitong.docx(47页珍藏版)》请在冰豆网上搜索。
caozuoxitong
华东交通大学软件学院
学生实验报告
课程名称
班级
姓名
学号
专业
指导教师
学期
实验项目名称
处理机调度实验
实验时间
班级
16道铁1班
姓名
乐荣强
学号
2016211002000108
【实验目的】
用高级语言实现一个进程调度程序,以加深对进程概念及进程调度算法的理解。
【实验原理】
先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。
每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。
如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。
在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。
设计一个按优先数调度算法实现处理器调度的程序
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。
进程控制块的格
式为:
其中,进程名----作为进程的标识,假设五个进程的进程名分别是P1,P2,P3,P4,P5。
指针----按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块
首地址,最后一个进程中的指针为“0”。
要求运行时间----假设进程需要运行的单位时间数。
优先数----赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态----可假设有两种状态,“就绪”状态和“结束“状态,五个进程的初始状态都为
“就绪“状态,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,
用“E”表示。
(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”
和“要求运行时间”。
(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列,用一单元指出队首
进程,用指针指出队列的连接情况。
(4)处理器调度总是选队首进程运行。
采用动态改变优先数的办法,进程每运行一次优
先数就减“1”。
由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的
启动运行,而是执行:
优先数-1
要求运行时间-1
来模拟进程的一次运行。
提醒注意的是:
在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,
它占有处理器运行,直到出现等待事件或运行结束。
在这里省去了这些工作。
【实验步骤】
#include
#include
#include
#include
usingnamespacestd;
typedefstruct
{
charname;
intArrivalTime;
intServiceTime;
intFinishedTime;
intWholeTime;
doubleWeightWholeTime;
}RR;
staticqueueRRqueue;
staticdoubleAverageWT=0,AverageWWT=0;
staticintq;
staticintn;
staticRRRRarray[100];
voidInput()
{
cout<<"请输入进程的数量n=";
cin>>n;
cout<<"请输入进程的时间片q=";
cin>>q;
if(q<0||q>9)
{
cout<<"错误!
";
}
exit
(1);
cout<<"请输入进程的进程名:
"<for(inti=0;i{
cin>>RRarray[i].name;
}
cout<<"请输入进程的到达时间:
"<for(i=0;i{
cin>>RRarray[i].ArrivalTime;
}
cout<<"请输入进程的服务时间:
"<for(i=0;i{
cin>>RRarray[i].ServiceTime;
}
cout<<"---------------------------------------------------------------------------"<//输出用户所输入的信息
cout<cout<cout<for(i=0;i{
cout<cout<cout<}
cout<<"---------------------------------------------------------------------------"<}
voidRRAlgorithm()
{
charprocessMoment[100];
RRqueue.push(RRarray[0]);
intprocessMomentPoint=0;
intCurrentTime=0;
inttempTime;
inti=1;
intfinalProcessNumber=0;
intprocessTime[50];
//CurrentTime的初始化
if(RRarray[0].ServiceTime>=q)
{
CurrentTime=q;
}
else
{
CurrentTime=RRarray[0].ServiceTime;
}
while(!
RRqueue.empty())
{
for(intj=i;j{
if(RRarray[j].name!
=NULL&&CurrentTime>=RRarray[j].ArrivalTime)
{
RRqueue.push(RRarray[j]);
i++;
}
}
if(RRqueue.front().ServiceTime{
tempTime=RRqueue.front().ServiceTime;
}
else
{
tempTime=q;
}
RRqueue.front().ServiceTime-=q;
processMoment[processMomentPoint]=RRqueue.front().name;
processMomentPoint++;
processTime[finalProcessNumber]=tempTime;
finalProcessNumber++;
if(RRqueue.front().ServiceTime<=0)
{
//RRqueue.front().FinishedTime=CurrentTime;
RRqueue.pop();
}
else
{
RRqueue.push(RRqueue.front());
RRqueue.pop();
}
CurrentTime+=tempTime;
}
cout<<"各进程的执行时刻信息:
"<cout<<""<<"0时刻到"<(2)<processTime[finalProcessNumber]=0;
inttime=processTime[0];
intcount=0;
for(i=0;i{
count=0;
cout<while(RRarray[count].name!
=processMoment[i]&&count{
count++;
}
RRarray[count].FinishedTime=time;
if(i{
cout<(2)<