在学操作系统这门课程的时候,里面有个银行家算法,第一次看见这个算法当时有傻眼,
不知从何处入手,因为本人在这之前也没写过像这种稍微有点深度的程序(说来惭愧!!菜鸟)
写一下博客也很好,一来可以练习打字,二来放在这里可以作为资料方便自己以后
查阅,利于自己也利于大家嘛!
一起学习,一起努力!!!加油!!!!!
我贴一下我程序里的几个函数,顺便说一下他们的作用。。。。。。
1.void inputedate();
程序一开始便要输入初始数据 等一下看程序你看一下就知道了
2.void dealloc(int** a, int p);
释放内存资源 我把一些数组(动态分配的)集中放在一起释放。。
3.bool safe(int ProcessNum);
银行家安全性算法
4.int banker(int *request,int ProcessNum);
银行家算法 他的流程 http://baike.baidu.com/view/93075.htm#4
5.int add(int array[],int element,int n);
array[] 这个用来存放安全序列
6.void ShowInformation();
显示当前数据状态: 最大需求矩阵 可利用资源向量 分配矩阵 需求矩阵
下面是源码 :
/* 程序名:银行家算法
* 环境: Visual C++ 6.0
* 完成时间:2011-4-19 23:33
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void inputedate();
void dealloc(int** a, int p);
bool safe(int ProcessNum);
int banker(int *request,int ProcessNum);
int add(int array[],int element,int n);
void ShowInformation();
int *available;
int **max;
int **allocation;
int **need;
int *request;
int *work;
bool *finish;
int m; //资源数
int n; //进程
int i;
int j;
int main(int argc, char* argv[])
{
int SelectProces;
int select;
inputedate();
while(true)
{
system("cls");
printf("\t┏━━━━━━━━━━━━━━━━┓\n");
printf("\t┃ 1.请求资源 ┃\n");
printf("\t┃ 2.显示当前信息 ┃\n");
printf("\t┃ 3.退出 ┃\n");
printf("\t┗━━━━━━━━━━━━━━━━┛\n");
printf("输入您的选择:");
scanf("%d",&select);
switch(select)
{
case 1:
{
printf("请选择哪个进程 P");
scanf("%d",&SelectProces);
if(SelectProces>=n||SelectProces<0)
{
continue;
}
if(banker(request,SelectProces))
{
if(!safe(SelectProces))
{
for(int i=0; i<m; i++)
{
available[i] += request[i];
allocation[SelectProces][i] -= request[i];
need[SelectProces][i]+=request[i];
}
}
}
}
break;
case 2:
{
ShowInformation();
}
break;
case 3:
{
exit(1);
}
default:exit(1);
}
system("pause");
}
free(available);
dealloc(allocation,n);
dealloc(max,n);
dealloc(need,n);
return 0;
}
// 释放内存 二维
void dealloc(int** a, int p)
{
int i;
for (i = 0; i < p; i++)
{
free(a[i]);
}
free(a);
}
void inputedate()
{
printf("请输入资源数:");
scanf("%d",&m);
printf("请输入进程数:");
scanf("%d",&n);
//可利用资源数
available = (int *)malloc(m*sizeof(int));
// 输入可利用资源数
for(i=0; i<m; i++)
{
printf("输入第%d类可利用资源数:",i);
scanf("%d",&available[i]);
}
// fflush(stdin);
//最大需求量
max = (int **)malloc(n*sizeof(int *));
for(i=0; i<n; i++)
{
max[i] = (int *)malloc(m*sizeof(int));
}
// 输入各进程对各资源的最大需求量
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf("进程P[%d]对资源%d的最大需求:",i,j);
scanf("%d",&max[i][j]);
}
//已分配
allocation = (int **)malloc(n*sizeof(int *));
// printf("This is test4\n");
for(i=0; i<n; i++)
{
allocation[i] = (int *)malloc(m*sizeof(int));
}
// 输入已经分配数
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf("进程P[%d]已经分配资源%d量:",i,j);
scanf("%d",&allocation[i][j]);
}
//还需求
need = (int **)malloc(n*sizeof(int *));
for(i=0; i<n; i++)
{
need[i] = (int *)malloc(m*sizeof(int));
}
// 输入必要数据
// 求需求矩阵
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
need[i][j] = max[i][j] - allocation[i][j];
printf("%d ",need[i][j]);
}
printf("\n");
}
//request数组的大小
request = (int *)malloc(m * sizeof(int));
work = (int *)malloc(m * sizeof(int));
finish = (bool *)malloc(n* sizeof(bool));
}
// 银行家算法
int banker(int *request,int ProcessNum)
{
//对每一个资源的请求量 resource为资源类数目
printf("输入请求的资源量:\n");
for(int i=0; i<m; i++)
{
printf("请输入对资源R%d的请求量:",i);
scanf("%d",&request[i]);
}
// 开始检查
for(i=0; i<m; i++)
{
if(request[i] > need[ProcessNum][i])
{
printf("你请求资源R%d的资源数大于它所宣布的值",i);
return 0;
}
}
for(i=0; i<m; i++)
{
if(request[i] > available[i])
{
printf("您尚无足够资源分配,P%d需等待......\n",ProcessNum);
return 0;
}
}
// 试分配
for(i=0; i<m; i++)
{
available[i] -= request[i];
allocation[ProcessNum][i] += request[i];
need[ProcessNum][i]-=request[i];
}
return 1;
}
bool safe(int ProcessNum)
{
int count =0;
int sub = 0;
int flag =0;
int *safeorder;
int t = 0;
safeorder = (int *)malloc(n*sizeof(int));
for(i=0; i<n; i++) // 初始化数组
{
safeorder[i] = -1;
}
for(int i=0; i<m; i++) // 初始化work
{
work[i] = available[i];
}
for(int j=0; j<n; j++) // 初始化finish
{
finish[j] = false;
}
while(true) // n为进程数 n 趟
{
if(sub==n)
{
sub=0;
}
if(finish[sub]==false)
{
flag = 0;
for(int j =0; j<m; j++) // m为资源数
{
if(need[sub][j] <= work[j]) // 比较资源
{
flag++;
}
else
{
break;
}
}
if(m == flag)
{
for(i=0; i<m; i++)
{
work[i] += allocation[sub][i];
}
finish[sub] = true;
if(finish[sub]==true)
{
add(safeorder,sub,n); //求出安全序列
count++;
}
}
}
sub++;
t++;
if(n == count||t==n*n)
{
break;
}
}
for(i=0; i<n; i++)
{
if(finish[i]==false)
{
printf("\nSystem is not safe !\n");
return false;
}
}
printf("System is safe !\n");
printf("存在一个安全序列: { ");
for(i=0; i<n; i++)
{
if(i==n-1)
{
printf("P%d",safeorder[i]);
}
else
{
printf("P%d->",safeorder[i]);
}
}
printf(" }\n");
return true;
}
int add(int array[],int element,int n) //数组处理
{
int i;
for(i=0; i<=n; i++)
{
if((array[i]!=element))
{
if(-1==array[i])
{
array[i] = element;
break;
}
}
else
{
break;
}
}
return 1;
}
void ShowInformation()
{
printf("\n进程的最大需求(MAX)\n");
for(i=0; i<n; i++)
{
printf("P%d :",i);
for(j=0; j<m; j++)
{
printf("%d ",max[i][j]);
}
printf("\n");
}
printf("\n进程已分配资源(Allocation)\n");
for(i=0; i<n; i++)
{
printf("P%d :",i);
for(j=0; j<m; j++)
{
printf("%d ",allocation[i][j]);
}
printf("\n");
}
printf("\n进程需求(Need)\n");
for(i=0; i<n; i++)
{
printf("P%d :",i);
for(j=0; j<m; j++)
{
printf("%d ",need[i][j]);
}
printf("\n");
}
printf("\n可利用资源(Available)\n");
for(i=0; i<m; i++)
{
printf("%d ",available[i]);
}
}
代码写的有点粗糙,此代码在求安全序列的时候只能求出一种,求多种的不会写呀!
有大牛看到这代码有哪些不好的请指出来,我也好改正改正。。。。
第一次在csdn里发东西,请多指教。。。