OS课程设计模拟处理机调度算法MFC实现.docx

上传人:b****5 文档编号:5931599 上传时间:2023-01-02 格式:DOCX 页数:19 大小:191.95KB
下载 相关 举报
OS课程设计模拟处理机调度算法MFC实现.docx_第1页
第1页 / 共19页
OS课程设计模拟处理机调度算法MFC实现.docx_第2页
第2页 / 共19页
OS课程设计模拟处理机调度算法MFC实现.docx_第3页
第3页 / 共19页
OS课程设计模拟处理机调度算法MFC实现.docx_第4页
第4页 / 共19页
OS课程设计模拟处理机调度算法MFC实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

OS课程设计模拟处理机调度算法MFC实现.docx

《OS课程设计模拟处理机调度算法MFC实现.docx》由会员分享,可在线阅读,更多相关《OS课程设计模拟处理机调度算法MFC实现.docx(19页珍藏版)》请在冰豆网上搜索。

OS课程设计模拟处理机调度算法MFC实现.docx

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

《计算机操作系统》---汤子瀛

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1