模拟进程创建终止阻塞唤醒原语操作系统原理.docx
《模拟进程创建终止阻塞唤醒原语操作系统原理.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语操作系统原理.docx(16页珍藏版)》请在冰豆网上搜索。
模拟进程创建终止阻塞唤醒原语操作系统原理
模拟进程创建、终止、阻塞、唤醒原语-操作系统原理
操作系统原理
题目:
模拟进程创建、终止、阻塞、唤醒原语
院(部):
管理工程学院
专业:
信息管理与信息系统
班级:
信管131
姓名:
栾庆一
学号:
20130216027
实验题目一:
模拟进程创建、终止、阻塞、唤醒原语
一、题目类型:
必做题目。
二、实验目的:
通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。
三、实验环境:
1、硬件:
pc机及其兼容机。
2、软件:
WindowsOS,TurboC或C++、VC++、VS.net、Java等。
四、实验内容:
1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。
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、运行时间");
scanf("%d",&pcb[i].time);
for(y=0;y
{
if(strcmp(pcb[i].name,pcb[y].name)==0)
{
printf("您输入的进程名已经存在,请重新输入!
\n");
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);
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请输入您要改变状态的进程的进程名:
");
scanf("%s",&a_name);
for(y=0;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<=i;m++)
{
if(strcmp(ghost[m].name,a_name)==0)
{
ghost[m].status=0;
}
}
printf("操作已完成,进程成功改为阻塞状态\n");
}
}
}
if(a==0)
{
printf("对不起!
您查找的进程名不存在\n");
}
a=0;
}
voidrouse()
{
intm;
printf("\n请输入您要改变状态的进程的进程名:
");
scanf("%s",&a_name);
for(y=0;y<=i;y++)
{
if(strcmp(pcb[y].name,a_name)==0)
{
a=1;
if(pcb[y].status==1)
{
printf("您要修改的进程已经是就绪状态,无法更改\n");
break;
};
if(pcb[y].status==0)
{
pcb[y].status=1;
for(m=0;m<=i;m++)
{
if(strcmp(ghost[m].name,a_name)==0)
{
ghost[m].status=1;
}
}
printf("操作已完成,进程成功改为运行状态\n");
break;
}
}
}
if(a==0)
{
printf("对不起!
您查找的进程名不存在\n");
}
a=0;
}
voidstop()
{
printf("\n请输入您要改变状态的进程的进程名:
");
scanf("%s",&a_name);
for(y=0;y<=i;y++)
{
if(strcmp(pcb[y].name,a_name)==0)
{
a=1;
for(;y
{
pcb[y]=pcb[y+1];
}
i--;
printf("操作已完成,进程成功删除\n");
break;
}
}
if(a==0)
{
printf("对不起!
您查找的进程名不存在\n");
}
a=0;
}
voidoutPut()
{
if(i==0)
{
printf("对不起,没有进程存在,无法显示\n");
}
else
{
printf("\n\n已存在进程分别为:
(状态:
2表示正在运行,1表示就绪,0表示阻塞)\n");
for(y=0;y
{
if(pcb[y].status!
=3)printf("进程%d进程名:
%s状态:
%d\n",y+1,pcb[y].name,pcb[y].status);
}
}
}
voidcontrol()
{
for(;1;)
{
printf("进程调度子菜单\n0:
返回主菜单\n1:
优先级调度\n2:
时间片轮转调度\n请输入您想要进行的操作的指令:
");
scanf("%d",&x);
if(x==0)
break;
switch(x)
{
case0:
break;
case1:
order_control();
break;
case2:
time_control();
break;
default:
printf("您输入的指令有误,请重新输入\n");
break;
}
}
}
voidorder_control()
{
intjishi;//用于CPU运行时间计时
jishi=0;
charpanduan1,panduan2;//用于判断是否继续调度
structghostjiaohuan;
intgg,bl;
for(gg=0;gg
{
if(pcb[gg].status==2)
{
for(bl=0;bl
{
if(strcmp(ghost[bl].name,pcb[gg].name)==0)
{
ghost[bl].status=2;
}
}
}
}
for(x=0;x{
for(y=x+1;y
{
if(ghost[x].order{
jiaohuan=ghost[x];
ghost[x]=ghost[y];
ghost[y]=jiaohuan;
}
}
}//以上语句是根据优先级为进程排序
printf("\n\n按照优先级调度进程,具体内容为:
\n");
for(x=0;x
{
if(ghost[x].status==1){
printf("正在运行的进程:
%s\n优先级:
%d\n运行时间:
%d\n\n\n",ghost[x].name,ghost[x].order,ghost[x].time);
for(y=0;y<=i;y++)
{
if(strcmp(pcb[y].name,ghost[x].name)==0)
{
pcb[y].status=2;
ghost[x].status=2;
}
};//该语句用于更改另一个结构体进程的状态
printf("是否继续运行直至进程运行完毕(Y/N)");
scanf("%s",&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);
for(y=0;y<=i;y++)
{
if(strcmp(pcb[y].name,ghost[x].name)==0)
{
pcb[y].status=3;
ghost[x].status=3;
}
};//该语句用于更改另一个结构体进程的状态
if(x==(i-1))
{
printf("所有进程全部运行完毕!
\n-------------------------------------------------------\n");
}
else{
printf("--------------------------------------------------------------\n是否继续调度(y/n)");
scanf("%s",&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;
for(y=0;y
{
if(pcb[y].status==1)
{
kz5=kz5+1;
}
}
printf("\n\n请输入时间片长度:
");
scanf("%d",&x);
printf("\n\n按照时间片轮转调度进程,具体内容为:
\n");
if(kz5!
=0)
{
for(;kz4{
for(y=0;y
{
if(pcb[y].status==1||pcb[y].status==2)
{
for(kz1=0;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
{
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;
pcb[y].status=3;
for(kz6=0;kz6
{
if(strcmp(ghost[kz6].name,pcb[y].name)==0)
{
ghost[kz6].status=3;
}
}
kz1=x;
break;
}
printf("-------------------------------------------------------------------\n");
}}
}
}
}
}
printf("注意:
如果未输出过程,请检查就绪列表是否存在进程\n");
}
voidmain()
{
charc;
for(;1;)
{
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))
{
if(x==0)
break;
switch(x)
{
case1:
insert();
break;
case2:
block();
break;
case3:
rouse();
break;
case4:
stop();
break;
case5:
outPut();
break;
case6:
control();
break;
case0:
break;
default:
printf("格式非法,请重新输入\n");
break;
}
}
elseif(scanf("%c",&c))
{
printf("格式非法,请重新输入\n");
}
}
}
七、程序中使用的数据结构及符号说明
structpcb
{
charname[10];
intstatus;
intorder;
inttime;
intwtime;
intytime;
}pcb[11];//该结构体用于存储已经输入的进程
structghost
{
charname[10];
intstatus;
intorder;
inttime;
}ghost[11];//该结构体用于优先级调度时,进程的优先级排序
voidinsert();//添加进程
voidblock();//阻塞进程
voidrouse();//唤醒进程
voidstop();//删除进程
voidoutPut();//输出
voidcontrol();//实验二添加函数
voidorder_control();//实验二添加函数
voidtime_control();//实验二添加函数
八、调试程序时出现问题及解决方法
问题一:
现象:
使用阻塞功能后,输出功能无法正常显示进程状态。
解决:
在进程的结构体中添加控制进程状态的变量。