模拟进程创建终止阻塞唤醒原语附带注释汇编.docx
《模拟进程创建终止阻塞唤醒原语附带注释汇编.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语附带注释汇编.docx(18页珍藏版)》请在冰豆网上搜索。
模拟进程创建终止阻塞唤醒原语附带注释汇编
题目:
计算机操作系统模拟
院系:
信息学院
专业:
计算机科学与技术
班级:
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):
另加实验二:
模拟进程调度功能
/*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.
}
}
}
/*作者:
辰辰辽宁大学*/