收藏 分销(赏)

进程调度模拟程序设计.doc

上传人:人****来 文档编号:4811300 上传时间:2024-10-13 格式:DOC 页数:6 大小:39.59KB 下载积分:6 金币
下载 相关 举报
进程调度模拟程序设计.doc_第1页
第1页 / 共6页
进程调度模拟程序设计.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
进程调度模拟程序设计 一、实验目的 按优先数调度算法或时间片轮转法模拟处理器调度,从而进一步理解处理器调度的原理。 二、实验内容 1.设计思路 (1)数据结构定义 (a)对于不同的调度算法,定义不同的PCB结构体 typedef struct PCB_type1 { char name[10]; //进程名 char state; //进程状态 R——就绪状态 E——结束状态 int need_time; //运行需要的CPU时间(需运行的时间片个数) int priority; }PCB_P; //按优先数调度算法的PCB结构体 typedef struct PCB_type2 { char name[10]; //进程名 int state; //进程状态 R——就绪状态 E——结束状态 int need_time; //运行需要的CPU时间(需运行的时间片个数) int used_time; // }PCB_T; //按时间片轮转算法的PCB结构体 (b)用全局变量choice来指明当前应用的调度算法 int choice; (c)为了模拟调度,可以利用STL定义队列 deque<PCB_P> q1; queue<PCB_T> q2; (2)程序主要模块 一共有三个自定义函数,分别是: start_state() 提示用户选择调度算法,初始化进程信息。 dispatch() 模拟调度 (a) 对于优先数调度算法,每次调度前对队列里的进程按优先数从大 到小排序,然后调度选中队首的进程,将其出队列,并将进程优先数 和需要运行时间减1。如果此进程的需要运行时间不为0,则继续将 此进程入队;如果此进程的需要运行时间为0了,则将其状态置为结 束状态。重复上述过程直至队列为空。 (b) 对于时间片轮转算法,调度选中队首的进程,将其出队列,并将 进程已用时间加1。如果此进程要求运行时间¹已运行时间,则尚未 执行结束,继续将此进程入队;如果此进程的要求运行时间=已运行 时间,则已经执行结束,将其状态置为结束状态。重复上述过程直至 队列为空。 output() 输出被调度选中的进程的信息。 2. 源程序 #include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <algorithm> using namespace std; typedef struct PCB_type1 { char name[10]; //进程名 char state; //进程状态 R——就绪状态 E——结束状态 int need_time; //运行需要的CPU时间(需运行的时间片个数) int priority; }PCB_P; //按优先数调度算法的PCB结构 typedef struct PCB_type2 { char name[10]; //进程名 int state; //进程状态 R——就绪状态 E——结束状态 int need_time; //运行需要的CPU时间(需运行的时间片个数) int used_time; // }PCB_T; //按时间片轮转算法的PCB结构 int choice; PCB_P pcbP; PCB_T pcbT; deque<PCB_P> q1; queue<PCB_T> q2; char pcbName[5][10]={"P1","P2","P3","P4","P5"}; bool cmp(const PCB_P &a,const PCB_P &b) { return a.priority>b.priority; } void start_state() { do{ printf("请选择调度算法:\n\t1--优先数调度算法\n\t2--时间片轮转算法\n"); scanf("%d",&choice); }while(choice!=1&&choice!=2); if(choice==1){ for(int i=0;i<5;i++){ strcpy(pcbP.name,pcbName[i]); pcbP.state='R'; printf("%s:\n",pcbP.name); printf("优先数:"); scanf("%d",&pcbP.priority); printf("要求运行时间:"); scanf("%d",&pcbP.need_time); q1.push_back(pcbP); } } else{ for(int i=0;i<5;i++){ strcpy(pcbT.name,pcbName[i]); pcbT.state='R'; pcbT.used_time=0; printf("%s:\n",pcbT.name); printf("要求运行时间:"); scanf("%d",&pcbT.need_time); q2.push(pcbT); } } if(choice==1) printf("被选中的进程**运行一次后** 优先数\t要求运行时间\t 进程状态\n"); else printf("被选中的进程**运行一次后**要求运行时间\t 已运行时间\t 进程状态\n"); } void output() { if(choice==1) printf(" %s \t\t\t%d\t\t%d\t\t%c\n",pcbP.name,pcbP.priority,pcbP.need_time,pcbP.state); else printf(" %s \t\t\t%d\t\t%d\t\t%c\n",pcbT.name,pcbT.need_time,pcbT.used_time,pcbT.state); } void dispatch() { if(choice==1){ while(!q1.empty()){ sort(q1.begin(),q1.end(),cmp); pcbP=q1.front(); q1.pop_front(); pcbP.priority--; pcbP.need_time--; if(pcbP.need_time) q1.push_back(pcbP); else pcbP.state='E'; output(); } } else{ while(!q2.empty()){ pcbT=q2.front(); q2.pop(); pcbT.used_time++; if(pcbT.need_time!=pcbT.used_time) q2.push(pcbT); else pcbT.state='E'; output(); } } } int main() { start_state(); dispatch(); return 0; } 3. 运行结果 (1)优先数调度算法 (2)时间片轮转算法
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服