模拟进程创建终止阻塞唤醒原语附带注释课件.docx

上传人:b****5 文档编号:29382730 上传时间:2023-07-22 格式:DOCX 页数:21 大小:159.59KB
下载 相关 举报
模拟进程创建终止阻塞唤醒原语附带注释课件.docx_第1页
第1页 / 共21页
模拟进程创建终止阻塞唤醒原语附带注释课件.docx_第2页
第2页 / 共21页
模拟进程创建终止阻塞唤醒原语附带注释课件.docx_第3页
第3页 / 共21页
模拟进程创建终止阻塞唤醒原语附带注释课件.docx_第4页
第4页 / 共21页
模拟进程创建终止阻塞唤醒原语附带注释课件.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

模拟进程创建终止阻塞唤醒原语附带注释课件.docx

《模拟进程创建终止阻塞唤醒原语附带注释课件.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语附带注释课件.docx(21页珍藏版)》请在冰豆网上搜索。

模拟进程创建终止阻塞唤醒原语附带注释课件.docx

模拟进程创建终止阻塞唤醒原语附带注释课件

题目:

计算机操作系统模拟

院系:

信息学院

专业:

计算机科学与技术

班级:

2013级1班

辽宁大学

实验题目一:

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

一、题目类型:

必做题目。

二、实验目的:

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

三、实验环境:

1、硬件:

pc机及其兼容机。

2、软件:

WindowsXP,TurboC或C++、VC++等。

四、实验内容:

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

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

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

五、实验要求:

进程名:

用P1,P2标识。

优先级:

为实验题目二做准备。

运行时间:

为实验题目二做准备。

状态为:

就绪、运行、阻塞,三种基本状态。

指针:

指向下一个PCB。

1、进程PCB中应包含以下内容:

进程名

优先级

运行时间

状态

指针

2、系统总体结构:

系统主菜单

1…创建

2…阻塞

3…唤醒

4…终止

5…显示

0…退出

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

5

4

3

2

1

0

另加实验二:

模拟进程调度功能

/*PCB的组织方式:

线性方式*/

#include"stdio.h"

#include"string.h"

#include"windows.h"

typedefstruct

{

charp_name[10];//进程名

charp_pro;//优先级1-3个级别1.低2.中3.高

charp_status;//运行状态0.阻塞1.运行2.就绪

intp_runtime;//运行时间

intp_wait;//等待时间

structPCB*next;//指针,指向下一个PCB

}PCB;

voidRun(PCB*head)//任何时候保证程序里面至少有一个进程在运行

{

PCB*p=head->next;//直接将P指向第一个结点

while(p!

=NULL)//遍历一遍链表,将所有就绪队列等待时间加1,防止前面结点因为唤醒又进入运行状态

{

if(p->p_status=='2')

{

p->p_wait++;//将等待时间加1

}

p=p->next;

}

p=head->next;//将P重置在第一个结点

while(p->p_status!

='1'&&p!

=NULL)

{

if(p->p_status=='2')//防止线性链表前面的结点因为从阻塞唤醒后又进入运行状态

{

p->p_status='1';

p->p_wait=2;

}

if(p->p_status=='1')//对上一个if进行处理

{

return;

}

p=p->next;

}

return;

}

voidInsert(PCB*head,PCB*temp)//插入链表函数

{

PCB*p;

p=head;//将头结点保存起来

while(p->next!

=NULL)

{

p=p->next;

}

p->next=temp;

temp->next=NULL;

}

intCheck(PCB*head,PCB*temp)

{

PCB*p=head;

while(p->next)

{

p=p->next;

if(strcmp(p->p_name,temp->p_name)==0)

return0;

}

return1;

}

voidCreate(PCB*head)//创建进程函数

{

intchk=0;

PCB*temp;//申请临时存储空间,方便接受数据

temp=(PCB*)malloc(sizeof(PCB));

system("cls");

printf("\t----------进程创建-----------\n");

printf("\n请输入进程名:

");

scanf("%s",temp->p_name);

getchar();

/*检查进程名称,如果相同则返回主界面*/

chk=Check(head,temp);

if(chk==0)

{

printf("进程队列已有该名称进程,创建失败,即将返回主界面.\n");

system("pause");

return;

}

printf("\n请输入进程优先级(1.低2.中3.高):

");

scanf("%c",&temp->p_pro);

getchar();

printf("\n请输入进程运行时间:

");

scanf("%d",&temp->p_runtime);

getchar();

temp->p_status='2';

temp->p_wait=2;

/*

printf("\n请输入该进程状态:

");

scanf("%c",&temp->p_status);

getchar();

*/

Insert(head,temp);//调用插入链表函数

system("pause");

Run(head);

}

voidShow(PCB*head)//显示队列进程函数

{

intready=1,block=1,run=1;

PCB*p=head,*q;

system("cls");

if(p->next==NULL)

{

printf("目前系统中没有进程.请返回主界面创建进程!

\n");

system("pause");

return;

}

/*列出就绪队列列表*/

q=p->next;//指针指到第一个结点

printf("\n--就绪队列--\n");

while(q)

{

if(q->p_status=='2')

{

printf("%d)进程名:

%s",ready++,q->p_name);

printf("进程优先级:

%c",q->p_pro);

printf("进程运行时间:

%d",q->p_runtime);

printf("进程等待时间:

%d\n",q->p_wait);

}

q=q->next;

}

printf("\n");

/*列出运行队列列表*/

q=p->next;//将指针重置到第一个结点

printf("\n--运行队列--\n");

while(q)

{

if(q->p_status=='1')

{

printf("%d)进程名:

%s",run++,q->p_name);

printf("进程优先级:

%c",q->p_pro);

printf("进程运行时间:

%d\n",q->p_runtime);

//printf("进程已运行时间:

");

}

q=q->next;

}

printf("\n");

/*列出阻塞队列列表*/

q=p->next;

printf("\n--阻塞队列--\n");

while(q)

{

if(q->p_status=='0')

{

printf("%d)进程名:

%s",block++,q->p_name);

printf("进程优先级:

%c",q->p_pro);

printf("进程运行时间:

%d",q->p_runtime);

printf("进程等待时间:

%d\n",q->p_wait);

}

q=q->next;

}

printf("\n");

printf("进程显示完毕.");

system("pause");

}

voidBlock(PCB*head)//阻塞进程函数

{

charname[10];

PCB*p=head;//保护头结点

system("cls");

printf("\t----------阻塞进程-----------\n");

printf("\n输入你要放入阻塞队列的进程名称:

");

scanf("%s",name);

getchar();

p=p->next;

while(p)

{

if(strcmp(p->p_name,name)==0)

break;

p=p->next;

}

if(!

p)

{

printf("\n队列中无该进程.\n");

system("pause");

}

if(p->p_status=='1')

{

printf("\n该进程正在运行.\n");

printf("\n将该进程放入阻塞队列\n\n");

system("pause");

p->p_status='0';

printf("\n该进程已经被放入阻塞队列\n");

system("pause");

}

else

{

if(p->p_status=='0')

{

printf("\n该进程已在阻塞队列中.\n");

system("pause");

}

if(p->p_status=='2')

{

printf("\n该进程正在就绪队列中.不可放入阻塞队列\n");

system("pause");

}

}

Run(head);

}

voidDelete(PCB*head,PCB*temp)/*head为链表头结点,temp为将要删除的结点*/

{

PCB*p=head,*q=temp->next;

while(p->next!

=temp)

{

p=p->next;

}

p->next=q;

free(temp);

}

voidStop(PCB*head)//终止进程函数

{

charname[10];

PCB*p=head;

system("cls");

printf("\t----------终止进程-----------\n");

printf("\n输入你要终止的进程名称:

");

scanf("%s",name);

getchar();

p=p->next;

while(p)

{

if(strcmp(p->p_name,name)==0)

break;

p=p->next;

}

if(!

p)

{

printf("进程队列中无该进程.\n");

system("pause");

}

Delete(head,p);//调用删除结点函数

printf("\n进程终止成功\n");

system("pause");

Run(head);

}

voidWakeup(PCB*head)//唤醒进程函数

{

charname[10];

PCB*p=head;//保护头结点

system("cls");

printf("\t----------唤醒进程-----------\n");

printf("\n输入你要唤醒的进程名称:

");

scanf("%s",name);

getchar();

p=p->next;

while(p)

{

if(strcmp(p->p_name,name)==0)

break;

p=p->next;

}

if(!

p)

{

printf("阻塞队列中无该进程名称.\n");

system("pause");

return;

}

if(p->p_status=='0')

{

printf("该进程正在阻塞队列中.\n");

printf("\n将该进程放回就绪队列中\n");

system("pause");

p->p_status='2';

p->p_wait=2;

printf("\n该进程已经被放入就绪队列中\n");

system("pause");

}

else

{

if(p->p_status=='1')

{

printf("\n该进程正在运行.不可唤醒\n");

system("pause");

}

if(p->p_status=='2')

{

printf("\n该进程正在就绪队列中.不可唤醒\n");

system("pause");

}

}

}

voidprior_Sche(PCB*head)

{

PCB*p=head->next,*temp=head->next;//保护头结点p,temp为将要删除的结点

system("cls");

if(p==NULL)

{

printf("目前系统中没有进程.请返回主界面创建进程!

\n");

system("pause");

return;

}

while(p)

{

if(temp->p_prop_pro)

{

temp=p;//将此时优先级最大的结点地址给临时空间保存

}

p=p->next;

}

printf("\n\n");

printf("经过调度,此时程序中运行的进程是:

\n");

printf("\n进程名:

%s",temp->p_name);

printf("进程优先级:

%c",temp->p_pro);

printf("进程运行时间:

%d\n",temp->p_runtime);

printf("\n该进程PCB显示完毕!

\n");

system("pause");

Delete(head,temp);

Run(head);

}

voidtime_Sche(PCB*head)

{

intready=1;

PCB*p=head,*q,*temp=NULL;//保护头结点p,temp为时间片用完将要删除时,保护的临时结点

system("cls");

if(p->next==NULL)

{

printf("目前系统中没有进程.请返回主界面创建进程!

\n");

system("pause");

return;

}

/*列出就绪队列列表*/

q=p->next;//指针指到第一个结点

printf("\n--就绪队列--\n");

while(q)

{

if(q->p_status=='2')

{

printf("%d)进程名:

%s",ready++,q->p_name);

printf("进程优先级:

%c",q->p_pro);

printf("进程运行时间:

%d\n",q->p_runtime--);

//printf("进程已运行时间:

");

}

if(q->p_runtime==0)

{

temp=q;

}

q=q->next;

}

if(temp!

=NULL)

{

Delete(head,temp);

}

printf("\n");

system("pause");

}

voidScheduling(PCB*head)//调度程序

{

while

(1)

{

intchoose;

system("cls");

printf("1.优先级调度\n");

printf("2.时间片调度\n");

printf("0.返回主菜单\n");

printf("\n请输入选项:

");

scanf("%d",&choose);

getchar();

switch(choose)

{

case1:

prior_Sche(head);break;

case2:

time_Sche(head);break;

case0:

{system("cls");return;}break;

default:

{printf("请输入0-2的数字\n");system("pause");system("cls");}break;

}

}

}

voidMenu()

{

printf("\t----------模拟系统进程创建、终止、阻塞、唤醒-----------");

printf("\n");

printf("1.进程创建\n");

printf("2.阻塞进程\n");

printf("3.唤醒进程\n");

printf("4.终止进程\n");

printf("5.显示进程\n");

printf("6.调度进程\n");

printf("0.退出\n");

printf("\n\n");

printf("\t------------------------完美分割线---------------------\n");

printf("功能介绍:

\n");

printf("阻塞:

运行->阻塞;处于运行之外状态,给出提示信息;若进程不存在也给出其他信息\n");

printf("唤醒:

根据输入的进程名结束进程;不管该进程处于什么状态都将结束;若输入进程不存在,会给出相应信息\n");

printf("终止:

根据输入的进程名结束进程;不管该进程处于什么状态都将结束;若输入进程不存在,会给出相应信息\n");

printf("显示:

分别显示就绪队列、阻塞队列、正在运行队列\n\n\n");

}

main()

{

PCB*head;

head=(PCB*)malloc(sizeof(PCB));//头结点为空

head->next=NULL;

if(!

head)

{

printf("程序有误.即将退出");

system("pause");

exit(0);

}

while

(1)

{

intchoose;

system("cls");

Menu();

printf("请选择使用功能:

");

scanf("%d",&choose);

switch(choose)

{

case1:

Create(head);break;

case2:

Block(head);break;

case3:

Wakeup(head);break;

case4:

Stop(head);break;

case5:

Show(head);break;

case6:

Scheduling(head);break;

case0:

exit(0);break;

default:

{printf("请输入0-5的数字\n");system("pause");system("cls");}break;//输入'.'会造成bug.

}

}

}

/*作者:

辰辰辽宁大学*/

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

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1