




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
沈阳理工大学课程设计专用纸 no19目 录进程调度模拟程序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 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.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 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#include #includepcbobj.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 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);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_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: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)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_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-#includeschedul_simulate.hvoid choice()cout1:fcfsendl;cout2:rrendl;cout3:hpfendl;cout4:quitendl;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) 个进程的信息 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 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 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 gethasexectime() 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) 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-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能农业植保无人机租赁与病虫害防治方案合同
- 智能教育机器人比赛计时器租赁与赛事奖励服务协议
- 中医用药护理原则与方法
- 软件产品功能质量测试补充协议
- 奢侈品行业私人保镖培训与品牌形象维护合同
- 口腔囊肿治疗方法
- 抖音平台用户行为分析与权益保护合作协议
- 美容美发连锁品牌全国市场拓展合作协议
- 知识产权变更手续办理及许可使用协议范本
- 数据库平台运营权转让及技术服务合同
- 系杆拱桥工程测量施工方案
- 浅谈摩托艇的安全管理
- 女性功能治疗方案ppt课件
- 公路工程计量与计价考试B本科
- 医用耗材分类目录 (低值 ╱ 高值)
- 短、中、长距离游泳项目的体能训练方法及特征研究
- 人造草坪技术参数
- 浅谈歌曲《我的祖国》
- lemon米津玄师翻唱中文谐音
- 城镇老旧小区改造技术导则(青岛)
- 农村饮水安全工程施工组织设计方案
评论
0/150
提交评论