实验2进程状态转换及其PCB的变化Word文件下载.docx
- 文档编号:22032554
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:13
- 大小:127.06KB
实验2进程状态转换及其PCB的变化Word文件下载.docx
《实验2进程状态转换及其PCB的变化Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验2进程状态转换及其PCB的变化Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
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<
stdio.h>
stdlib.h>
string.h>
structprocess{
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<
head-1;
k++){
for(i=0;
i<
head-k-1;
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:
inputnewprocessname(mustbealetter):
\n"
scanf("
%c"
&
(readyQueue[readyQueueHead].name));
getchar();
intk;
for(k=0;
readyQueueHead;
k++)
if(readyQueue[readyQueueHead].name==readyQueue[k].name||readyQueue[readyQueueHead].name==readyQueue[k].name+32||readyQueue[readyQueueHead].name==readyQueue[k].name-32)
{
theprocessisalreadyexist!
\n"
gotolabel1;
blockedQueueHead;
if(readyQueue[readyQueueHead].name==blockedQueue[k].name||readyQueue[readyQueueHead].name==blockedQueue[k].name+32||readyQueue[readyQueueHead].name==blockedQueue[k].name-32)
if(readyQueue[readyQueueHead].name==run.name||readyQueue[readyQueueHead].name==run.name+32||readyQueue[readyQueueHead].name==run.name-32)
inputneedtime(inputaintnumber):
label2:
%d"
(readyQueue[readyQueueHead].needtime));
if(readyQueue[readyQueueHead].needtime<
1||readyQueue[readyQueueHead].needtime>
100)
pleaseinputthetrueneedtime(1--100)\n"
gotolabel2;
inputthepriority(1--10):
label3:
(readyQueue[readyQueueHead].priority));
if(readyQueue[readyQueueHead].priority<
1||readyQueue[readyQueueHead].prio
rity>
10)
please1--10!
gotolabel3;
readyQueueHead++;
Order(readyQueue,readyQueueHead);
voidDispath(){
if(cpuState==0){
readyQueueHead--;
if(readyQueue[readyQueueHead].needtime>
0){
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){
Theprocess'
%c'
hasfinished"
readyQueue[readyQueueHead].name);
intEventWait(){
if(blockedQueueHead>
error:
TheBlockedQueuehasbeenfull\n"
if(cpuState==0){
noprocessinCPU"
run.needtime--;
blockedQueue[blockedQueueHead]=run;
blockedQueueHead++;
Theprocessisblocked!
intEventOccur(){
Pleaseinputtheprocessnamewhoseeventoccured!
charname=getchar();
inti;
if(name==blockedQueue[i].name){
blockedQueueHead--;
readyQueue[readyQueueHead]=blockedQueue[i];
blockedQueue[i]=blockedQueue[blockedQueueHead];
blockedQueue[blockedQueueHead]=null;
Theprocess%cisready!
name);
if(i==blockedQueueHead){
Thisprocesshasnotbeenblocked!
intShow(){
\nCPUtime:
%d\n"
cpuTime);
nameneedtimepriority\n"
ReadyQueue:
"
if(readyQueue[0].name!
=NULL)
for(i=readyQueueHead;
i>
0;
i--)
%c%d%d\n"
readyQueue[i-1].name,readyQueue[i-1].needtime,readyQueue[i-1].priority);
null"
\nRunningProcess:
if(run.name==NULL)printf("
run.name,run.needtime,run.priority);
\nBlockQueue:
if(blockedQueue[0].name==NULL)printf("
elsefor(i=blockedQueueHead;
blockedQueue[i-1].name,blockedQueue[i-1].needtime,blockedQueue[i-1].priority);
intmain(){
SELECT:
\n\n1:
inputnew
process\n2:
Dispath\n3:
Timeout\n4:
EventWait\n5:
EventOccurs\n0:
exit\n"
intselect=getchar();
switch(select)
case'
1'
:
Creat();
Show();
break;
2'
3'
4'
EventWait();
5'
EventOccur();
0'
exit(0);
default:
Pleaseselectfrom0to5\n"
gotoSELECT;
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 变化