欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

    • 资源ID:4102464       资源大小:112.50KB        全文页数:20页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    目 录进程调度模拟程序1一设计目的及要求1二概要设计1三算法流程图2四源程序及注释6五运行结果及分析16六课程设计总结19七参考文献19进程调度模拟程序一设计目的及要求编写一个进程调度程序,允许多个进程并行执行。本次设计将采用三种算法实现进程的并行执行,分别是最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法、按时间片轮转调度算法。 二概要设计 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 建立一个pcbobj的数组来存放进程队列。建立一个类pcbobj存放进程的各种信息并对这些信息的操作。建立一个类wait_manager 来对就绪进程进行管理。建立一个类cpu_manager 来对运行的进程进行管理。三算法流程图开始初始化进程信息FCFS算法结束RR算法HPF算法Y调用FCFS算法调用RR算法Y调用HPF算法YNNN图11 主程序流程图 start信息初始化进程调度完毕输出该时刻的进程状态表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信息初始化进程调度完毕输出该时刻的进程状态表EndY更新进程信息打印进程状态就绪队列不为空&&cpu空闲Y将就绪队列的第一个进程给cpuCpu为busy态NY更新运行的进程信息运行进程运行完毕进程加到就绪队列记录进程临时信息NN时间记录加一NCpu.remove()Y 图14 HPF算法流程图四源程序及注释 -pcbobj.h -#include <string>using namespace std;#ifndef PCBOBJ_H_#define PCBOBJ_H_enum pStatusWait,Run,Finish,UNGO;/定义进程的四种状态class PCBobj public:PCBobj();PCBobj(string 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 setExecTime(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 *pcbobj;#endif /* PCBOBJ_H_ */-pcbobj.cpp代码-#include "PCBobj.h"PCBobj: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 return 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->hasExecTime = 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;bool PCBobj:isFinish()bool Flag=false;if(execTime = hasExecTime)status=Finish;Flag=true;return Flag;-waitmanager.h-#include<iostream>#include <list>#include"PCBobj.h"#ifndef WAITMANAGER_H_#define WAITMANAGER_H_class WaitManager public:WaitManager();virtual WaitManager();void add(pcbobj new_obj);void insert(pcbobj new_name);void remove(string name);void remove();bool empty();pcbobj get();pcbobj last();private:list<pcbobj> wait_PCB_list;#endif /* WAITMANAGER_H_ */-waitmanager.cpp-#include "WaitManager.h"WaitManager:WaitManager() WaitManager:WaitManager() void WaitManager:add(pcbobj new_obj)wait_PCB_list.push_back(new_obj);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<pcbobj>:iterator it=wait_PCB_list.begin();it!=wait_PCB_list.end();it+)if(new_obj->getId()>(*it)->getId()wait_PCB_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<pcbobj>:iterator it=wait_PCB_list.begin();it!=wait_PCB_list.end();it+)if(*it)->getName() = name)wait_PCB_list.erase(it);remove_info=true;break;if(!remove_info)cout<<name<<"进程"<<"不存在"<<endl;void WaitManager:remove()if(empty()cout<<"没有就绪进程在队列中"<<endl;elsewait_PCB_list.pop_front();pcbobj WaitManager:get()return wait_PCB_list.front();pcbobj WaitManager:last()return wait_PCB_list.back();-cpumanager.h-#include "PCBobj.h"#ifndef CPU_MANAGER_H_#define CPU_MANAGER_H_enum cpu_StatusFREE,BUSY;/cpu的状态class cpu_Manager public:cpu_Manager();virtual cpu_Manager(); void remove(); cpu_Status getCpu_info() const; pcbobj getCpu_pcb() const; void add(pcbobj cpu_pcb); void update(); void update(int args); int cpu_timeslice;private:cpu_Status cpu_info;pcbobj cpu_pcb;#endif /* CPU_MANAGER_H_ */-cpumanager.cpp-#include "cpu_Manager.h"cpu_Manager:cpu_Manager() cpu_pcb=0;cpu_info=FREE;cpu_timeslice=4;cpu_Manager:cpu_Manager() cpu_pcb=0;cpu_Status cpu_Manager:getCpu_info() const return cpu_info;pcbobj cpu_Manager:getCpu_pcb() const return cpu_pcb;void cpu_Manager:add(pcbobj cpu_pcb1) cpu_pcb = cpu_pcb1; cpu_info=BUSY;void cpu_Manager:remove()this->cpu_pcb=0;cpu_info=FREE;void cpu_Manager:update()cpu_pcb->setStatus(Run);cpu_pcb->setHasExecTime(cpu_pcb->getHasExecTime()+1);void cpu_Manager: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 process,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_manager,cpu_Manager& cpu_manager); void FCFS(pcbobj process);void RR(pcbobj process);void HPF(pcbobj process);#endif /* SCHEDUL_SIMULATE_H_ */- schedul_simulate.cpp-#include"schedul_simulate.h"void choice()cout<<"1:FCFS"<<endl;cout<<"2:RR"<<endl;cout<<"3:HPF"<<endl;cout<<"4:quit"<<endl;string convert_statu(pStatus statu) string 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 << "请按顺序输入进程的唯一标识-进程名 进程的优先级 进程的到达时间 进程的运行时间" << endl;for (int i = 0; i < 4; i+) /process里的hasExecTime和status已经被初始化cout << "请输入第" << (i + 1) << "个进程的信息" << endl;cin >> 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 << "第" << (i + 1) << "个进程信息已经初始化" << endl;cout << "所有进程信息已经全部完成" << endl;void process_update(pcbobj process, int time_record, WaitManager& wait_manager) for (int i = 0; i < 4; i+) if (process + i)->getReachTime() = time_record) wait_manager.add(process + i);/直接加到末尾void process_update_id(pcbobj process, int time_record, WaitManager& wait_manager)for (int i = 0; i < 4; i+) if (process + 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 << (process + i)->getName() << "t" << (process + i)->getId() <<"t" << (process + i)->getReachTime() << "t" << (process + i)->getExecTime() << "t" << (process + i)->getHasExecTime() << "tt"if(process+i)->last_statu)cout<< convert_statu(Run) << endl;elsecout<<convert_statu(process+i)->getStatus()<<endl;(process+i)->last_statu=false;cout << "-" << endl;void waitTOrun(WaitManager& wait_manager, cpu_Manager& cpu_manager) cpu_manager.add(wait_manager.get();wait_manager.remove();void runTOwait(WaitManager& wait_manager, cpu_Manager& cpu_manager) pcbobj temp=cpu_manager.getCpu_pcb();temp->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) 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_record+;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 (process_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()->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) 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() = 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_manager.empty()/已经到达process_last = wait_manager.last();process_record(process,time_record);-main.cpp-#include"schedul_simulate.h"int main()int you_choice;PCBobj obj4;process_init(&obj0);choice();bool start_app=true;while(start_app)cin>>you_choice;switch(you_choice)case 1:FCFS(&obj0);break;case 2:RR(&obj0);break;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.

    注意事项

    本文(操作系统课程设计报告书进程调度模拟程序.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开