实验2进程状态转换及其PCB的变化Word文档格式.docx
《实验2进程状态转换及其PCB的变化Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验2进程状态转换及其PCB的变化Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
intpriority;
//进程的优先级
};
5.源程序
#include<
stdio.h>
stdlib.h>
string.h>
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)
{
printf("
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)
{
gotolabel1;
inputneedtime(inputaintnumber):
label2:
%d"
(readyQueue[readyQueueHead].needtime));
if(readyQueue[readyQueueHead].needtime<
1||readyQueue[readyQueueHead].needtime>
100)
printf("
pleaseinputthetrueneedtime(1--100)\n"
gotolabel2;
inputthepriority(1--10):
label3:
(readyQueue[readyQueueHead].priority));
if(readyQueue[readyQueueHead].priority<
1||readyQueue[readyQueueHead].priority>
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();
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:
inputnewprocess\n2:
Dispath\n3:
Timeout\n4:
EventWait\n5:
EventOccurs\n0:
exit\n"
intselect=getchar();
switch(select)
case'
1'
:
Creat();
Show();
break;
2'
Dispath();
3'
Timeout();
4'
EventWait();
5'
EventOccur();
0'
exit(0);
default:
printf("
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’将阻塞的进程放入就绪队列中