OS课程设计模拟处理机调度算法MFC实现.docx
《OS课程设计模拟处理机调度算法MFC实现.docx》由会员分享,可在线阅读,更多相关《OS课程设计模拟处理机调度算法MFC实现.docx(19页珍藏版)》请在冰豆网上搜索。
![OS课程设计模拟处理机调度算法MFC实现.docx](https://file1.bdocx.com/fileroot1/2023-1/1/b08c2c65-79e5-45b2-9532-e759f29abde6/b08c2c65-79e5-45b2-9532-e759f29abde61.gif)
OS课程设计模拟处理机调度算法MFC实现
课程设计报告
设计题目:
处理机调度算法模拟实现
班级:
学号:
姓名:
指导老师:
设计时间:
2012年八月
摘要
1、主要算法包括:
先来先服务、短作业优先、高优先权优先、基于时间片的轮转、多级反馈队列调度算法。
2、内容要求:
1)定义与算法相关的数据结构,如进程控制块(PCB),相关队列(队列要考虑实际应用,应采用类似于类的私有成员定义所用到的队列,并使用公有函数提供对类的操作);
2)所设计的系统中至少需要实现三种以上调度算法,且必须包含多级反馈队列调度算法;
3)提供用户选择功能,用户可以根据需要选择采用何种调度算法;
4)算法执行结构之后,应该给出周转时间和平均周转时间。
本系统模拟操作系统处理机调度算法的实现,实现了先来先服务、短作业优先、
基于时间片的轮转、多级反馈队列调度算法四种调度算法的模拟实现,可以根据需要自行选择合适的调度算法,进程用PCB来控制,队列由PCB相链接而成,分为就绪队列,阻塞队列,完成队列。
进程在在运行时可以随时挂起暂停进程执行,待条件满足后,继续恢复运行,进程在运行的时候优先权是不断的变化的,
运行的时间越长,优先级会相应减小。
关键词:
先来先服务,短作业优先,高优先权优先,基于时间片的轮转,
多级反馈队列调度算法。
目录
1.概述……………………….4
2.课程设计任务及要求
2.1设计任务………………………..4
2.2设计要求………………………..4
3.算法及数据结构
3.1算法的总体思想(流程)………………………5
3.2PCB模块
3.2.1功能(运算)……………………….5
3.2.2数据结构(存储结构)……………………….5
3.2.3算法(实现)……………………….5
3.3进程队列模块
3.3.1功能………………………6
3.3.2数据结构………………………6
3.3.3算法………………………6
4.程序设计与实现
4.1程序流程图……………………..7
4.2程序说明(代码)
4.3实验结果……………………..10
5.结论……………………..11
6.参考文献。
……………………..11
7.收获、体会和建议。
……………………..11
一:
概述
定义与算法相关的数据结构,模拟操作系统处理机调度算法的实现,至少实现3种以上算法,且必须包含多级反馈队列调度算法;提供用户选择功能,用户可以根据需要选择采用何种调度算法;算法执行结构之后,应该给出周转时间和平均周转时间。
二:
课程设计任务及要求
设计任务:
使用VisualC++模拟实现处理机调度算法,实现先来先服务、短作业优先、基于时间片的轮转、多级反馈队列调度算法。
设计要求:
所设计的系统中至少需要实现三种以上调度算法,且必须包含多级反馈队列调度算法;提供用户选择功能,用户可以根据需要选择采用何种调度算法;
算法执行结构之后,应该给出周转时间和平均周转时间。
三:
算法及数据结构
进程控制块数据结构和相应的操作。
classPCB
{
public:
PCB(void);
PCB(PCB&);
voidCreat(CString,int);
~PCB(void);
voidUpdate();//剩余时间与运行时间更新
CStringShowPro();//返回进程信息
boolIsEnd();//判断进行是否执行完成
voidDispose();//锁定进程
boolIsLocked();//判断进程是否锁住
voidTerminal();//强制终止进程函数
intGetServiceT();//获得需要服务时间
floatGetPrio();//返回进程优先级
CStringGetCurTime();//返回当前系统时间
CStringGetName();//获取进程名称
voidUpdateGoneTime();//更新进程周转时间
intGetGoneTime();//返回进程周转时间
intGetRuningTime();//返回进程运行时间
private:
CStringName;//进程名称
CStringStart;//创建时间
intServiceT;//需要服务时间
intRunningT;//已运行时间
intRemainT;//剩余时间
intGoneTime;//消逝时间||周转时间
intID;//进程标识符
CStringReadyTime;//进程成为就绪进程的时间
floatprio;//进程优先权
intLocked;//进程锁
staticintcount;//计数
};
#include"StdAfx.h"
#include"PCB.h"
intPCB:
:
count=0;
PCB:
:
PCB(void)
{
RemainT=0;//标志对象初始化时没有值,相当于为空!
Locked=1;
GoneTime=0;
}
PCB:
:
PCB(PCB&data)
{
Name=data.Name;
Start=data.Start;
ServiceT=data.ServiceT;
RunningT=data.RunningT;
RemainT=data.RemainT;
ID=data.ID;
ReadyTime=data.ReadyTime;
prio=data.prio;
GoneTime=data.GoneTime;
Locked=0;//解锁
}
PCB:
:
~PCB(void)
{
}
CStringPCB:
:
GetName()
{
returnName;
}
CStringPCB:
:
GetCurTime()
{
if(Locked==1)
{
return"";
}
//(CTime:
:
GetCurrentTime()).Format("%H:
%M:
%S")
SYSTEMTIMETM;
:
:
GetSystemTime(&TM);
CStringtmp;
tmp.Format("%d:
%d:
%d"
(8+TM.wHour)%24,TM.wMinute,TM.wSecond);
returntmp;
}
intPCB:
:
GetServiceT()
{
returnServiceT;
}
floatPCB:
:
GetPrio()
{
returnprio;
}
voidPCB:
:
Creat(CStringname,intneedtime)
{
Locked=0;//默认为锁定Locked==1,创建需解锁!
Name=name;
Start=GetCurTime();
ServiceT=needtime;
RunningT=0;
RemainT=needtime;
ID=count;
count++;
if(count>100)
{
count=0;
}
ReadyTime=GetCurTime();
GoneTime=0;
prio=(float)RemainT/ServiceT;
}
voidPCB:
:
UpdateGoneTime()
{
if(Locked==1)
{
return;
}
GoneTime++;
}
voidPCB:
:
Update()
{
if(Locked==1)
{
return;
}
RunningT++;
if(RemainT>0)
{
RemainT--;
}
prio=(float)RemainT/ServiceT;
}
voidPCB:
:
Dispose()
{
Locked=1;
}
CStringPCB:
:
ShowPro()
{
if(Locked==1)
{
return"";
}
CStringtmp;
tmp.Format("进程名:
%s,进程ID:
%d,创建时间:
%s,需要时间:
%d,已运行时间:
%d,剩余时间:
%d,优先权:
%f",Name,ID,ReadyTime,ServiceT,RunningT,RemainT,prio);
returntmp;
}
boolPCB:
:
IsEnd()
{
if(RemainT<=0)
{
returntrue;
}
else
{
returnfalse;
}
}
boolPCB:
:
IsLocked()
{
if(Locked==1)
returntrue;
else
returnfalse;
}
voidPCB:
:
Terminal()
{
RemainT=0;
}
intPCB:
:
GetGoneTime()
{
returnGoneTime;
}
intPCB:
:
GetRuningTime()
{
returnRunningT;
}
进程队列的数据结构
structNode
{
PCBData;
Node*next;
};
classQueue
{
public:
Queue();
~Queue();
boolIsEmpty();//判断队列是否为空
voidEnqueue(PCB);//进程入队
voidDequeue();//进程出队
intGetLength();//获取队列进程数
CStringPrint();//遍历进程信息
voidUpdate();//进程时间更新
voidUpdateGoneTime();//更新队列中进程周转时间
PCBGetFirst();//获取队列中第一个进程
voidLeastFirst();//按进程服务时间排序队列voidClear();//队列删除
CStringGetGoneTime();//返回进程周转时间
Node*GetFirstPtr();//获取队列头指针
private:
Node*first;
};
#include"StdAfx.h"
#include"Queue.h"
Queue:
:
Queue()
{
first=newNode;
first->next=NULL;
}
Queue:
:
~Queue()
{
}
//template
boolQueue:
:
IsEmpty()
{
if(first->next==NULL)
returntrue;
else
returnfalse;
}
//template
voidQueue:
:
Enqueue(PCBdata)
{
Node*s=newNode;
s->Data=data;
Node*p;//workPtr
p=first;
while(p->next)
{
p=p->next;
}
p->next=s;
s->next=NULL;
}
//template
voidQueue:
:
Dequeue()
{
first->next=first->next->next;
}
intQueue:
:
GetLength()
{
intcount=0;
Node*p=first->next;
while(p)
{
count++;
p=p->next;
}
returncount;
}
CStringQueue:
:
Print()
{
Node*p=first;
intn=GetLength();
CStringtmp="";
for(inti=0;i{
tmp+=p->next->Data.ShowPro();
tmp+="\r\n";
p=p->next;
}
returntmp;
}
PCBQueue:
:
GetFirst()
{
PCBtmp=first->next->Data;
Dequeue();
returntmp;
}
voidQueue:
:
Update()
{
Node*p=first->next;
while(p)
{
p->Data.Update();
p=p->next;
}
}
voidQueue:
:
UpdateGoneTime()
{
Node*p=first->next;
while(p)
{
p->Data.UpdateGoneTime();
p=p->next;
}
}
voidQueue:
:
LeastFirst()
{
Node*p=NULL;
Node*q=NULL;
if(first->next==NULL)
{
return;
}
for(p=first->next;p->next;p=p->next)
for(q=p->next;q;q=q->next)
{
if(p->Data.GetServiceT()>q->Data.GetServiceT())
{
PCBtmp;
tmp=p->Data;
p->Data=q->Data;
q->Data=tmp;
}
}
}
voidQueue:
:
HighPrio()
{
Node*p=NULL;
Node*q=NULL;
for(p=first->next;p->next;p=p->next)
for(q=p->next;q;q=q->next)
{
if(p->Data.GetPrio()>q->Data.GetPrio())
{
PCBtmp;
tmp=p->Data;
p->Data=q->Data;
q->Data=tmp;
}
}
}
voidQueue:
:
Clear()
{
while(first->next!
=NULL)
{
Node*tmp=first->next;
first->next=tmp->next;
deletetmp;
}
}
CStringQueue:
:
GetGoneTime()
{
CStringtmp;
CStringRet;
Node*p=first->next;
inttime=0;
while(p)
{
tmp.Format("进程名:
%s,周转时间:
%d\r\n",p->Data.GetName(),p->Data.GetGoneTime());
time+=p->Data.GetGoneTime();
Ret+=tmp;
p=p->next;
}
tmp.Format("平均周转时间:
%.2f",(float)(time/GetLength()));
Ret+=tmp;
returnRet;
}
Node*Queue:
:
GetFirstPtr()
{
returnfirst;
}
四:
程序设计与实现。
流程图
实验结果:
五:
收获,体会和建议
本次课程设计让我更加深刻的理解了操作系统的处理机调度算法,对进程间的调度有了较为深刻的看法,加强了对教材的理解,并且帮助自己复习了MFC的有关知识,对C++也能更加熟练的使用。
本次实验让我自己再次认识到动手实验的重要性,理论研究的再透彻,也必须通过实践来引导,只有不断动手做实验,才能加强对程序设计的理解,多动手才能积累经验,平时遇到的错误耐心查找资料一个个解决,下一次再遇到时能够轻松解决,在以后的学习过程中,一定要加强自己的动手能力,充分利用自己手头的资源,养成多动手写代码的好习惯。
六:
参考资料和书籍。
《MFC程序设计》-----JeffProsise
《操作系统》-----AchyutGodbole
《计算机操作系统》---汤子瀛