#include <string.h>
#include <stdio.h>
#include <iostream.h>
#define FALSE 0
#define TRUE 1
#define W 10
#define R 10
int M // 总进程数
int N // 资源种类
int ALL_RESOURCE[W]// 各种资源的数目总和
int MAX[W][R]// M个进程对N类资源最大资源需求量
int AVAILABLE[R]// 系统可用资源数
int ALLOCATION[W][R]// M个进程已经得到N类资源的资源量
int NEED[W][R]// M个进程还需要N类资源的资源量
int Request[R]// 请求资源个数
void output()
{
int i,j
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"各种资源的总数量:"<<endl
for (j=0j<Nj++)
cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j]
cout<<endl
cout<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"目前各种资源可利用的数量为:"<<endl
for (j=0j<Nj++)
cout<<" 资源"<<j<<": "<<AVAILABLE[j]
cout<<endl
cout<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"各进程还需要的资源数量:"<<endl<<endl
for(i=0i<Ni++)
cout<<"资源"<<i
cout<<endl
for (i=0i<Mi++)
{
cout<<"进程"<<i<<": "
for (j=0j<Nj++)
cout<<NEED[i][j]<<" "
cout<<endl
}
cout<<endl
cout<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"各进程已经得到的资源量: "<<endl<<endl
for(i=0i<Ni++)
cout<<"资源"<<i
cout<<endl
for (i=0i<Mi++)
{
cout<<"进程"<<i<<":"
for (j=0j<Nj++)
cout<<ALLOCATION[i][j]<<" "
cout<<endl
}
cout<<endl
}
void distribute(int k)
{
int j
for (j=0j<Nj++)
{
AVAILABLE[j]=AVAILABLE[j]-Request[j]
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]
NEED[k][j]=NEED[k][j]-Request[j]
}
}
void restore(int k)
{
int j
for (j=0j<Nj++)
{
AVAILABLE[j]=AVAILABLE[j]+Request[j]
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]
NEED[k][j]=NEED[k][j]+Request[j]
}
}
int check()
{
int WORK[R],FINISH[W]
int i,j
for(j=0j<Nj++) WORK[j]=AVAILABLE[j]
for(i=0i<Mi++) FINISH[i]=FALSE
for(i=0i<Mi++)
{
for(j=0j<Nj++)
{
if(FINISH[i]==FALSE&&NEED[i][j]<=WORK[j])
{
WORK[j]=WORK[i]+ALLOCATION[i][j]
}
}
FINISH[i]=TRUE
}
for(i=0i<Mi++)
{
if(FINISH[i]==FALSE)
{
cout<<endl
cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl
cout<<endl
return 1
}
else
{
cout<<endl
cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl
cout<<endl
return 0
}
}
}
void bank() // 银行家算法
{
int i=0,j=0
char flag='Y'
while(flag=='Y'||flag=='y')
{
i=-1
while(i<0||i>=M)
{
cout<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<endl<<" 请输入需申请资源的进程号:"
cin>>i
if(i<0||i>=M) cout<<" 输入的进程号不存在,重新输入!"<<endl
}
cout<<" 请输入进程"<<i<<"申请各类资源的数量:"<<endl
for (j=0j<Nj++)
{
cout<<" 资源"<<j<<": "
cin>>Request[j]
if(Request[j]>NEED[i][j]) // 若请求的资源数大于进程还需要i类资源的资源量j
{
cout<<endl<<" 进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的数量!"
cout<<" 若继续执行系统将处于不安全状态!"<<endl
flag='N'
break
}
else
{
if(Request[j]>AVAILABLE[j]) // 若请求的资源数大于可用资源数
{
cout<<endl<<" 进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的数量!"
cout<<" 若继续执行系统将处于不安全状态!"<<endl
flag='N'
break
}
}
}
if(flag=='Y'||flag=='y')
{
distribute(i)// 调用change(i)函数,改变资源数
if(check()) // 若系统安全
{
restore(i)// 调用restore(i)函数,恢复资源数
output() // 输出资源分配情况
}
else // 若系统不安全
output()// 输出资源分配情况
}
else // 若flag=N||flag=n
cout<<endl
cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: "
cin>>flag
}
}
void version()
{
cout<<endl
cout<<"\t 银 行 家 算 法 "<<endl
}
void main() // 主函数
{
int i=0,j=0,p
version()
getchar()
cout<<endl<<"请输入总进程数:"
cin>>M
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"请输入总资源种类:"
cin>>N
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"请输入各类资源总数:(需要输入数为"<<N<<"个)"
for(i=0i<Ni++)
cin>>ALL_RESOURCE[i]
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"输入各进程所需要的各类资源的最大数量:(需要输入数为"<<M*N<<"个)"
for (i=0i<Mi++)
{
for (j=0j<Nj++)
{
do
{
cin>>MAX[i][j]
if (MAX[i][j]>ALL_RESOURCE[j])
cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl
}
while (MAX[i][j]>ALL_RESOURCE[j])
}
}
cout<<endl<<"━━━━━━━━━━━━━━━━━━"<<endl
cout<<"输入各进程已经占据的各类资源的数量:(需要输入数为"<<M
*N<<"个)"
for (i=0i<Mi++)
{
for (j=0j<Nj++)
{
do
{
cin>>ALLOCATION[i][j]
if (ALLOCATION[i][j]>MAX[i][j])
cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl
}
while (ALLOCATION[i][j]>MAX[i][j])
}
}
for (j=0j<Nj++) // 初始化资源数量
{
p=ALL_RESOURCE[j]
for (i=0i<Mi++)
{
p=p-ALLOCATION[i][j]// 减去已经被占据的资源
AVAILABLE[j]=p
if(AVAILABLE[j]<0)
AVAILABLE[j]=0
}
}
for (i=0i<Mi++)
for(j=0j<Nj++)
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]
output()
bank()
}
实验结果分析
1.根据下面给出的系统中资源分配情况,以及各个进程的资源申请情况,通过银行家算法来判断各进程的资源请求能否满足(要求记录程序的运行过程)。
已分配的资源 最大需求量
A B C A B C
P1 0 1 0 7 5 3
P2 2 0 0 3 2 2
P3 3 0 2 9 0 2
P4 2 1 1 2 2 2
P5 0 0 2 4 3 3
剩余资源 A B C
3 3 2
实验三 进程的死锁与饥饿实验报告一、单项选择题(共5题,每题10分,共50分)
1、采用资源剥夺法可以解除死锁,还可以采用_B___方法解除死锁。
A.执行并行 *** 作 B.撤销进程
C.拒绝分配新资源 D.修改信号量
2、产生死锁的四个必要条件是:互斥、_B___、循环等待、不剥夺。
A. 请求与阻塞 B.请求与保持
C.请求与释放 D.释放与阻塞
3、银行家算法在解决死锁问题中是用于_B___的。
A. 预防死锁 B.避免死锁 C. 检测死锁 D.解除死锁
4、在下列解决死锁的方法中,属于死锁预防策略的是__B__。 A.银行家算法 B.资源有序分配法
C.死锁检测法 D.资源分配图化简法
5、某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是_B___。
A.9 B.10 C.11 D.12
二、填空题(共4题,每题5分,共20分)
1、在有M个进程的系统中出现死锁时,死锁进程的个数K应该满足的条件是_2=<k<=m___。
2、死锁产生的4个必要条件是:互斥条件、_请求和保持条件___、_不剥夺条件___和_环路等待条件___。
3、产生死锁的根本原因是_可共享资源不足___,另一个基本原因是_进程的推进顺序不当___。
4、银行间算法中,当一个进程提出的资源请求将导致系统从_安全状态___进入_不安全状态___时,系统就拒绝它的资源请求
三、 简答题(共2题,每题15分,共30分) 1、按序分配是预防死锁的一种策略。什么是按序分配?为什么按序分配可以预防死锁?
按序分配是将系统中所有资源按类型进行 线性排队,并赋予不同的编号,规定所有进程对资源的请求必须严格按照资源序号递增的次序提出。 按序分配可破坏产生死锁的四个必要条件中的“循环等待条件”
2、产生死锁的必要条件是什么?解决死锁问题常采用哪几种措施?
必要条件:互斥条件、部分分配条件、剥夺条件、环路条件。
解决死锁问题采用的措施:
(1)撤销进程法:采用撤销进程法时,可用两种形式来撤销进程。一种是撤销所有卷入死锁的进程。另一种是一次撤销一个进程直到死锁消失。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)