操作系统课程设计报告书-进程调度模拟程序.doc

上传人:小小飞 文档编号:5022762 上传时间:2020-01-29 格式:DOC 页数:20 大小:160KB
返回 下载 相关 举报
操作系统课程设计报告书-进程调度模拟程序.doc_第1页
第1页 / 共20页
操作系统课程设计报告书-进程调度模拟程序.doc_第2页
第2页 / 共20页
操作系统课程设计报告书-进程调度模拟程序.doc_第3页
第3页 / 共20页
操作系统课程设计报告书-进程调度模拟程序.doc_第4页
第4页 / 共20页
操作系统课程设计报告书-进程调度模拟程序.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《操作系统课程设计报告书-进程调度模拟程序.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计报告书-进程调度模拟程序.doc(20页珍藏版)》请在三一文库上搜索。

1、 沈阳理工大学课程设计专用纸 No19目 录进程调度模拟程序1一设计目的及要求1二概要设计1三算法流程图2四源程序及注释6五运行结果及分析16六课程设计总结19七参考文献19沈阳理工大学进程调度模拟程序一设计目的及要求编写一个进程调度程序,允许多个进程并行执行。本次设计将采用三种算法实现进程的并行执行,分别是最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法、按时间片轮转调度算法。 二概要设计 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态。 进程的优先数及需要的运行时间可以事先人为

2、地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 建立一个pcbobj的数组来存放进程队列。建立一个类pcbobj存放进程的各种信息并对这些信息的操作。建立一个类wait_manager 来对就绪进程进行管理。建立一个类cpu_manager 来对运行的进程进行管理。三算法流程图开始初始化进程信息FCFS算法结束RR算法HPF算法Y调用FCFS算法调用RR算法Y调用HPF算法YNNN图11 主程序流程图 start信息初始化进程调度完毕输出该时

3、刻的进程状态表EndY更新进程信息打印进程状态就绪队列不为空&cpu空闲Y将就绪队列的第一个进程给cpuCpu为busy态NY更新运行的进程信息运行进程运行完毕Cpu.remove()YN时间记录加一N 图12 FCFS算法流程图start信息初始化进程调度完毕输出该时刻的进程状态表EndNY更新进程信息打印进程状态就绪队列不为空&cpu空闲Y将就绪队列的第一个进程给cpuCpu为busy态NY更新运行的进程信息进程时间加一运行进程运行完毕Cpu.remove()进程时间清零YN时间记录加一是否超时进程加到就绪队列进程时间清零YNN 图13 RR算法流程图start信息初始化进程调度完毕输出该

4、时刻的进程状态表EndY更新进程信息打印进程状态就绪队列不为空&cpu空闲Y将就绪队列的第一个进程给cpuCpu为busy态NY更新运行的进程信息运行进程运行完毕进程加到就绪队列记录进程临时信息NN时间记录加一NCpu.remove()Y 图14 HPF算法流程图四源程序及注释 -pcbobj.h -#include using namespace std;#ifndef PCBOBJ_H_#define PCBOBJ_H_enum pStatusWait,Run,Finish,UNGO;/定义进程的四种状态class PCBobj public:PCBobj();PCBobj(string

5、name,int id,int reach,int execute);virtual PCBobj(); int getExecTime() const; int getHasExecTime() const; int getId() const; int getReachTime() const; string getName() const; pStatus getStatus() const; void setHasExecTime(int hasExecTime); void setId(int pId); void setStatus(pStatus status); void se

6、tExecTime(int execTime); void setName(string pName); void setReachTime(int reachTime); bool isFinish();/进程是否运行完毕 bool last_statu;/判断进程上一个cpu是否是运行态private: string pName; /进程名 int pId; /进程优先数 int reachTime; /进程到达时间 int execTime; /进程需要运行的时间 int hasExecTime; /进程已经运行 的 时间 pStatus status;typedef PCBobj *p

7、cbobj;#endif /* PCBOBJ_H_ */-pcbobj.cpp代码-#include PCBobj.hPCBobj:PCBobj() hasExecTime=0;status=UNGO;last_statu=false;PCBobj:PCBobj(string name,int id,int reach,int execute)pName=name;pId=id;reachTime=reach;execTime=execute;hasExecTime=0;status=UNGO;PCBobj:PCBobj() int PCBobj:getExecTime() const ret

8、urn execTime;int PCBobj:getHasExecTime() const return hasExecTime;int PCBobj:getId() const return pId;string PCBobj:getName() const return pName;int PCBobj:getReachTime() const return reachTime;pStatus PCBobj:getStatus() const return status;void PCBobj:setHasExecTime(int hasExecTime) this-hasExecTim

9、e = hasExecTime;void PCBobj:setId(int pId) this-pId = pId;void PCBobj:setStatus(pStatus status) this-status = status;void PCBobj:setExecTime(int execTime) this-execTime = execTime;void PCBobj:setName(string pName) this-pName = pName;void PCBobj:setReachTime(int reachTime) this-reachTime = reachTime;

10、bool PCBobj:isFinish()bool Flag=false;if(execTime = hasExecTime)status=Finish;Flag=true;return Flag;-waitmanager.h-#include#include #includePCBobj.h#ifndef WAITMANAGER_H_#define WAITMANAGER_H_class WaitManager public:WaitManager();virtual WaitManager();void add(pcbobj new_obj);void insert(pcbobj new

11、_name);void remove(string name);void remove();bool empty();pcbobj get();pcbobj last();private:list wait_PCB_list;#endif /* WAITMANAGER_H_ */-waitmanager.cpp-#include WaitManager.hWaitManager:WaitManager() WaitManager:WaitManager() void WaitManager:add(pcbobj new_obj)wait_PCB_list.push_back(new_obj);

12、new_obj-setStatus(Wait);bool WaitManager:empty()return wait_PCB_list.empty();void WaitManager:insert(pcbobj new_obj)if(wait_PCB_list.empty()add(new_obj);elsebool insert_info=false;/查看是否已经插入进去for(list:iterator it=wait_PCB_list.begin();it!=wait_PCB_list.end();it+)if(new_obj-getId()(*it)-getId()wait_PC

13、B_list.insert(it,new_obj);new_obj-setStatus(Wait);insert_info=true;break;if(!insert_info)wait_PCB_list.push_back(new_obj);new_obj-setStatus(Wait);void WaitManager:remove(string name)if(empty()cout没有进程在就绪队列中endl;elsebool remove_info=false;for(list:iterator it=wait_PCB_list.begin();it!=wait_PCB_list.e

14、nd();it+)if(*it)-getName() = name)wait_PCB_list.erase(it);remove_info=true;break;if(!remove_info)coutname进程不存在endl;void WaitManager:remove()if(empty()cout没有就绪进程在队列中cpu_pcb=0;cpu_info=FREE;void cpu_Manager:update()cpu_pcb-setStatus(Run);cpu_pcb-setHasExecTime(cpu_pcb-getHasExecTime()+1);void cpu_Mana

15、ger:update(int args)update();cpu_pcb-setId(cpu_pcb-getId()- args);- schedul_simulate.h-#include WaitManager.h#include cpu_Manager.h#ifndef SCHEDUL_SIMULATE_H_#define SCHEDUL_SIMULATE_H_void choice();string convert_statu(pStatus statu);void process_init(pcbobj process);void process_update(pcbobj proc

16、ess,int time_record,WaitManager& wait_manager);void process_update_id(pcbobj process,int time_record,WaitManager& wait_manager);/-打印进程信息-void process_record(pcbobj process,int time_record);/-从wait到run-void waitTOrun(WaitManager& wait_manager,cpu_Manager& cpu_manager);void runTOwait(WaitManager& wait

17、_manager,cpu_Manager& cpu_manager); void FCFS(pcbobj process);void RR(pcbobj process);void HPF(pcbobj process);#endif /* SCHEDUL_SIMULATE_H_ */- schedul_simulate.cpp-#includeschedul_simulate.hvoid choice()cout1:FCFSendl;cout2:RRendl;cout3:HPFendl;cout4:quitendl;string convert_statu(pStatus statu) st

18、ring value = UNGO;switch (statu) case Wait:value = Wait;break;case Run:value = Run;break;case Finish:value = Finish;break;case UNGO:value = UNGO;return value;void process_init(pcbobj process) string name;int process_id;int process_reach;int process_execute;cout 请按顺序输入进程的唯一标识-进程名 进程的优先级 进程的到达时间 进程的运行

19、时间 endl;for (int i = 0; i 4; i+) /process里的hasExecTime和status已经被初始化cout 请输入第 (i + 1) 个进程的信息 name;cin process_id;cin process_reach;cin process_execute;(process + i)-setName(name);(process + i)-setId(process_id);(process + i)-setReachTime(process_reach);(process + i)-setExecTime(process_execute);cout

20、第 (i + 1) 个进程信息已经初始化 endl;cout 所有进程信息已经全部完成 endl;void process_update(pcbobj process, int time_record, WaitManager& wait_manager) for (int i = 0; i getReachTime() = time_record) wait_manager.add(process + i);/直接加到末尾void process_update_id(pcbobj process, int time_record, WaitManager& wait_manager)for

21、(int i = 0; i getReachTime() = time_record) wait_manager.insert(process + i);void process_record(pcbobj process,int time_record)cout 时刻: time_record endl;cout 进程名t优先数t到达时间t运行时间t已经运行时间t状态 endl;cout - endl;for (int i = 0; i 4; i+) cout getName() t getId() t getReachTime() t getExecTime() t getHasExecT

22、ime() last_statu)cout convert_statu(Run) endl;elsecoutgetStatus()last_statu=false;cout - last_statu=true;wait_manager.add(temp);void FCFS(pcbobj process) int time_record = 0;PCBobj *process_last = process + 3;WaitManager wait_manager;cpu_Manager cpumanager;while (process_last-getStatus() != Finish)

23、process_update(process,time_record,wait_manager);process_record(process,time_record);if (!wait_manager.empty() & cpumanager.getCpu_info() = FREE)waitTOrun(wait_manager, cpumanager);if (cpumanager.getCpu_info() = BUSY)cpumanager.update();if(cpumanager.getCpu_pcb()-isFinish()cpumanager.remove();time_r

24、ecord+;if (process_last-getStatus() != UNGO & !wait_manager.empty()/已经到达process_last = wait_manager.last();process_record(process,time_record);void RR(pcbobj process) int time_record = 0;PCBobj *process_last = process + 3;WaitManager wait_manager;cpu_Manager cpumanager;int k=0;/记录时间片 满则为零while (proc

25、ess_last-getStatus() != Finish) process_update(process,time_record,wait_manager);process_record(process,time_record);if (!wait_manager.empty() & cpumanager.getCpu_info() = FREE)waitTOrun(wait_manager, cpumanager);if (cpumanager.getCpu_info() = BUSY)cpumanager.update();k+;if (cpumanager.getCpu_pcb()-

26、isFinish()cpumanager.remove();k=0;else if(k=cpumanager.cpu_timeslice)runTOwait(wait_manager,cpumanager);cpumanager.remove();k=0;time_record+;if (process_last-getStatus() != UNGO & !wait_manager.empty()/已经到达process_last = wait_manager.last();process_record(process,time_record);void HPF(pcbobj process

27、) int time_record = 0;PCBobj *process_last = process + 3;WaitManager wait_manager;cpu_Manager cpumanager;pcbobj temp;while (process_last-getStatus() != Finish) process_update_id(process,time_record,wait_manager);process_record(process,time_record);if (!wait_manager.empty() & cpumanager.getCpu_info()

28、 = FREE)waitTOrun(wait_manager, cpumanager);if (cpumanager.getCpu_info() = BUSY)cpumanager.update(1);if (!cpumanager.getCpu_pcb()-isFinish() temp=cpumanager.getCpu_pcb();temp-last_statu=true;wait_manager.insert(temp);cpumanager.remove();time_record+;if (process_last-getStatus() != UNGO & !wait_manag

29、er.empty()/已经到达process_last = wait_manager.last();process_record(process,time_record);-main.cpp-#includeschedul_simulate.hint main()int you_choice;PCBobj obj4;process_init(&obj0);choice();bool start_app=true;while(start_app)cinyou_choice;switch(you_choice)case 1:FCFS(&obj0);break;case 2:RR(&obj0);br

30、eak;case 3:HPF(&obj0);break;case 4:start_app=false;return 0;五运行结果及分析图15 进程信息初始化图16 选择时间片算法调度图17 开始只有a进程进入就绪队列,运行a进程图18 a运行完毕,b,c都已经到达,此时运行b进程 图19 b运行完毕时,此时c,d都已经完成,运行c进程图110 c的时间片已经完成,将c放入到就绪队列,d进程开始运行图111 d运行完毕 继续运行c进程,直到运行完毕六课程设计总结通过这次操作系统的课程设计,我研究了进程调度的相关知识。课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。总体来说我认为操作系统这门学科在计算机科学当是中非常重要的。这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西。我想这也许就是课程设计的最终目的吧。七参考文献1刘振安、刘燕君著.C+程序设计课程设计.北京: 机械工业出版社,20042美Abraham Silberschatz, Peter Baer Galvin, Greg Gagne 著. 郑扣根 译. 操作系统概念(第六版). 北京: 高等教育出版社,20043陈向群,向勇 等. Windows操作系统原理(第二版). 北京:机械工业出版社,2004.

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1