实验2进程状态转换及其PCB的变化.docx
- 文档编号:8896405
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:13
- 大小:127.06KB
实验2进程状态转换及其PCB的变化.docx
《实验2进程状态转换及其PCB的变化.docx》由会员分享,可在线阅读,更多相关《实验2进程状态转换及其PCB的变化.docx(13页珍藏版)》请在冰豆网上搜索。
实验2进程状态转换及其PCB的变化
实验2进程状态转换及其PCB的变化
实验2进程状态转换及其PCB的变化1.目的
自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。
2.内容及要求
1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的
程序。
2)独立编写、调试程序。
进程的数目、进程的状态模型(三状态、五状态、
七状态或其它)以及PCB的组织形式可自行选择。
3)合理设计与进程PCB相对应的数据结构。
PCB的内容要涵盖进程的基
本信息、控制信息、资源需求及现场信息。
4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB
内容、组织结构的变化。
5)代码书写要规范,要适当地加入注释。
6)鼓励在实验中加入新的观点或想法,并加以实现。
7)认真进行预习,完成预习报告。
8)实验完成后,要认真总结,完成实验报告。
3.程序流程图
进程的三种基本状态及其转换如下图所示。
开始
输入要执行的指令
创建进程
就绪队列已NY满,1,
Y提示就绪队列
已满
N
该进程执行一个时间片
后放回就绪队列Y有进程处于Y2,运行状态?
N将就绪队列中优先级最
高的进程放入运行队列N
该进程所需执有进程处于行时间减1,并Cputime++Y3,运行状态?
回到就绪队列
N将该进程放入阻塞
队列Y有进程处于Y4,运行状态,
N提示无运行的进程
N将该进程放入
就绪队列
Y输入事件发生阻塞队列中有该5,的进程名称进程,N
提示该进程并
未阻塞N
提示输入错误N0,
Y
结束
4.数据结构及说明
在本实验中,主要的数据结构是PCB的数据结构,具体如下:
structprocess{
charname;//进程名称
intneedtime;//进程所需要的运行时间
intpriority;//进程的优先级
};
5.源程序
#include
#include
#include
structprocess{
charname;
intneedtime;
intpriority;
};
structprocessreadyQueue[5];
structprocessrun;
structprocessblockedQueue[5];conststructprocessnull={NULL,0,0};
intreadyQueueHead=0;
intblockedQueueHead=0;
intcpuState=0;
intcpuTime=0;
voidOrder(structprocessparameter[],inthead);//将队列中的进程按优先级排列intCreat();
voidDispath();
intTimeout();
intEventWait();
intEventOccur();
voidOrder(structprocessparameter[],inthead){
intk,i;
structprocesstemp;
for(k=0;k for(i=0;i if(parameter[i].priority>=parameter[i+1].priority){ temp=parameter[i]; parameter[i]=parameter[i+1]; parameter[i+1]=temp; } } } } intCreat(){ if(readyQueueHead>=5){ printf("TheReadyQueuehasbeenfull\n"); return0; } label1: printf("inputnewprocessname(mustbealetter): \n"); scanf("%c",&(readyQueue[readyQueueHead].name));getchar(); intk; for(k=0;k if(readyQueue[readyQueueHead].name==readyQueue[k].name||readyQueue[readyQueueHead].name==readyQueue[k].name+32||readyQueue[readyQueueHead].name==readyQueue[k].name-32) { printf("theprocessisalreadyexist! \n"); gotolabel1; } for(k=0;k if(readyQueue[readyQueueHead].name==blockedQueue[k].name||readyQueue[readyQueueHead].name==blockedQueue[k].name+32||readyQueue[readyQueueHead].name==blockedQueue[k].name-32) { printf("theprocessisalreadyexist! \n"); gotolabel1; } if(readyQueue[readyQueueHead].name==run.name||readyQueue[readyQueueHead].name==run.name+32||readyQueue[readyQueueHead].name==run.name-32) { printf("theprocessisalreadyexist! \n"); gotolabel1; } printf("inputneedtime(inputaintnumber): \n"); label2: scanf("%d",&(readyQueue[readyQueueHead].needtime));getchar(); if(readyQueue[readyQueueHead].needtime<1||readyQueue[readyQueueHead].needtime>100) { printf("pleaseinputthetrueneedtime(1--100)\n"); gotolabel2; } printf("inputthepriority(1--10): \n");label3: scanf("%d",&(readyQueue[readyQueueHead].priority));getchar(); if(readyQueue[readyQueueHead].priority<1||readyQueue[readyQueueHead].prio rity>10) { printf("please1--10! \n"); gotolabel3; } readyQueueHead++; Order(readyQueue,readyQueueHead); return0; } voidDispath(){ if(cpuState==0){ readyQueueHead--; if(readyQueue[readyQueueHead].needtime>0){ Order(readyQueue,readyQueueHead); run=readyQueue[readyQueueHead]; readyQueue[readyQueueHead]=null; cpuState=1; } elseprintf("noprocessintheReadyQueue\n"); } else{ Timeout(); Dispath(); } } intTimeout(){ cpuTime++; if(run.name==NULL)return0; readyQueue[readyQueueHead]=run; run=null; cpuState=0; readyQueue[readyQueueHead].needtime--; if(readyQueue[readyQueueHead].needtime==0){ printf("Theprocess'%c'hasfinished",readyQueue[readyQueueHead].name); readyQueue[readyQueueHead]=null; return0; } readyQueueHead++; Order(readyQueue,readyQueueHead); return0; } intEventWait(){ if(blockedQueueHead>=5){ printf("error: TheBlockedQueuehasbeenfull\n"); return0; } if(cpuState==0){ printf("error: noprocessinCPU"); return0; } run.needtime--; blockedQueue[blockedQueueHead]=run; blockedQueueHead++; run=null; cpuState=0; cpuTime++; printf("Theprocessisblocked! \n"); return0; } intEventOccur(){ if(readyQueueHead>=5){ printf("TheReadyQueuehasbeenfull\n"); return0; } printf("Pleaseinputtheprocessnamewhoseeventoccured! \n"); charname=getchar(); getchar(); inti; structprocesstemp; for(i=0;i if(name==blockedQueue[i].name){ blockedQueueHead--; readyQueue[readyQueueHead]=blockedQueue[i]; readyQueueHead++; blockedQueue[i]=blockedQueue[blockedQueueHead]; blockedQueue[blockedQueueHead]=null; Order(readyQueue,readyQueueHead); printf("Theprocess%cisready! \n",name); return0; } } if(i==blockedQueueHead){ printf("error: Thisprocesshasnotbeenblocked! \n"); } return0; } intShow(){ printf("\nCPUtime: %d\n",cpuTime); printf("nameneedtimepriority\n"); printf("ReadyQueue: "); inti; if(readyQueue[0].name! =NULL) for(i=readyQueueHead;i>0;i--) printf("%c%d%d\n",readyQueue[i-1].name,readyQueue[i-1].needtime,readyQueue[i-1].priority); elseprintf("null"); printf("\nRunningProcess: "); if(run.name==NULL)printf("null"); elseprintf("%c%d%d\n",run.name,run.needtime,run.priority); printf("\nBlockQueue: "); if(blockedQueue[0].name==NULL)printf("null"); elsefor(i=blockedQueueHead;i>0;i--) printf("%c%d%d\n",blockedQueue[i-1].name,blockedQueue[i-1].needtime,blockedQueue[i-1].priority); } intmain(){ SELECT: printf("\n\n1: inputnew process\n2: Dispath\n3: Timeout\n4: EventWait\n5: EventOccurs\n0: exit\n"); intselect=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: printf("Pleaseselectfrom0to5\n"); } gotoSELECT; return0; 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’将阻塞的进程放入就绪队列中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 进程 状态 转换 及其 PCB 变化