模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx
《模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语操作系统原理Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
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();
//添加进程
//阻塞进程
//唤醒进程
//删除进程
//输出
八、调试程序时出现问题及解决方法
问题一:
现象:
使用阻塞功能后,输出功能无法正常显示进程状态。
解决:
在进程的结构体中添加控制进程状态的变量。