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

上传人:b****6 文档编号:7341968 上传时间:2023-05-11 格式:DOCX 页数:17 大小:30.01KB
下载 相关 举报
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第1页
第1页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第2页
第2页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第3页
第3页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第4页
第4页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第5页
第5页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第6页
第6页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第7页
第7页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第8页
第8页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第9页
第9页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第10页
第10页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第11页
第11页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第12页
第12页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第13页
第13页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第14页
第14页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第15页
第15页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第16页
第16页 / 共17页
模拟进程创建终止阻塞唤醒原语操作系统原理讲解.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

模拟进程创建终止阻塞唤醒原语操作系统原理讲解

 

 

操作系统原理

 

题目:

模拟进程创建、终止、阻塞、唤醒原语

院(部):

管理工程学院

专业:

信息管理与信息系统

班级:

信管131

姓名:

栾庆一

学号:

20130216027

 

实验题目一:

模拟进程创建、终止、阻塞、唤醒原语

一、题目类型:

必做题目。

二、实验目的:

通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。

三、实验环境:

1、硬件:

pc机及其兼容机。

2、软件:

WindowsOS,TurboC或C++、VC++、VS.net、Java等。

四、实验内容:

1、设计创建、终止、阻塞、唤醒原语功能函数。

2、设计主函数,采用菜单结构(参见后面给出的流程图)。

3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。

五、算法流程图

开始

系统主菜单

1…创建

2…阻塞

3…唤醒

4…终止

5…显示

0…退出

请输入您需要的功能(0-5):

输入选择=?

5

4

3

2

1

0

退出

创建

阻塞

唤醒

终止

显示

结束

六、程序清单

#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();//实验二添加函数

八、调试程序时出现问题及解决方法

问题一:

现象:

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

解决:

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

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2