实验2--进程状态转换及其PCB的变化.doc

上传人:豆**** 文档编号:33434713 上传时间:2022-08-11 格式:DOC 页数:6 大小:28KB
返回 下载 相关 举报
实验2--进程状态转换及其PCB的变化.doc_第1页
第1页 / 共6页
实验2--进程状态转换及其PCB的变化.doc_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《实验2--进程状态转换及其PCB的变化.doc》由会员分享,可在线阅读,更多相关《实验2--进程状态转换及其PCB的变化.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精品文档,仅供学习与交流,如有侵权请联系网站删除实验2 进程状态转换及其PCB的变化1.目的自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。2. 内容及要求1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。4)设计出可视性较好的界面,应能反映出进程状

2、态的变化引起的对应PCB内容、组织结构的变化。5)代码书写要规范,要适当地加入注释。6)鼓励在实验中加入新的观点或想法,并加以实现。7)认真进行预习,完成预习报告。8)实验完成后,要认真总结,完成实验报告。3.程序流程图进程的三种基本状态及其转换如下图所示。4. 数据结构及说明在本实验中,主要的数据结构是PCB的数据结构,具体如下:struct process char name;/进程名称int needtime;/进程所需要的运行时间int priority;/进程的优先级5.源程序#include#include#includestruct process char name;int n

3、eedtime;int priority;struct process readyQueue5;struct process run;struct process blockedQueue5;const struct process null=NULL,0,0;int readyQueueHead=0;int blockedQueueHead=0;int cpuState=0;int cpuTime=0;void Order(struct process parameter,int head);/将队列中的进程按优先级排列int Creat();void Dispath();int Timeo

4、ut();int EventWait();int EventOccur();void Order(struct process parameter,int head) int k,i; struct process temp; for(k=0;khead-1;k+) for(i=0;i=parameteri+1.priority) temp=parameteri; parameteri=parameteri+1; parameteri+1=temp;int Creat() if(readyQueueHead=5) printf(The Ready Queue has been fulln);

5、return 0;label1:printf( input new process name(must be a letter): n);scanf(%c,&(readyQueuereadyQueueHead.name);getchar();int k;for( k=0;kreadyQueueHead;k+)if(readyQueuereadyQueueHead.name=readyQueuek.name|readyQueuereadyQueueHead.name=readyQueuek.name+32|readyQueuereadyQueueHead.name=readyQueuek.nam

6、e-32)printf(the process is already exist!n);goto label1; for( k=0;kblockedQueueHead;k+)if(readyQueuereadyQueueHead.name=blockedQueuek.name|readyQueuereadyQueueHead.name=blockedQueuek.name+32|readyQueuereadyQueueHead.name=blockedQueuek.name-32)printf(the process is already exist!n);goto label1;if(rea

7、dyQueuereadyQueueHead.name=run.name|readyQueuereadyQueueHead.name=run.name+32|readyQueuereadyQueueHead.name=run.name-32) printf(the process is already exist!n); goto label1;printf(input needtime (input a int number):n);label2:scanf(%d,&(readyQueuereadyQueueHead.needtime);getchar();if(readyQueueready

8、QueueHead.needtime100)printf(please input the true needtime(1-100)n);goto label2;printf( input the priority(1-10): n);label3:scanf(%d,&(readyQueuereadyQueueHead.priority);getchar();if(readyQueuereadyQueueHead.priority10)printf(please 1-10!n);goto label3;readyQueueHead+; Order(readyQueue,readyQueueHe

9、ad);return 0;void Dispath() if (cpuState=0) readyQueueHead-; if(readyQueuereadyQueueHead.needtime0) Order(readyQueue,readyQueueHead); run=readyQueuereadyQueueHead; readyQueuereadyQueueHead=null; cpuState=1; else printf(no process in the Ready Queuen); else Timeout(); Dispath();int Timeout() cpuTime+

10、; if (run.name=NULL) return 0; readyQueuereadyQueueHead=run; run=null; cpuState=0; readyQueuereadyQueueHead.needtime-; if(readyQueuereadyQueueHead.needtime=0) printf(The process %c has finished,readyQueuereadyQueueHead.name); readyQueuereadyQueueHead=null; return 0; readyQueueHead+; Order(readyQueue

11、,readyQueueHead); return 0;int EventWait() if(blockedQueueHead=5) printf(error:The Blocked Queue has been fulln); return 0; if(cpuState=0) printf(error:no process in CPU); return 0; run.needtime-; blockedQueueblockedQueueHead=run; blockedQueueHead+; run=null; cpuState=0; cpuTime+; printf(The process

12、 is blocked!n); return 0;int EventOccur() if(readyQueueHead=5) printf(The Ready Queue has been fulln); return 0; printf(Please input the process name whose event occured!n); char name=getchar(); getchar(); int i; struct process temp; for(i=0;i0;i-) printf(%c %d %dn ,readyQueuei-1.name,readyQueuei-1.

13、needtime,readyQueuei-1.priority); else printf(null); printf(nRunning Process: ); if(run.name=NULL) printf(null); else printf(%c %d %dn ,run.name,run.needtime,run.priority); printf(nBlock Queue: ); if(blockedQueue0.name=NULL) printf(null); else for(i=blockedQueueHead;i0;i-) printf(%c %d %dn ,blockedQ

14、ueuei-1.name,blockedQueuei-1.needtime,blockedQueuei-1.priority);int main()SELECT: printf(nn1:input new processn2:Dispathn3:Timeoutn4:EventWaitn5:EventOccursn0:exitn); int select=getchar();getchar(); switch(select)case 1:Creat();Show();break;case 2:Dispath();Show();break;case 3:Timeout();Show();break

15、;case 4:EventWait();Show();break;case 5:EventOccur();Show();break;case 0:exit(0);default:printf(Please select from 0 to 5n);goto SELECT;return 0;6. 运行结果及其说明(1) 创建进程:按1创建进程,进程被放入就绪队列,并按优先级从高到低 排列。就绪队列最多容纳5个进程,当创建第6个进程时,程序会提示。(2)Dispath:按2将就绪队列中的进程转移到运行队列中,如果运行队列中已有进程 则该进程先执行一个时间片,然后回到就绪队列中,最后将新就绪队列中优先级最 大的进程放到运行队列中(3) Timeout:消耗一个时间片,若之前运行队列中有进程,则该进程所需执行时间减一并回到 就绪队列,否则什么也不发生(4) EventWait:当运行队列中有程序时,使用EventWait将该程序转移到阻塞队列(5) EventOccurs:在阻塞队列中选择一个事件发生的进程,将其放入就绪队列中。7. 程序使用说明(1) 输入1创建进程(2) 输入2将就绪队列中优先级最大的进程放入运行队列(3) 输入3消耗一个时间片(4) 输入4将正在运行状态的进程放入阻塞队列中(5) 输入5将阻塞的进程放入就绪队列中【精品文档】第 6 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁