模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx

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

模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx

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

模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx

五、算法流程图

开始

系统主菜单1…创建2…阻塞3…唤醒4…终止5…显示0…退出请输入您需要的功能(0-5):

输入选择=?

543210

退出创建阻塞唤醒终止显示

结束

六、程序清单#include#includestructpcb{

charname[10];

intstatus;

intorder;

inttime;

intwtime;

intytime;

}pcb[11];

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

}ghost[11];

//该结构体用于优先级调度时,进程的优先级排序chara_name[10];

inti=0,y,a=0,x,z,jilu;

voidinsert();

voidblock();

voidrouse();

voidstop();

voidoutPut();

voidcontrol();

//实验二添加函数voidorder_control();

//实验二添加函数voidtime_control();

//实验二添加函数voidinsert(){

jilu=0;

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

if(i>

=10)

printf(“进程已经存在10个,无法继续添加进程\n“);

else

{

printf(“请输入插入pcb的数据:

\n“);

printf(“1、进程名:

“);

scanf(“%s“,&

pcb[i].name);

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

scanf(“%d“,&

pcb[i].order);

printf(“3、运行时间“);

pcb[i].time);

for(y=0;

y0)jilu=0;

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

\n进程名:

%s\n优先级:

%d\n运行时间:

%d\n“,pcb[i].name,pcb[i].order,pcb[i].time);

printf(“------------------------------------------------------------------\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请输入您要改变状态的进程的进程名:

“);

a_name);

y<

=i;

y++)

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

a=1;

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

printf(“您要修改的进程已经是阻塞状态,无法更改\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;

printf(“操作已完成,进程成功改为阻塞状态\n“);

if(a==0)

printf(“对不起!

您查找的进程名不存在\n“);

a=0;

}voidrouse(){

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

printf(“您要修改的进程已经是就绪状态,无法更改\n“);

break;

};

pcb[y].status=1;

ghost[m].status=1;

printf(“操作已完成,进程成功改为运行状态\n“);

}voidstop(){

for(;

i;

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

i--;

printf(“操作已完成,进程成功删除\n“);

}voidoutPut(){

if(i==0)

printf(“对不起,没有进程存在,无法显示\n“);

printf(“\n\n

已存在进程分别为:

(状态:

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

if(pcb[y].status!

=3)printf(“进程%d

进程名:

%s

状态:

%d\n“,y+1,pcb[y].name,pcb[y].status);

}}voidcontrol(){

1;

printf(“进程调度子菜单\n0

:

返回主菜单\n1

优先级调度\n2

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

x);

if(x==0)

switch(x)

case0:

case1:

order_control();

case2:

time_control();

default:

printf(“您输入的指令有误,请重新输入\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;

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

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

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

printf(“正在运行的进程:

%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;

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

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

panduan1);

if(panduan1=='Y'||panduan1=='y')

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

jishi=jishi+ghost[x].time;

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

\n“,jishi,ghost[x].name);

pcb[y].status=3;

ghost[x].status=3;

if(x==(i-1))

printf(“所有进程全部运行完毕!

\n-------------------------------------------------------\n“);

else{

printf(“--------------------------------------------------------------\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的状态值

=0;

kz2=0;

kz4=0;

kz5=0;

kz5=kz5+1;

printf(“\n\n请输入时间片长度:

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

if(kz5!

=0)

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;

printf(“CPU运行时间:

%d,正在运行进程:

%s\n“,kz2,pcb[y].name);

printf(“进程名

已运行时间

未运行时间

要求运行时间\n“);

for(kz3=0;

kz3<

kz3++)

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

printf(“%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)

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

\n-------------------------------------------------------------------\n“,pcb[y].name);

kz4=kz4+1;

for(kz6=0;

kz6<

kz6++)

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

ghost[kz6].status=3;

kz1=x;

printf(“-------------------------------------------------------------------\n“);

}}

printf(“注意:

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

}voidmain(){

charc;

printf(“系统主菜单\n“);

printf(“1、创建\n“);

printf(“2、阻塞\n“);

printf(“3、唤醒\n“);

printf(“4、终止\n“);

printf(“5、显示\n“);

printf(“6、调度\n“);

printf(“0、退出\n“);

printf(“请输入操作指令:

if(scanf(“%d“,&

x))

insert();

block();

case3:

rouse();

case4:

stop();

case5:

outPut();

case6:

control();

printf(“格式非法,请重新输入\n“);

elseif(scanf(“%c“,&

c))

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

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

//添加进程voidblock();

//阻塞进程voidrouse();

//唤醒进程voidstop();

//删除进程voidoutPut();

//输出voidcontrol();

//实验二添加函数八、调试程序时出现问题及解决方法问题一:

现象:

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

解决:

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

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

当前位置:首页 > 求职职场 > 简历

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

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