操作系统实验5 进程调度模拟程序设计.docx
《操作系统实验5 进程调度模拟程序设计.docx》由会员分享,可在线阅读,更多相关《操作系统实验5 进程调度模拟程序设计.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验5进程调度模拟程序设计
实验报告书
课程名:
《操作系统原理实验》
题目:
实验5进程调度模拟实验
实验类别:
【设计】
班级:
学号:
姓名:
一、实验内容
进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)或者时间片轮转法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
等待I/O的时间以时间片为单位进行计算,可随机产生,也可事先指定。
每个进程的状态可以是就绪R(Ready)、运行R(Run)、等待(Wait)或完成F(Finish)四种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、等待进程以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
用C或C++
二、实验目的与要求
在采用多道程序设计的设计中的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器
本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度工作。
三、实验环境
Visual+C++6.0
四、实验步骤
1、实验准备知识
处理器调度总是选对首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本次实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:
优先数—1
要求运行时间—1
来模拟进程的一次运行。
进程运行一次后,若要求运行时间≠0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间≠0,则把它的状态修改成“结束”,且结束队列。
若“就绪”状态的进程队列不为空,则重复上面的步骤,直到所有都成为“结束”状态。
2、实验任务分析流程图
3、源程序
#include
#include
#include
#defineP_NUM3//进程数
#defineP_TIME1//时间片长度
#defineMIN-9999
enumstate//进程状态
{
ready,//就绪
run,//执行
wait,//阻塞
finish//完成
};
classPcb
{
public:
staticvoidprint(){};
~Pcb();
protected:
char*name;//进程名
intallTime;//需要运行时间
intcpuTime;//已用cpu时间
stateprocess;//进程状态
};
classHPcb:
publicPcb
{
public:
staticvoidprint();
staticvoidhighS();
staticintgetFirst();
private:
intfirstNum;
};
HPcbhpcb[P_NUM];
classFPcb:
publicPcb
{
public:
staticvoidprint();
staticvoidfcfs();
private:
intcomeTime;
};
FPcbfpcb[P_NUM];
intHPcb:
:
getFirst()//得到优先级最高的进程
{
intk=0;
for(inti=1;iif(hpcb[k].firstNumk=i;
returnk;
}
voidHPcb:
:
highS()//最高优先数优先的调度算法
{
intii,f,i=0;
for(;i{
char*ch;
ch=newchar[1];
cout<<"请输入第"<
"<//cout<<"请输入第"<
"<cin>>ch;
hpcb[i].name=newchar[strlen(ch)+1];
strcpy(hpcb[i].name,ch);
cin>>hpcb[i].firstNum>>hpcb[i].allTime;
hpcb[i].cpuTime=0;
hpcb[i].process=ready;
}
do
{
f=getFirst();
hpcb[f].cpuTime+=P_TIME;
hpcb[f].firstNum--;
hpcb[f].process=run;
if(hpcb[f].cpuTime>=hpcb[f].allTime)//该进程执行完成
{
hpcb[f].firstNum=MIN;
hpcb[f].process=finish;
hpcb[f].cpuTime=hpcb[f].allTime;//防止所用时间超过总的时间
system("cls");
print();
Sleep(1000);
}
else
{
hpcb[f].firstNum++;//为了输出改变前的相关信息
system("cls");
print();
Sleep(1000);
hpcb[f].firstNum--;
hpcb[f].process=ready;
}
for(ii=0;iiif(hpcb[ii].firstNum!
=MIN)
break;
}while(iicout<<"所有进程已运行完成!
"<}
Pcb:
:
~Pcb()
{
delete[]name;
}
voidHPcb:
:
print()
{
cout<<"*********************************************************************"<cout<<"进程名"<<"\t"<<"还需运行时间\t"<<"已用CPU时间"<<"\t"<<"优先级"<<"\t"<<"状态"<for(inti=0;i{
Cout<switch(hpcb[i].process)
{
casewait:
cout<<"阻塞态"<caseready:
cout<<"就绪态"<caserun:
cout<<"运行态"<casefinish:
cout<<"完成态"<}
}
cout<<"---------------------------------------------------------------------"<cout<}
voidFPcb:
:
print()
{
cout<<"*********************************************************************"<cout<<"进程名"<<"\t"<<"还需运行时间\t"<<"已用CPU时间"<<"\t"<<"状态"<for(inti=0;i{
cout<switch(fpcb[i].process)
{
casewait:
cout<<"阻塞态"<caseready:
cout<<"就绪态"<caserun:
cout<<"运行态"<casefinish:
cout<<"完成态"<}
}
cout<<"---------------------------------------------------------------------"<cout<}
intmain()
{
cout<<"最高优先数优先的调度算法\n"<HPcb:
:
highS();
return0;
}
五、结果分析与实验体会
实验结果:
程序运行后,开始运行优先数最高的进程3,3由就绪态变为运行态,此时1,2处于就绪态,3的优先数-1;3继续运行1次,3的优先数变为1,此时,进程1和3处于就绪态,2处于运行态;以此类推。
直到所有进程运行结束。
实验体会:
通过本次实验了解了载用多道程序设计的设计中的系统中,有若干个进程同时处于就绪状态时,通过设定程序的优先数来解决程序的运行顺序。
进一步了解了在单处理器情况下的处理器调度,加深对处理器调度工作的认识。