模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx
- 文档编号:16614580
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:9
- 大小:17.64KB
模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx
《模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语操作系统原理Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
五、算法流程图
开始
系统主菜单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();
//实验二添加函数八、调试程序时出现问题及解决方法问题一:
现象:
使用阻塞功能后,输出功能无法正常显示进程状态。
解决:
在进程的结构体中添加控制进程状态的变量。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 进程 创建 终止 阻塞 唤醒 操作系统 原理
![提示](https://static.bdocx.com/images/bang_tan.gif)