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

上传人:小飞机 文档编号:5174855 上传时间:2023-06-11 格式:DOCX 页数:13 大小:411.14KB
返回 下载 相关 举报
实验2进程状态转换及其PCB的变化.docx_第1页
第1页 / 共13页
实验2进程状态转换及其PCB的变化.docx_第2页
第2页 / 共13页
实验2进程状态转换及其PCB的变化.docx_第3页
第3页 / 共13页
实验2进程状态转换及其PCB的变化.docx_第4页
第4页 / 共13页
实验2进程状态转换及其PCB的变化.docx_第5页
第5页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验2进程状态转换及其PCB的变化.docx》由会员分享,可在线阅读,更多相关《实验2进程状态转换及其PCB的变化.docx(13页珍藏版)》请在三一办公上搜索。

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

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

3、ority;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 Timeout();int Event

4、Wait();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);return 0;label1:printf(

5、 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.name-32)printf(the proces

6、s 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(readyQueuereadyQueueHead.n

7、ame=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(readyQueuereadyQueueHead.needtime100)(p

8、rintf(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,readyQueueHead);return 0;void Disp

9、ath()(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+;if (run.name=NULL) return 0;rea

10、dyQueuereadyQueueHead=run;run=null;cpuState=0;readyQueuereadyQueueHead.needtime-;if(readyQueuereadyQueueHead.needtime=0)printf(Theprocess%chasfinished,readyQueuereadyQueueHead.name);readyQueuereadyQueueHead=null;return 0;readyQueueHead+;Order(readyQueue,readyQueueHead);return 0;int EventWait()(if(bl

11、ockedQueueHead=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 is blocked!n);return 0;int EventOccur()(if(readyQueueHead

12、=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.needtime,readyQueuei-1.priority);else printf(null);printf(nRunning Pr

13、ocess: );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”,blockedQueuei-1.name,blockedQueuei-1.needtime,blockedQueuei-1.priority);int main()SELECT:pr

14、intf(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:EventWait();Show();break;case 5:EventOccur();Show();break;case 0:exit(0);default

15、:printf(Please select from 0 to 5n);goto SELECT;return 0;6. 运行结果及其说明(1)创建进程:按1创建进程,进程被放入就绪队列,并按优先级从高到低 排列。就绪队列最多容纳5个进程,当创建第6个进程时,程序会提示。1 input the priority:10CPU time:0 name needtime priorityReady Queue:b110a34Running Process: nullBlock Queue:null1:input new process2:Dispath3:Timeout4:EuentWait5:Eue

16、ntOccurs 0:exit 1input new process nane: cinput needt ime : 6CPU time:0 name needtime priorityReady Queue:b110c56a34(2) Dispath:按2将就绪队列中的进程转移到运行队列中,如果运行队列中已有进程 则该进程先执行一个时间片,然后回到就绪队列中,最后将新就绪队列中优先级最 大的进程放到运行队列中Timeout:消耗一个时间片,若之前运行队列中有进程,则该进程所需执行时间减一并回到 就绪队列,否则什么也不发生(4) EventWait:当运行队列中有程序时,使用EventWait将该程序转移到阻塞队列(5) EventOccurs:在阻塞队列中选择一个事件发生的进程,将其放入就绪队列中。7. 程序使用说明(1) 输入1创建进程(2) 输入2将就绪队列中优先级最大的进程放入运行队列(3) 输入3消耗一个时间片(4) 输入4将正在运行状态的进程放入阻塞队列中(5) 输入5将阻塞的进程放入就绪队列中

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号