操作系统课设进程调度模拟程序.docx
《操作系统课设进程调度模拟程序.docx》由会员分享,可在线阅读,更多相关《操作系统课设进程调度模拟程序.docx(27页珍藏版)》请在冰豆网上搜索。
操作系统课设进程调度模拟程序
沈阳理工大学课程设计专用纸
Noi
进程调度模拟程序1i
II
1.设计目的及要求1:
I
I
2.概要设计11
II
3.算法流程图2:
I
I
四•源程序及注释6:
I
I
五.运行结果及分析16:
I
I
六•课程设计总结19;
I
I
七.参考文献19;
沈阳理T•人学
进程调度模拟程序:
I
I
I
I
I
1.设计目的及要求i
I
I
I
I
I
编写一个进用调度程序,允许多个进用并行执行。
木次设计将采用三种筛法实现进觀:
I
的行执行.分别是杲岛优先数优先的调度算法(即把处理机分配给优先数垠岛的进秤):
I
.先来先服务算法.按时间片轮转调度算法。
:
Ia
I
I
I
2.概要设计1
I
Ia
Ia
(D每个进程令•个进序控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、:
I
优先数、到达时间、需要运行时间、己用CPU时间、进程状态。
:
2进粹的优先数及需要的运行时间可以事先人为地指定(也可以由181机数产生)。
进程;
的到达时间为输入进稈的时间。
进程的运行时间以时间片为单位进行计算。
;
3每个进程的状态可以是就绪w(Wait).运行R(Run)、或完成F(Finish)三种状[
态之一。
:
I
4建立一个pcbobjf]的数细来存放讲秤队列。
:
建立一个类pcbobj存放进程的备种信息并对这些信息的操作。
:
建立一个类wait_manager来对就绪进程进行管理。
:
I建立一个类cpu.manager来对运行的进聊进行管理。
:
沈阳理T•人学
沈阳理工大学课程设计专用纸
No2
三.算法流程图
图1一1上程序流程图
沈阳理T•人学
沈阳理工大学课程设计专用纸
No?
图1一2FCFS算法流程图
沈阳理T•人学
沈阳理工大学课程设计专用纸
No4
图1一3RR算法流用图
沈阳理T•人学
沈阳理工大学课程设计专用纸
No5
图1一4HPF算法流卅图
沈阳理T•人学
沈阳理工大学课程设计专用纸
Nob
四.源程序及注
Tr
pcbobj.h
#include
usingnamespacestd;
#ifndefPCBOBJ_H_
#definePCBOBJ_H_
enumpStaUis{Wait,Run,Finish,UNGO}"/定义进程的四种状态
classPCBobj{
public:
PCBobj();
PCBobj(stringnamejntidjntreachjntexecute);
virtual-PCBobjO;
intgetExecTime()const;
intge(HasExecTime()const;
intgetld()const;
intgetReachTinie()const;
siringgetName()const;
pStalusgetStatus()const;
voidsetHasExecTime(inthasExecTime);
voidsetld(intpld);
voidsetStatus(pStatusstatus);
voidsetExecTime(intexecTime);
voidsetName(stringpName);
voidsetReachTime(intreachTime);
boolisFinish();〃进程是否运行完毕
boollast_statu;//^l]断进程上一个cpu是否是运行态
private:
stringpName;〃进丹名
in(pld;〃进秤优先数
intreachTime;〃进軒•到达时间
intexecTime;〃进杆1•需要运彳j:
的时间
inihasExecTime;//进程lL经运彳J:
的时间
pStalusstatus;
};
typedefPCBobj*pcbobj;
#endif/*PCBOBJ_H_*/
pcbobj.cpp代码include”PCBobj.h”
PCBobj:
:
PCBobj(){
hasExecTime=O;
沈阳理「•人学
status=UNGO;
last_statu=false;
)
PCBobj:
:
PCBobj(stringnamejntidjntreachjntexecute)!
pName=name;
pld=id;
reachTime=reach;
execTime=execuie;
hasExecTime=O;status=UNGO:
}
PCBobj:
:
-PCBobj(){}
intPCBobj:
:
getExecTime()const{
returnexecTime;
)
intPCBobj:
:
getHasExecTime()const{returnhasExecTime;
}
intPCBobj:
:
ge(Id()const{
returnpld;
}
stringPCBobj:
:
gelName()const{
returnpName;
I
intPCBobj:
getReachTime()const{
returnreachTime;
)
pStatusPCBobj:
:
getStatus()const{
returnstatus;
)
voidPCBobj:
:
setHasExecTime(inthasExecTime){this->hasExecTime=hasExecTime;
)
voidPCBobj:
:
setId(intpld){this->pld=pld;
}
voidPCBobj:
:
setStatus(pStatusstatus)!
this->status=status;
)
voidPCBobj:
:
setExecTime(intexecTime){this->execTime=execTime;
I
沈阳理T•人学
voidPCBobj:
:
setName(stringpName){lhis->pName=pName;
voidPCBobj:
:
setReachTime(intreachTime){this->reachTime=reachTime;
)
boolPCBobj:
:
isFinish(){
boolFlag=false;if(execTime==hasExecTime){slatus=Finish;
Flag=true;
}
returnFlag;
}
waitmanager.h#include
#include
#includeHPCBobj.hM
#ifndefWAITMANAGER.H.
#defineWAITMANAGER_H_
classWaitManager{
public:
WaitManager();virtual-WaitManager();voidadd(pcbobjnew_obj);voidinsert(pcbobjnew_name);voidremove(stringname);voidremove();
boolemptyO;
pcbobjget();
pcbobjlast();
private:
listwait.PCBJist;
);
#endif/*WAITMANAGER.H.♦/
waitmanager.cpp-#includeHWaitManager.hH
WaitManager:
:
WaitManager(){}WaitMana2er:
>WaitManager(){}voidWaitManager:
:
add(pcbobjnew_obj){
wait_PCB」ist.push_back(new_obj);new_obj->setStatus(Wait);
I
boolWaitManager:
:
en】ply(){
沈阳理T•人学
returnwait_PCB」is(・cmply();
voidWaitManager:
:
insert(pcbobjnew_obj){
if(wail_PCBJist.emptyO)
{
add(new_obj);
}else{
boolinsertJnfo=false;//t*t看是古己经插入进去
for(Iist:
:
iteratorit=waitJPCB_list.begin();it!
=waitJPCBJist.end();it++){
if(new_obj->getld()>(*it)->getld()){
wait_PCBJist.insert(it,new_obj);
ncw^obj・>sc(SkHus(Wait);
insert」nfo=l「ue;
break;
}
}
if(!
insert」nfo){
wait_PCBJist.push_back(new_obj);
new_obj->setStatus(Wait);
voidWaitManager:
:
remove(stringname){
if(empty()){
coutvv”没有进程在就绪队列屮”vvendl;
}else
{
boolremovefo=false;
for(list:
:
iteratorit=wait_PCBJist.begin();it!
=wait_PCBJist.end();it++){if((*it)->getName()==name){
wail_PCBJist.erase(it);
remove_info=tme;
break;
}
}
if(!
removejnfo){
cout«name«H进程《不存在H«endl;
}
}
}
voidWaitManager:
:
remove(){
if(empty()){
coutvv”没有就绪进程在队列+M«endl;
沈阳理T•人学
}else
wait_PCBJist.pop_front();
)
)
pcbobjWaitManager:
:
get(){
returnwait_PCBJist.front();
)
pcbobjWaitManager:
:
last(){
returnwait.PCBJist.back();
}
pumanagcr.h-
#includePCBobj.hn
#ifndefCPU_MANAGER
#defineCPU_MANAGER_H_
enumcpu.Status{FREE.BUSY}^/cpu的状态classcpu_Manager{
public:
cpu_Manager();
virtual~cpu_Manager();
voidremove();
cpu^StatusgetCpuJnfo()const;
pcbobjgetCpu_pcb()const;
voidadd(pcbobjcpu_pcb);
voidupdate();
voidupdate(intargs);
intcpu_timeslice;
private:
cpu.Statuscpujnfo;
pcbobjcpu_pcb;
};
#endif/*CPU_MANAGER_H_*/
cpumanager.cpp-#includencpu_Manager.hH
cpu_Manager:
:
cpu_Manager(){
cpu_pcb=();
cpu_info=FREE;
cpu_timeslice=4;
)
cpu_Manager:
>cpu_Manager(){
cpu_pcb=O;
I
cpu_Statuscpu_Manager:
:
getCpu_info()const{
沈阳理T•人学
returncpujnfo;
pcbobjcpu^Manager:
:
getCpu_pcb()const{returncpu_pcb;
)
voidcpu_Manager:
:
add(pcbobjcpu_pcbl){cpu_pcb=cpu_pcbI;cpuJnfo=BUSY;
voidcpu_Manager:
:
remove(){this->cpu_pcb=O;cpu_info=FREE;
voidcpu_Manager:
:
update(){cpu_pcb->setStatus(Run);cpu_pcb->setHasExecTime(
cpu_pcb->getHasExecTime()+l);
voidcpu_Manager:
:
update(intargs){
update();cpu_pcb->setld(cpu_pcb->getld()-args);
)
scheduLsimulate.h
#include"WaitManager.h0
#includeHcpu_Manager.hH
#ifndefSCHEDUL_SIMULATE_H_
#defineSCHEDUL_SIMULATE_H_
voidchoice();
stringconvert_statu(pStatusstatu);
voidprocess_init(pcbobjprocess);
voidprocess_update(pcbobjprocessjnttime_record,WaitManager&wait_manager);voidprocess_update」d(pcbobjprocessJnttime_record,WaitManager&wait_manager);
//——打印进程信息
voidprocess_record(pcbobjprocessJnttime.record);
//从wait至ljrunvoidwaitTOrun(WaitManager&wait_manager,cpu_Manager&cpu_manager);
voidrunTOwail(WaitManager&wait_manager,cpu_Manager&cpu_nianager);
voidFCFS(pcbobjprocess);
voidRR(pcbobjprocess);
voidHPF(pcbobjprocess);
#endif/*SCHEDUL_SIMULATE_H_♦/
scheduLsimulate.cpp
#incIudeHscheduLsimulate.hH
voidchoice(){
沈阳理T•人学
沈阳理工大学课程设计专用纸
NoI2
cout«nl:
FCFSn«endI;
cout«n2:
RRH«endl;
cout«n3:
HPF,,«endl;
cou(v<”4:
quir‘vvendl;
)
stringconvert_statu(pStatusstatu){
stringvalue=f,UNGOH;
switch(statu){
caseWait:
value=”Wait”;
break;
caseRun:
value="Run";
break;
caseFinish:
value="Finish";
break;
caseUNGO:
value="UNGO”;
)
returnvalue;
)
voidprocess.init(pcbobjprocess){
stringname;
intprocess.id;
intprocess^reach;
intprocess_execute;
cout«"请按顺序输入进程的唯一标识…进程名进程的优先级进程的到达时间进程的运行时间"«endl;
for(inti=0;i<4;i++){
//process里的hasExecTime和status己经被初始化
cout«"请输入第"vv(i+1)«"个进程的信息"«endl;
cin»name;
cin»processjd;
cin»process^reach;
cin»pr(Kess_execute;
(process+i)->setName(name);
(process+i)->setId(process.id);
(process+i)->setReachTime(process_reach);
(process+i)->setExecTime(process_execute);
cout«”第”«(i+1)«”个进稈信息已经初始化,,«endl:
cout«"所有进程信息已经全部完成«endl;
沈阳理T•人学
沈阳理工大学课程设计专用纸
NoI3
voidprocess_update(pcbobjprocess,inttime_record,WaitManager&wait_manager){for(inti=0;i<4;i++){
if((process+i)->getReachTime()==time_record){wait_manager.add((process+i))y/H接加到末尾
}
}
}
voidprocess_update.id(pcbobjprocess,inttime_record,WaitManager&wait_manager){
for(inti=0;i<4;i++){
if((process+i)->getReachTime()==time.record){
waiLmanager.insert((process+i));
voidprocess_record(pcbobjprocess,inttime_record)
{
cout«"时亥ij:
"«time_record«endl;
cout«”进程名\l优先数\t到达时间\(运行时间\t已经运行时间\t状态"«endl;cout«••H
«endl;
for(inti=0;iv4;i++){
cout«(process+i)->getName()«M\tH
«(process+i)->getld()«H\tH
«(process+i)->getReachTime()«°\tH
«(process+i)->getExecTime()«H\tH
«(process+i)->getHasExecTime()«M\t\tn;
if((process+i)->Iast_statu)
cout«convert_statu(Run)«endl;
else
cout«convert_statu((process+i)->getStatus())«endl;(process+i)->lascsta(u=false;
)
cout«•'''
«endl;
)
voidwaitTOrun(WaitManager&wait_manager,cpu_Manager&cpu.manager){cpu_manager・add(wait_manager.get());
wait_manager.remove();
I
沈阳理T•人学
voidrunTOwait(WaitManager&wait_manager,cpu_Manager&cpu_manager){pcbobj(emp=cpu_managc「・gelCpu_pcb();
temp->last_statu=true;
wait_manager.add(temp);
)
voidFCFS(pcbobjprocess){
inttimc_record=0;
PCBobj*process_last=process+3;
WaitManagerwait_manager;
cpu^Managercpumanager;
while(processJast->getStatus()!
=Finish){process_update(process,time_record,wait_manager);proccss_rccord(proccss,timc_rccord);
if(!
wait_manager.empty()&&cpumanager.getCpu_info()==FREE){waitTOrun(wait_manager,cpumanager);
)
if(cpumanager.getCpufo()==BUSY){
cpumanager.update();
if(cpumanager.getCpu_pcb()->isFinish())cpumanager.removeO;
}
time_record++;
if(process_last->getStatus()!
=UNGO&&!
wait_manager.empty())//L2经到达{process.last=wait.manager.Iast();
}
I
process_record(process,time_record);
)
voidRR(pcbobjprocess){
inttime_record=0;
PCBobj*process_last=process+3;
WaitManagerwait_manager;
cpu_Managercpumanager;
intk=();//记录时间片满则为零
while(processJast->getStatus()!
=Finish){
process_update(process,time_record,wait_manager);process_record(processJime_record);
if(!
wait_manager.empty()&&cpumanager.getCpu」nfo()==FREE){waitTOrun(wait_manager,cpumanager);
}
if(cpumanager.getCpufo()==BUSY){
cpunianager.