模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx

上传人:b****6 文档编号:16304053 上传时间:2022-11-22 格式:DOCX 页数:16 大小:61.86KB
下载 相关 举报
模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx_第1页
第1页 / 共16页
模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx_第2页
第2页 / 共16页
模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx_第3页
第3页 / 共16页
模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx_第4页
第4页 / 共16页
模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx

《模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx

voidcontrol();

//实验二添加函数

voidorder_control();

voidtime_control();

voidinsert()

{

jilu=0;

//jilu是一个用于判断的变量,在重复时进行判断跳过

if(i>

=10)

printf("

进程已经存在10个,无法继续添加进程\n"

);

else

{

请输入插入pcb的数据:

\n"

1、进程名:

"

scanf("

%s"

&

pcb[i].name);

2、该进程的优先级(1-10):

%d"

pcb[i].order);

3、运行时间"

pcb[i].time);

for(y=0;

y<

i;

y++)

{

if(strcmp(pcb[i].name,pcb[y].name)==0)

{

printf("

您输入的进程名已经存在,请重新输入!

jilu=y+1;

}

}

if(jilu>

0)jilu=0;

else

printf("

输入已经完成\n您输入的数据为:

\n进程名:

%s\n优先级:

%d\n运行时间:

%d\n"

pcb[i].name,pcb[i].order,pcb[i].time);

------------------------------------------------------------------\n"

strcpy(ghost[i].name,pcb[i].name);

ghost[i].order=pcb[i].order;

ghost[i].time=pcb[i].time;

pcb[i].status=1;

ghost[i].status=1;

pcb[i].wtime=pcb[i].time;

pcb[i].ytime=0;

i++;

}

}

voidblock()

{

intm;

printf("

\n请输入您要改变状态的进程的进程名:

"

scanf("

a_name);

for(y=0;

=i;

if(strcmp(pcb[y].name,a_name)==0)

a=1;

if(pcb[y].status==0)

您要修改的进程已经是阻塞状态,无法更改\n"

}

if(pcb[y].status==2)

pcb[y].status=0;

for(m=0;

m<

m++)

{

if(strcmp(ghost[m].name,a_name)==0)

{

ghost[m].status=0;

}

}

操作已完成,进程成功改为阻塞状态\n"

}

if(a==0)

对不起!

您查找的进程名不存在\n"

a=0;

voidrouse()

if(pcb[y].status==1)

您要修改的进程已经是就绪状态,无法更改\n"

break;

};

pcb[y].status=1;

ghost[m].status=1;

操作已完成,进程成功改为运行状态\n"

break;

voidstop()

for(;

pcb[y]=pcb[y+1];

i--;

操作已完成,进程成功删除\n"

break;

voidoutPut()

if(i==0)

对不起,没有进程存在,无法显示\n"

else

\n\n已存在进程分别为:

(状态:

2表示正在运行,1表示就绪,0表示阻塞)\n"

if(pcb[y].status!

=3)printf("

进程%d进程名:

%s状态:

y+1,pcb[y].name,pcb[y].status);

voidcontrol()

for(;

1;

进程调度子菜单\n0:

返回主菜单\n1:

优先级调度\n2:

时间片轮转调度\n请输入您想要进行的操作的指令:

 "

x);

if(x==0)

switch(x)

case0:

case1:

order_control();

case2:

time_control();

default:

您输入的指令有误,请重新输入\n"

voidorder_control()

intjishi;

//用于CPU运行时间计时

jishi=0;

charpanduan1,panduan2;

//用于判断是否继续调度

structghostjiaohuan;

intgg,bl;

for(gg=0;

gg<

gg++)

if(pcb[gg].status==2)

for(bl=0;

bl<

bl++)

if(strcmp(ghost[bl].name,pcb[gg].name)==0)

ghost[bl].status=2;

for(x=0;

x<

i-1;

x++)

for(y=x+1;

if(ghost[x].order<

ghost[y].order)

jiaohuan=ghost[x];

ghost[x]=ghost[y];

ghost[y]=jiaohuan;

}//以上语句是根据优先级为进程排序

\n\n按照优先级调度进程,具体内容为:

if(ghost[x].status==1){

正在运行的进程:

%d\n\n\n"

ghost[x].name,ghost[x].order,ghost[x].time);

if(strcmp(pcb[y].name,ghost[x].name)==0)

pcb[y].status=2;

ghost[x].status=2;

//该语句用于更改另一个结构体进程的状态

是否继续运行直至进程运行完毕(Y/N)"

panduan1);

if(panduan1=='

Y'

||panduan1=='

y'

if(ghost[x].status==2)

jishi=jishi+ghost[x].time;

CPU运行时间%d,进程%s运行完毕,正在关闭!

jishi,ghost[x].name);

pcb[y].status=3;

ghost[x].status=3;

if(x==(i-1))

所有进程全部运行完毕!

\n-------------------------------------------------------\n"

else{

--------------------------------------------------------------\n是否继续调度(y/n)"

panduan2);

if(panduan2=='

N'

||panduan2=='

n'

)break;

}}elsebreak;

}printf("

如果无输出内容,请检查就绪队列是否存在进程"

voidtime_control()

intz,kz1,kz2,kz3,kz4,kz5,kz6;

//kz1表示时间片运行的时间计时,kz2表示CPU运行的总时间,kz3用于所有进程时间的输出kz4表示已完成的进程数kz5用于表示状态为就绪的进程的个数kz6用于更改ghost的状态值

z=0;

kz2=0;

kz4=0;

kz5=0;

if(pcb[y].status==1)

kz5=kz5+1;

\n\n请输入时间片长度:

\n\n按照时间片轮转调度进程,具体内容为:

if(kz5!

=0)

for(;

kz4<

kz5;

if(pcb[y].status==1||pcb[y].status==2)

for(kz1=0;

kz1<

x;

kz1++)

if(pcb[y].status==1||pcb[y].status==2){

kz2=kz2+1;

pcb[y].wtime=pcb[y].wtime-1;

pcb[y].ytime=pcb[y].ytime+1;

CPU运行时间:

%d,正在运行进程:

%s\n"

kz2,pcb[y].name);

进程名已运行时间未运行时间要求运行时间\n"

for(kz3=0;

kz3<

kz3++)

if(pcb[kz3].status==1||pcb[kz3].status==2)

%s%12d%12d%12d\n"

pcb[kz3].name,pcb[kz3].ytime,pcb[kz3].wtime,pcb[kz3].time);

if(pcb[y].wtime<

=0&

&

pcb[y].status!

=3)

进程%s运行完毕,正在关闭!

\n-------------------------------------------------------------------\n"

pcb[y].name);

kz4=kz4+1;

pcb[y].status=3;

for(kz6=0;

kz6<

kz6++)

{

if(strcmp(ghost[kz6].name,pcb[y].name)==0)

{

ghost[kz6].status=3;

}

}

kz1=x;

break;

-------------------------------------------------------------------\n"

}}

注意:

如果未输出过程,请检查就绪列表是否存在进程\n"

voidmain()

charc;

系统主菜单\n"

1、创建\n"

2、阻塞\n"

3、唤醒\n"

4、终止\n"

5、显示\n"

6、调度\n"

0、退出\n"

请输入操作指令:

if(scanf("

x))

if(x==0)

switch(x)

case1:

insert();

case2:

block();

case3:

rouse();

case4:

stop();

case5:

outPut();

case6:

control();

case0:

default:

格式非法,请重新输入\n"

elseif(scanf("

%c"

c))

七、程序中使用的数据结构及符号说明

structpcb

charname[10];

intstatus;

intorder;

inttime;

intwtime;

intytime;

}pcb[11];

//该结构体用于存储已经输入的进程

structghost

}ghost[11];

//该结构体用于优先级调度时,进程的优先级排序

voidinsert();

//添加进程

//阻塞进程

//唤醒进程

//删除进程

//输出

八、调试程序时出现问题及解决方法

问题一:

现象:

使用阻塞功能后,输出功能无法正常显示进程状态。

解决:

在进程的结构体中添加控制进程状态的变量。

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

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1