银行家算法C语言代码

  • 格式:docx
  • 大小:165.21 KB
  • 文档页数:10

实验名称:

银行家算法

* 名: ***

学 号: **********

专业班级: 创新实验班111

指导老师: **

实验题目

银行家算法

实验目的

更深层的了解银行家算法是如何避免死锁的

设计思想

银行家算法是根据进程的请求,假设在已分配给该进程请求的资源后,进行安全性算法,如果都能满足其他进程的请求,则满足该进程的请求,否则挂起该进程的请求。假设在一个系统中,知道相应的进程的状态(最大需求、已占用的资源量、还需要的资源量和可利用的资源数),某个进程发出请求,在请求满足两大请求(小于还需要的资源并小于可利用资源数)时,分配给该进程相应的资源,再进行安全检测,在确认安全的情况下,才把资源真正分配给该进程,否则终止请求!

主要数据结构

根据算法的相应需求,需要定义int max[M][M];

int allocation[M][M];

int need[M][M];

int available[M];

int work[M];

等数组

流程图

开始

结束 输入总进程数

输入资源数

输入Max矩阵

输入Allocation矩阵

是否添加进程请求

输入进程号和请求资源 否 是 运行结果

图(1)分配进程的相应状态

图(2)请求和请求完全部资源后释放资源

图(3)继续请求并释放其他进程

图(2)所有进程请求完成后系统资源还原

附录

原代码如下:

# include "stdio.h"

# define M 50

int max[M][M];

int allocation[M][M];

int need[M][M];

int available[M];

int i, j, n, m, anquan,x=0;

/*7 5 3 0 1 0 7 4 3 3 3 2

3 2 2 2 0 0 1 2 2

9 0 2 3 0 2 6 0 0

2 2 2 2 1 1 0 1 1

4 3 3 0 0 2 4 3 1*/

main()

{ void check();

int p,q,control;

int req[M],allocation1[M][M],need1[M][M],available1[M];

printf("输入进程总数:");

scanf("%d", &n);

printf("输入资源种类数量:");

scanf("%d", &m);

printf("输入需求矩阵Max:\n");

for(i=0;i

for(j=0;j

scanf("%2d",&max[i][j]);

printf("输入已分配矩阵Allocation:\n");

for(i=0;i

for(j=0;j

scanf("%d", &allocation[i][j]);

for (i=0;i

for(j=0;j

need[i][j]=max[i][j]-allocation[i][j];

printf("输入资源的系统初始值:\n");

for (j=0;j

scanf("%d", &available[j]);

for (j=0;j

for(i=0;i

check();

if (anquan==1) //如果已知的状态安全则执行以下代码

{

for(control=0;;control++)

{ p=0,q=0;

printf("输入请求的进程号: ");

scanf("%d", &i);

printf("输入该进程的请求资源数组:");

for(j=0;j

scanf("%d",&req[j]);

for(j=0;j

if(req[j]>need[i][j])

p=1;

if(p)

printf("请求资源大于该进程还需要的资源!\n");

else

{

for(j=0;j

if(req[j]>available[j])//判断请求是否大于可用资源

q=1;

if(q)

printf("可用资源不能满足请求!\n");

else

{

for(j=0;j

{

available1[j]=available[j]; //保持资源的当前

allocation1[i][j]=allocation[i][j];

need1[i][j]=need[i][j];

available[j]=available[j]-req[j]; //尝试把资源分配给进程

allocation[i][j]=allocation[i][j]+req[j];

need[i][j]=need[i][j]-req[j];

if(need[i][j]==0)

x=x+1; //当进程满足时释放资源

}

if(x==m)

for(j=0;j

{

available[j]=available[j]+allocation[i][j];

allocation[i][j]=0; available1[j]=available[j];

x--;

}

else x=0;

check();

if(anquan==0)

{for (j=0;j

{ available[j]=available1[j]; //还原分配前的状态

allocation[i][j]=allocation1[i][j];

need[i][j]=need1[i][j];

}

printf("执行该进程不安全!返回继续操作。\n");

}

}

}

printf("是否继续请求?\n");

}

}

}

void check() //安全性算法

{ int k, f, no=0;

int work[M],a[M];

char finish[M];

anquan=1;

for(i=0;i

finish[i]='F';

for(j=0;j

work[j]=available[j];

k=n;

do

{

for (i=0;i

{if (finish[i]=='F')

{ f=1;

for (j=0;j

if (need[i][j]>work[j])

f=0;

if (f==1) //找到还没完成的且需求数小于可提供进程继续运行的

{ finish[i]='T';

a[no++]=i; //记录安全序列号

for (j=0;j

work[j]=work[j]+allocation[i][j]; //释放该进程已分配的资源

available[j] =work[j];