一.银行家算法简单介绍:
银行家算法是一种避免死锁的算法。在避免死锁方法中同意进程动态地申请资源,但系统在进行资源分配之前,应先j检查并计算此次分配资源的安全性,若分配不恰当会导致导致系统进入不安全状态,则等待.假设处于安全状态则分配。
输入一些资源量,最大须要的资源量,已开辟的资源量,而且已知在进程里面可分配资源的数量。当某一个进程请求时,推断子请求是否合理。
我是用结构体存放数据的,我认为这样比較让自己easy接受。
二.程序模块
1.初始化模块。
2.试探分配模块。
3.资源回收模块。
4.安全性检查模块。
5.资源请求分配模块。
6.主函数,自己输入数据測试。
三.程序流程图
所有流程图:
(2)安全性检查流程图
(3)资源分配流程图
開始
代码:
#include <stdio.h>
#include <string.h>
#define false 0
#define All_Reource 50
#define Vallue 10
typedef struct
{
int arr[Vallue];
}Resource;
int safe[All_Reource] = { 0 };
Resource ptr;
Resource Resource_Max[All_Reource] = { 0 };//最大需求矩阵
Resource Resource_Allocation[All_Reource] = { 0 };//已分配资源数矩阵
Resource Resource_Need[All_Reource] = { 0 };//需求矩阵
//可用资源向量
Resource Available;
Resource Work;
//int safe[All_Reource] = { 0 };
void Init(int Numz)
{
int i;
for (i = 0; i < Numz; i++)
{ printf("请输入可用资源向量Ava:\n");
scanf("%d", &Available.arr[i]);
}
}
void Resource_Max_Init(int Num, int Numz)
{
for (int i = 0; i<Num; i++)
{
//printf("please input the P%d source\n", i);
printf("please input the number of P%d max source \n ", i);
for (int j = 0; j < Numz; j++)
{
printf("请输入 P%d 的%d类资源:\n", i, j);
scanf("%d", &Resource_Max[i].arr[j]);
}
}
}
void Resource_Allocation_Init(int Num,int Numz)
{
for (int i = 0; i < Num; i++)
{
printf("please input the P%d source\n", i);
for (int j = 0; j < Numz; j++)
{
printf("请输入 P%d 的%d类分配的资源:\n", i, j);
scanf("%d", &Resource_Allocation[i].arr[j]);
}
}
}
//void Resource_Need_Init(int Num,int Numz)
//
//{
// for (int i = 0; i<Num; i++)
// {
// printf("please input the P%d's source\n", i);
// for (int j = 0; j < Numz; j++)
// {
// printf("请输入 P%d 的%d类须要的资源:\n", i, j);
// scanf("%d", &Resource_Need[i].arr[j]);
// }
// }
//}
void Resource_Need_Init(int Num,int Numz)
{
for (int i = 0; i < Num;i++)
{
for (int j = 0; j < Numz;j++)
{
Resource_Need[i].arr[j] = Resource_Max[i].arr[j] - Resource_Allocation[i].arr[j];
}
}
}
//试探分配
void ProbeAlloc(int process, Resource *res,int Numz)
{
for (int i = 0; i < Numz; i++)
{
Available.arr[i] -= res->arr[i];
Resource_Allocation[process].arr[i] += res->arr[i];
Resource_Need[process].arr[i] -= res->arr[i];
}
}
//若试探分配后进入不安全状态,将以试分配的的资源回收
void RollBack(int process, Resource *res,int Numz)
{
for (int i = 0; i < Numz; i++)
{
Available.arr[i] += res->arr[i];
Resource_Allocation[process].arr[i] -= res->arr[i];
Resource_Need[process].arr[i] += res->arr[i];
}
}
//安全性检查
bool SafeCheck(int Num,int Numz)
{
int num = 0;
int Finish[All_Reource];
for (; num < Num; num++)
{
Finish[num] = { false };
}
int i;
int j = 0;
Work = Available;
for (i = 0; i < Num; i++)
{
//是否已检查过
if (Finish[i] == false)
{
int n = 0;
//是否有足够的资源分配给该进程
for (n=0; n < Numz;)
{
if (Resource_Need[i].arr[n] <= Work.arr[n])
{
n++;
}
else
{
break;
}
}
if (n==Numz)
{
for (int nb = 0; nb < Numz; nb++)
{
Work.arr[nb] += Resource_Allocation[i].arr[nb];
}
Finish[i] = true;
safe[j++] = i;
i = -1;
}
}
}
//假设全部进程的Finish向量都为true则处于安全状态,否则为不安全状态
for (i = 0; i < Num; i++)
{
if (Finish[i] == false)
{
return false;
}
}
return true;
}
//资源分配请求
bool request(int process, Resource *res, int Num,int Numz)
{
int j;
int i;
for (i = 0; i < Numz;)
{
if (res->arr[i] <= Resource_Need[process].arr[i])//请求量是否小于需求量
{
i++;
}
else
{
printf("请求量大于需求量\n");
return false;
}
}
for (j = 0; j < Numz;)
{
if (res->arr[j] <= Available.arr[j])//请求量是否小于系统的可用资源量
{
j++;
}
else
{
printf("请求量大于需可用量\n");
return false;
}
}
//试探分配
ProbeAlloc(process, res,Numz);
//假设安全检查成立,则请求成功,否则将分配失败并返回失败
if (SafeCheck(Num, Numz))
{
return true;
}
else
{
printf("安全性检查失败。系统将进入不安全状态\n");
RollBack(process, res,Numz);
return false;
}
}
void PrintfTable(int Numz)
{
int i;
printf("Ava :");
for (i = 0; i < Numz; i++)
{
printf("%d ",Available.arr[i]);
}
printf("\n");
}
int main()
{
int y;
int d;
int ch;
int num = 0;
int numz = 0;
int i = 0;
printf("请输入进程总数: ");
scanf("%d", &num);
printf("请输入资源种类: ");
scanf("%d", &numz);
for (i = 0; i < numz; i++)
{
ptr.arr[i] = i;
}
Init(numz);
Resource_Max_Init(num, numz);
Resource_Allocation_Init(num, numz);
Resource_Need_Init(num, numz);
printf("先检查初始状态是否安全\n");
if (SafeCheck(num, numz))
{
//printf("系统处于安全状态\n");
printf("输出安全序列:\n");
for (d = 0; d < num; d++)
{
printf("p%d", safe[d]);
}
printf("\n");
}
else
{
printf("系统处于不安全状态,程序将退出...\n");
getchar();
return -1;
}
do
{
int process;
Resource res;
PrintfTable(numz);
printf("请输入须要请求的进程数:");
scanf("%d", &process);
for (y = 0; y < numz; y++)
{
printf("请输入进程数%d分配资源数量%d: ", process, y);
scanf("%d", &res.arr[y]);
}
if (request(process, &res, num, numz))
{
int a;
printf("分配成功。\n");
printf("输出安全序列:\n");
for (a = 0; a < num; a++)
{
printf("p%d", safe[a]);
printf("\n");
}
//PrintfTable(numz);
int n1 = 0;
for (int i = 0; i < numz;i++)
{
if (Resource_Need[process].arr[i]==0)
{
n1++;
}
else
{
break;
}
}
if (n1 == numz)
{
for (int i = 0; i < numz;i++)
{
Available.arr[i] += Resource_Allocation[process].arr[i];
}
}
PrintfTable(numz);
}
else
{
printf("分配失败。\n");
}
printf("是否继续分配?(Y/N):");
fflush(stdin);
ch = getchar();
} while (ch == 'Y' || ch == 'y');
return 0;
}
:
(流程图太大了,不好截图。所以仅仅能分开截图)。
浙公网安备 33010602011771号