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

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

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

1、-第 1 页实验实验 2-进程状态进程状态转换及转换及其其 PCB 的的变化变化-第 2 页实验实验 2进程状态转换及其进程状态转换及其 PCB 的变化的变化1.目的目的自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的 PCB 内容、组织的变化,理解进程与其 PCB 间的一一对应关系。2.内容及要求内容及要求1)设计并实现一个模拟进程状态转换及其相应 PCB 内容、组织结构变化的程序。2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及 PCB 的组织形式可自行选择。3)合理设计与进程 PCB 相对应的数据结构。PC

2、B 的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应 PCB内容、组织结构的变化。5)代码书写要规范,要适当地加入注释。6)鼓励在实验中加入新的观点或想法,并加以实现。7)认真进行预习,完成预习报告。8)实验完成后,要认真总结,完成实验报告。3.程序流程图程序流程图进程的三种基本状态及其转换如下图所示。4.数据结构及说明数据结构及说明在本实验中,主要的数据结构是 PCB 的数据结构,具体如下:struct processchar name;/进程名称int needtime;/进程所需要的运行时间int priority;

3、/进程的优先级5.源程序源程序#include#include#includestruct processchar name;int needtime;int priority;struct process readyQueue5;struct process run;struct process blockedQueue5;const struct process null=NULL,0,0;-第 3 页int readyQueueHead=0;int blockedQueueHead=0;int cpuState=0;int cpuTime=0;void Order(struct proc

4、ess parameter,int head);/将队列中的进程按优先级排列int Creat();void Dispath();int Timeout();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 Cr

5、eat()if(readyQueueHead=5)printf(The Ready Queue has been fulln);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=read

6、yQueuek.name+32|readyQueuereadyQueueHead.name=readyQueuek.name-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-3

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

8、eadyQueuereadyQueueHead.needtime);getchar();if(readyQueuereadyQueueHead.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

9、);goto label3;readyQueueHead+;Order(readyQueue,readyQueueHead);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)

10、;else Timeout();Dispath();int Timeout()cpuTime+;if(run.name=NULL)return 0;readyQueuereadyQueueHead=run;run=null;cpuState=0;readyQueuereadyQueueHead.needtime-;if(readyQueuereadyQueueHead.needtime=0)printf(Theprocess%chasfinished,readyQueuereadyQueueHead.name);readyQueuereadyQueueHead=null;return 0;re

11、adyQueueHead+;Order(readyQueue,readyQueueHead);-第 5 页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;cpuTi

12、me+;printf(The process 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,readyQ

13、ueuei-1.needtime,readyQueuei-1.priority);else printf(null);printf(nRunning Process:);if(run.name=NULL)printf(null);elseprintf(%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,blockedQueuei-1.nam

14、e,blockedQueuei-1.needtime,blockedQueuei-1.priority);int main()SELECT:printf(nn1:inputnewprocessn2: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;case 4:EventWai

15、t();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消耗一个时间片-第 7 页(4)输入4将正在运行状态的进程放入阻塞队列中(5)输入5将阻塞的进程放入就绪队列中

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

当前位置:首页 > 应用文书 > 合同协议

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

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