银行家算法的代码

银行家算法的代码,第1张

银行家算法程序代码

#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)撤销进程法:采用撤销进程法时,可用两种形式来撤销进程。一种是撤销所有卷入死锁的进程。另一种是一次撤销一个进程直到死锁消失。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8660989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存