1、OS课程设计模拟处理机调度算法MFC实现课程设计报告 设计题目:处理机调度算法模拟实现 班级 : 学号: 姓名: 指导老师: 设计时间: 2012年八月摘要1、主要算法包括:先来先服务、短作业优先、高优先权优先、基于时间片的轮转、多级反馈队列调度算法。2、内容要求:1)定义与算法相关的数据结构,如进程控制块(PCB),相关队列(队列要考虑实际应用,应采用类似于类的私有成员定义所用到的队列,并使用公有函数提供对类的操作);2)所设计的系统中至少需要实现三种以上调度算法,且必须包含多级反馈队列调度算法;3)提供用户选择功能,用户可以根据需要选择采用何种调度算法;4)算法执行结构之后,应该给出周转时
2、间和平均周转时间。本系统模拟操作系统处理机调度算法的实现,实现了先来先服务、短作业优先、基于时间片的轮转、多级反馈队列调度算法四种调度算法的模拟实现,可以根据需要自行选择合适的调度算法,进程用PCB来控制,队列由PCB相链接而成,分为就绪队列,阻塞队列,完成队列。进程在在运行时可以随时挂起暂停进程执行,待条件满足后,继续恢复运行,进程在运行的时候优先权是不断的变化的,运行的时间越长,优先级会相应减小。关键词:先来先服务,短作业优先,高优先权优先,基于时间片的轮转,多级反馈队列调度算法。目录1.概述 .42.课程设计任务及要求 2.1 设计任务 .4 2.2 设计要求 .43.算法及数据结构 3
3、.1算法的总体思想(流程) 5 3.2 PCB模块 3.2.1功能(运算) .53.2.2数据结构(存储结构) .53.2.3算法(实现) .5 3.3 进程队列模块3.3.1功能 63.3.2数据结构 63.3.3算法 64.程序设计与实现 4.1 程序流程图 .7 4.2 程序说明(代码) 4.3实验结果 .105.结论 .116.参考文献。 .117.收获、体会和建议。 .11一:概述定义与算法相关的数据结构,模拟操作系统处理机调度算法的实现,至少实现3种以上算法,且必须包含多级反馈队列调度算法;提供用户选择功能,用户可以根据需要选择采用何种调度算法;算法执行结构之后,应该给出周转时间和
4、平均周转时间。二:课程设计任务及要求设计任务:使用Visual C+ 模拟实现处理机调度算法,实现先来先服务、短作业优先、基于时间片的轮转、多级反馈队列调度算法。设计要求:所设计的系统中至少需要实现三种以上调度算法,且必须包含多级反馈队列调度算法;提供用户选择功能,用户可以根据需要选择采用何种调度算法;算法执行结构之后,应该给出周转时间和平均周转时间。三:算法及数据结构进程控制块数据结构和相应的操作。classPCBpublic: PCB(void); PCB(PCB&); voidCreat(CString ,int ); PCB(void); voidUpdate(); /剩余时间与运行时
5、间更新 CStringShowPro(); /返回进程信息 boolIsEnd(); /判断进行是否执行完成 voidDispose(); /锁定进程 boolIsLocked(); /判断进程是否锁住 voidTerminal(); /强制终止进程函数 intGetServiceT(); /获得需要服务时间 floatGetPrio(); /返回进程优先级 CStringGetCurTime(); /返回当前系统时间 CStringGetName(); /获取进程名称 voidUpdateGoneTime(); /更新进程周转时间 intGetGoneTime(); /返回进程周转时间 in
6、tGetRuningTime(); /返回进程运行时间private: CStringName; /进程名称 CStringStart; /创建时间 intServiceT; /需要服务时间 intRunningT; /已运行时间 intRemainT; /剩余时间 intGoneTime; /消逝时间 | 周转时间 intID; /进程标识符 CStringReadyTime; /进程成为就绪进程的时间 floatprio; /进程优先权 intLocked; /进程锁 staticintcount ; /计数;#include StdAfx.h#include PCB.hint PCB:c
7、ount =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
8、)CString PCB:GetName() return Name;CString PCB:GetCurTime() if (Locked=1) return ; /(CTime:GetCurrentTime().Format(%H:%M:%S) SYSTEMTIME TM; :GetSystemTime(&TM); CString tmp; tmp.Format( %d:%d:%d ,(8+TM.wHour)%24,TM.wMinute,TM.wSecond); return tmp;int PCB:GetServiceT() return ServiceT;float PCB:GetPr
9、io() return prio;void PCB:Creat(CString name , int needtime) Locked=0; /默认为锁定Locked=1,创建需解锁! Name = name; Start = GetCurTime(); ServiceT = needtime; RunningT=0; RemainT=needtime; ID=count; count+; if (count100) count=0; ReadyTime=GetCurTime(); GoneTime=0; prio =(float)RemainT/ ServiceT; void PCB:Upd
10、ateGoneTime() if (Locked=1) return ; GoneTime+;void PCB:Update() if (Locked=1) return ; RunningT+; if (RemainT0) RemainT-; prio =(float) RemainT/ ServiceT;void PCB:Dispose() Locked=1;CString PCB:ShowPro() if (Locked=1) return ; CString tmp ; tmp.Format(进程名:%s,进程ID:%d,创建时间:%s,需要时间:%d,已运行时间:%d,剩余时间:%d
11、,优先权:%f,Name,ID,ReadyTime,ServiceT,RunningT,RemainT,prio); return tmp;bool PCB:IsEnd() if (RemainTnext =NULL;Queue:Queue()/template bool Queue:IsEmpty() if (first-next = NULL) return true; else return false;/template void Queue:Enqueue(PCB data) Node *s = new Node; s-Data =data; Node *p; /work Ptr p
12、 = first; while(p-next) p=p-next; p-next =s; s-next =NULL;/template void Queue:Dequeue() first-next = first-next-next;int Queue:GetLength() int count =0; Node *p =first-next; while(p) count+; p=p-next; return count;CString Queue:Print() Node *p=first; int n =GetLength(); CString tmp =; for (int i=0;
13、inext-Data.ShowPro(); tmp+=rn; p=p-next; return tmp;PCB Queue:GetFirst() PCB tmp = first-next-Data; Dequeue(); return tmp;void Queue:Update() Node *p =first-next; while(p) p-Data.Update(); p=p-next; void Queue:UpdateGoneTime() Node *p =first-next; while(p) p-Data.UpdateGoneTime(); p=p-next; void Que
14、ue: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() PCB tmp; tmp=p-Data; p-Data=q-Data; q-Data=tmp; void Queue:HighPrio() Node *p=NULL; Node *q=NULL; for(p=first-next;p-next;p
15、=p-next) for (q=p-next;q;q=q-next) if (p-Data.GetPrio()q-Data.GetPrio() PCB tmp; tmp=p-Data; p-Data=q-Data; q-Data=tmp; void Queue:Clear() while(first-next!=NULL) Node *tmp=first-next; first-next=tmp-next; delete tmp; CString Queue:GetGoneTime() CString tmp; CString Ret; Node *p =first-next; int tim
16、e=0; while(p) tmp.Format(进程名:%s,周转时间:%drn,p-Data.GetName(),p-Data.GetGoneTime(); time+=p-Data.GetGoneTime(); Ret+=tmp; p=p-next; tmp.Format(平均周转时间:%.2f,(float)(time/GetLength(); Ret+=tmp; return Ret;Node* Queue:GetFirstPtr() return first;四:程序设计与实现。 流程图 实验结果:五:收获,体会和建议 本次课程设计让我更加深刻的理解了操作系统的处理机调度算法,对进程间的调度有了较为深刻的看法,加强了对教材的理解,并且帮助自己复习了MFC的有关知识,对C+也能更加熟练的使用。本次实验让我自己再次认识到动手实验的重要性,理论研究的再透彻,也必须通过实践来引导,只有不断动手做实验,才能加强对程序设计的理解,多动手才能积累经验,平时遇到的错误耐心查找资料一个个解决,下一次再遇到时能够轻松解决,在以后的学习过程中,一定要加强自己的动手能力,充分利用自己手头的资源,养成多动手写代码的好习惯。 六:参考资料和书籍。MFC程序设计 -Jeff Prosise操作系统 -Achyut Godbole计算机操作系统-汤子瀛
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1