实验一处理机调度.doc
《实验一处理机调度.doc》由会员分享,可在线阅读,更多相关《实验一处理机调度.doc(19页珍藏版)》请在三一办公上搜索。
1、实验一 处理机调度一.实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。二.实验内容选择一个调度算法,实现处理机调度。1.设计一个按优先权调度算法实现处理机调度的程序。2.设计按时间片轮转实现处理机调度的程序。三.实验要求要求:进程名/PID要求运行时间(单位时间)优先权状态PCB指针1、可随机输入若干进程,并按优先权排序;2、从就绪队列首选进程运行:优先权-1,要求运行时间-1,要求运行时间=0时,撤销该进程。3、重新排序,进行下轮调度。4、最好采用图形界面。5、可以随时增加进程。6、规定道数,设置
2、后备队列和挂起状态。若内存中进程少于规定道数,可自动从后备队列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。7、每次调度后,显示各进程状态。四.实验过程#includewindows.h#include#include#includeenum PCBSTATE READY,RUN,FINISH; /定义进程状态的数据类型typedef struct PCB_Struct /定义进程控制块 char Name8; /进程名 int Priority; /优先数 double WorkTime; /已运行的时间 double NeedTime; /还需运行时间
3、 double WaitTime; /进程总共花费时间 PCBSTATE State; /进程状态 PCB_Struct *Next; /指针 PCB;bool RunOk;PCB *ReadyList; /声明就绪链表PCB *FinishList; /声明完成链表 PCB *RearReady; /声明就绪监听队列PCB *RearFinish; /声明完成监听队列PCB *CurrentRun; /声明当前运行队列void AdjustProcessList(PCB *Insert) /调整进程队列PCB *tmp,*Parent; /定义线程tmp=ReadyList; /把临时线程加
4、入就绪链表if (tmp-PriorityPriority) /比较优先级安排链表序ReadyList=Insert; Insert-Next=tmp;elseParent=tmp;while(tmp)if (tmp-Priority=Insert-Priority)Parent=tmp;tmp=tmp-Next;elsebreak;if (!tmp)RearReady-Next=Insert;RearReady=Insert;elseInsert-Next=tmp;Parent-Next=Insert;void GetOnePCB() /增加进程PCB *tmp; /初始化变量tmp=new
5、 PCB;char Name8;int Priority;double Time; /人机交互获取进程参数cinName; coutPriority; coutTime;coutName,Name);tmp-Priority=Priority; /把参数到进程中tmp-WorkTime=0.0;tmp-WaitTime=0.0;tmp-NeedTime=Time;tmp-State=READY;tmp-Next=NULL;if (RearReady) /如果监听链表不为空AdjustProcessList(tmp); /调用调整进程队列else /为空则初始化监听队列 ReadyList=tm
6、p;RearReady=tmp; void GetAllPCB() /输入开始时的进程int i,j,k; /+kcoutendli;if(i0) /获取进程for (j=0;ji;j+)k=j+1; cout 第kWaitTime+;tmp=tmp-Next;void AdjustRunProcess() /调整运行队列AddWaitWorkTime(); /调用时间控制CurrentRun=ReadyList; /把就绪进程放入运行队列ReadyList=ReadyList-Next;CurrentRun-Next=NULL;if(CurrentRun-Priority=1) /修改运行进
7、程的属性CurrentRun-Priority;CurrentRun-WorkTime+;CurrentRun-NeedTime-;if(CurrentRun-NeedTime=0) /处理结束的进程CurrentRun-State=RUN;if(FinishList=NULL) /如果结束进程为空,创建FinishList=CurrentRun;else /否则,添加入完成监听队列RearFinish-Next=CurrentRun;RearFinish=CurrentRun;if(!ReadyList)ReadyList=RearReady=NULL;else if(!ReadyList)
8、 /如果就绪队列为空RearReady=ReadyList=CurrentRun; /把监听队列中的进程防入就绪队列else AdjustProcessList(CurrentRun); /递归if(!ReadyList) /如果就绪队列为空CurrentRun=NULL; /把运行进程置空RunOk=true; /设置进程完成开关void ShowProcess() /显示队列情况 PCB *tmp; if(CurrentRun) /存在运行队列,显示 cout本次调度运行的进程:endl;cout 进程名 进程优先数 已运行的时间 还需运行时间 进程总共花费时间 进程状态 endl;cou
9、t Name Priority WorkTime NeedTime WaitTime Stateendl; if(ReadyList) /存在就绪队列,显示 tmp=ReadyList;cout就绪队列中的进程:endl;cout 进程名 进程优先数 已运行的时间 还需运行时间 进程总共花费时间 进程状态 endl;while(tmp)cout Name Priority WorkTime NeedTime WaitTime StateNext; if(FinishList) /运行至结束,显示 tmp=FinishList;cout显示已运行好的进程调度结果:endl;cout 进程名 进程
10、优先数 已运行的时间 还需运行时间 进程总共花费时间 进程状态 endl;while (tmp)cout Name Priority WorkTime NeedTime WaitTime StateNext; void FreeProcess() /释放进程PCB *tmp;if(!FinishList) /就绪队列为空,报错coutendlNext;) /删除进程tmp=FinishList;FinishList=FinishList-Next;delete tmp;ReadyList=NULL; /将所有队列置空FinishList=NULL;RearReady=NULL;CurrentR
11、un=NULL;RearFinish=NULL;void RunOnce() /单步调度AdjustRunProcess();/调整运行队列char SelectStyle() /选择类型char i;printf(n); /人机交互选择下一步的操作printf(点击1-继续下一次调度,并显示就绪队列中的进程情况n);printf(点击2-向就绪队列添加新进程n);printf(点击3-运行程序n);printf(请选择你要的操作:);doi=(char)_getch();while(i!=1&i!=2&i!=3);coutiendlendl;return i;void RunAlor() /
12、进程运行控制 char j=1; RunOk=false; GetAllPCB(); /获取全部进程 do if(j!=3&!RunOk)j=SelectStyle(); /调用选择操作 if(j=3) RunOnce(); /调用单步运行if(j=1) RunOnce();ShowProcess(); /调用显示队列if(j=2) /添加新进程 system(cls);cout 新进程名:;GetOnePCB(); while(!RunOk); /当进程全部运行完毕 cout运行完成,显示进程调度结果:n; ShowProcess(); /显示进程队列 FreeProcess(); /释放进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 处理机 调度
链接地址:https://www.31ppt.com/p-4043873.html