模拟进程创建终止阻塞唤醒原语操作系统原理.docx
- 文档编号:4005251
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:17
- 大小:44.27KB
模拟进程创建终止阻塞唤醒原语操作系统原理.docx
《模拟进程创建终止阻塞唤醒原语操作系统原理.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语操作系统原理.docx(17页珍藏版)》请在冰豆网上搜索。
模拟进程创建终止阻塞唤醒原语操作系统原理
模拟进程创建、终止、阻塞、唤醒原语-操作系统原理
操作系统原理
题目:
模拟进程创建、终止、阻塞、唤醒原语
院(部):
管理工程学院
专业:
信息管理与信息系统
班级:
信管131
姓名:
栾庆一
学号:
20130216027
实验题目一:
模拟进程创建、终止、阻塞、唤醒原语
一、题目类型:
必做题目。
二、实验目的:
通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。
三、实验环境:
1、硬件:
pc机及其兼容机。
2、软件:
WindowsOS,TurboC或C++、VC++、VS.net、Java等。
四、实验内容:
1、设计创建、终止、阻塞、唤醒原语功能函数。
2、设计主函数,采用菜单结构(参见后面给出的流程图)。
3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。
五、算法流程图
系统主菜单
1…创建
2…阻塞
3…唤醒
4…终止
5…显示
0…退出
请输入您需要的功能(0-5):
六、程序清单
#include
#include
structpcb
{
charname[10];
intstatus;
intorder;
inttime;
intwtime;
intytime;
}pcb[11];//该结构体用于存储已经输入的进程
structghost
{
charname[10];
intstatus;
intorder;
inttime;
}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、运行时间");
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();//实验二添加函数 八、调试程序时出现问题及解决方法 问题一: 现象: 使用阻塞功能后,输出功能无法正常显示进程状态。 解决: 在进程的结构体中添加控制进程状态的变量。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 进程 创建 终止 阻塞 唤醒 操作系统 原理
![提示](https://static.bdocx.com/images/bang_tan.gif)