实验2进程状态转换及其PCB的变化Word文档格式.docx

上传人:b****1 文档编号:4088619 上传时间:2023-05-02 格式:DOCX 页数:16 大小:283.49KB
下载 相关 举报
实验2进程状态转换及其PCB的变化Word文档格式.docx_第1页
第1页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第2页
第2页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第3页
第3页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第4页
第4页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第5页
第5页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第6页
第6页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第7页
第7页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第8页
第8页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第9页
第9页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第10页
第10页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第11页
第11页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第12页
第12页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第13页
第13页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第14页
第14页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第15页
第15页 / 共16页
实验2进程状态转换及其PCB的变化Word文档格式.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验2进程状态转换及其PCB的变化Word文档格式.docx

《实验2进程状态转换及其PCB的变化Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验2进程状态转换及其PCB的变化Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。

实验2进程状态转换及其PCB的变化Word文档格式.docx

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’将阻塞的进程放入就绪队列中

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

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2