模拟进程创建终止阻塞唤醒原语附带注释Word文档下载推荐.docx
- 文档编号:21838323
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:194.67KB
模拟进程创建终止阻塞唤醒原语附带注释Word文档下载推荐.docx
《模拟进程创建终止阻塞唤醒原语附带注释Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《模拟进程创建终止阻塞唤醒原语附带注释Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
就绪、运行、阻塞,三种基本状态。
指针:
指向下一个PCB。
1、进程PCB中应包含以下内容:
进程名
优先级
运行时间
状态
指针
2、系统总体结构:
系统主菜单
1…创建
2…阻塞
3…唤醒
4…终止
5…显示
0…退出
请输入您需要的功能(0-5):
另加实验二:
模拟进程调度功能
/*PCB的组织方式:
线性方式*/
#include"
stdio.h"
string.h"
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->
}
p=head->
//将P重置在第一个结点
while(p->
p_status!
='
1'
&
&
p!
=NULL)
)//防止线性链表前面的结点因为从阻塞唤醒后又进入运行状态
p_status='
;
p_wait=2;
)//对上一个if进行处理
return;
return;
}
voidInsert(PCB*head,PCB*temp)//插入链表函数
PCB*p;
p=head;
//将头结点保存起来
next!
p->
next=temp;
temp->
next=NULL;
intCheck(PCB*head,PCB*temp)
PCB*p=head;
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"
\n请输入进程名:
"
scanf("
%s"
temp->
p_name);
getchar();
/*检查进程名称,如果相同则返回主界面*/
chk=Check(head,temp);
if(chk==0)
printf("
进程队列已有该名称进程,创建失败,即将返回主界面.\n"
system("
pause"
return;
\n请输入进程优先级(1.低2.中3.高):
%c"
&
temp->
p_pro);
\n请输入进程运行时间:
%d"
p_runtime);
/*
\n请输入该进程状态:
p_status);
*/
Insert(head,temp);
//调用插入链表函数
Run(head);
voidShow(PCB*head)//显示队列进程函数
intready=1,block=1,run=1;
PCB*p=head,*q;
if(p->
next==NULL)
目前系统中没有进程.请返回主界面创建进程!
\n"
/*列出就绪队列列表*/
q=p->
//指针指到第一个结点
\n--就绪队列--\n"
while(q)
if(q->
printf("
%d)进程名:
ready++,q->
进程优先级:
q->
进程运行时间:
进程等待时间:
%d\n"
p_wait);
q=q->
/*列出运行队列列表*/
//将指针重置到第一个结点
\n--运行队列--\n"
run++,q->
//printf("
进程已运行时间:
/*列出阻塞队列列表*/
\n--阻塞队列--\n"
0'
block++,q->
进程显示完毕."
voidBlock(PCB*head)//阻塞进程函数
charname[10];
//保护头结点
\t----------阻塞进程-----------\n"
\n输入你要放入阻塞队列的进程名称:
name);
p=p->
while(p)
p_name,name)==0)
break;
if(!
p)
\n队列中无该进程.\n"
\n该进程正在运行.\n"
\n将该进程放入阻塞队列\n\n"
p->
\n该进程已经被放入阻塞队列\n"
else
\n该进程已在阻塞队列中.\n"
system("
\n该进程正在就绪队列中.不可放入阻塞队列\n"
voidDelete(PCB*head,PCB*temp)/*head为链表头结点,temp为将要删除的结点*/
PCB*p=head,*q=temp->
=temp)
next=q;
free(temp);
voidStop(PCB*head)//终止进程函数
\t----------终止进程-----------\n"
\n输入你要终止的进程名称:
进程队列中无该进程.\n"
Delete(head,p);
//调用删除结点函数
\n进程终止成功\n"
voidWakeup(PCB*head)//唤醒进程函数
\t----------唤醒进程-----------\n"
\n输入你要唤醒的进程名称:
阻塞队列中无该进程名称.\n"
该进程正在阻塞队列中.\n"
\n将该进程放回就绪队列中\n"
\n该进程已经被放入就绪队列中\n"
\n该进程正在运行.不可唤醒\n"
\n该进程正在就绪队列中.不可唤醒\n"
voidprior_Sche(PCB*head)
next,*temp=head->
//保护头结点p,temp为将要删除的结点
if(p==NULL)
if(temp->
p_pro<
p_pro)
temp=p;
//将此时优先级最大的结点地址给临时空间保存
\n\n"
经过调度,此时程序中运行的进程是:
\n进程名:
\n该进程PCB显示完毕!
Delete(head,temp);
Run(head);
voidtime_Sche(PCB*head)
intready=1;
PCB*p=head,*q,*temp=NULL;
//保护头结点p,temp为时间片用完将要删除时,保护的临时结点
p_runtime--);
p_runtime==0)
temp=q;
if(temp!
voidScheduling(PCB*head)//调度程序
while
(1)
intchoose;
1.优先级调度\n"
2.时间片调度\n"
0.返回主菜单\n"
\n请输入选项:
scanf("
choose);
getchar();
switch(choose)
case1:
prior_Sche(head);
break;
case2:
time_Sche(head);
case0:
{system("
}break;
default:
{printf("
请输入0-2的数字\n"
system("
voidMenu()
\t----------模拟系统进程创建、终止、阻塞、唤醒-----------"
1.进程创建\n"
2.阻塞进程\n"
3.唤醒进程\n"
4.终止进程\n"
5.显示进程\n"
6.调度进程\n"
0.退出\n"
\t------------------------完美分割线---------------------\n"
功能介绍:
阻塞:
运行->
阻塞;
处于运行之外状态,给出提示信息;
若进程不存在也给出其他信息\n"
唤醒:
根据输入的进程名结束进程;
不管该进程处于什么状态都将结束;
若输入进程不存在,会给出相应信息\n"
终止:
显示:
分别显示就绪队列、阻塞队列、正在运行队列\n\n\n"
main()
PCB*head;
head=(PCB*)malloc(sizeof(PCB));
//头结点为空
head->
head)
程序有误.即将退出"
exit(0);
Menu();
请选择使用功能:
Create(head);
Block(head);
case3:
Wakeup(head);
case4:
Stop(head);
case5:
Show(head);
case6:
Scheduling(head);
exit(0);
请输入0-5的数字\n"
//输入'
.'
会造成bug.
/*作者:
辰辰辽宁大学*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 进程 创建 终止 阻塞 唤醒 附带 注释