动态分配算法演示程序(银行家算法)

动态分配算法演示程序(银行家算法)

一、各模块基本算法流程

1、整个银行家算法的思路。先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。
2、算法用到的主要数据结构和C语言说明。
(1)可利用资源向量avaliable[m][n],m为资源的类型。
(2)最大需求矩阵maxx[m][n],n为进程的数量。
(3)已分配矩阵allocation[m][n]
(4)需求矩阵need[m][n]
(5)申请各类资源数量request[m]
(6)工作向量work[m]
(7)、finish[n]表示系统是否有足够的资源分配给进程,0为否,非0为是
3、银行家算法(主程序)
(1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等。
(2)、输入用户的请求i,即第i个进程请求资源。
(3)、检查用户的请求是否小于还需求的数量,条件是request[j] (4)、检查用户的请求是否小于系统中的可利用资源数量,条件是request[j] (5)、进行资源的预分配,语句如下:
Allocation[j]+=request[j]
Need[p][j]-=request[j]
Avaliable[j]-=request[j]
3、安全性检查算法(safeCheck())
(1)、设置两个临时变量。Finish[i]记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1,也可设为其它非零值以表示执行的先后次序。Work[j]记录模拟执行中资源的回收情况,初值为available[j]的值。
(2)、在进程中查找符合以下条件的进程。条件1:finish[i]=0条件2:need[p][j] for (j = 0;j work[j] += allocation[i][j];
或查找到的顺序号
(4)、如果查找不成功,则检查所有进程的Ffinish[i]=1,如果有一个为0,则系统不为0,返回不成功

二、流程图
动态分配算法演示程序(银行家算法)_第1张图片
三、代码
3、代码
(1)、初始化inint()
#include “stdafx.h”
#include
#include
#include
using namespace std;
int n;//进程的个数
int m, *available, *state, *work, *request, *finish, *safe, *order, *count1;//系统的资源数
int **maxx, **allocation, **need;//最大需求矩阵,分配矩阵,需求矩阵
void inint() //初始化函数
{
int i, j, k;
cout << “请输入此算法涉及到的资源种类:” << ‘\n’;
cin >> m;
cout << “请输入进程的数目:” << ‘\n’;
cin >> n;
available = (int *)malloc(sizeof(int)*m);
work = (int *)malloc(sizeof(int)*m);
state = (int *)malloc(sizeof(int)*n);
finish = (int *)malloc(sizeof(int)*n);
for (i = 0;i finish[i] = 0;
safe = (int *)malloc(sizeof(int)*n);
for (i = 0;i safe[i] = 0;
order = (int *)malloc(sizeof(int)*n);
request = (int *)malloc(sizeof(int)*m);
for (i = 0;i state[i] = 0;
count1 = (int *)malloc(sizeof(int)*n);
cout << “请输入资源的总数目(依次输入):” << ‘\n’;
for (i = 0;i cin >> count1[i];
cout << “请输入资源的数目(依次输入):” << ‘\n’;
for (i = 0;i cin >> available[i];

 maxx = (int**)malloc(sizeof(int*)*n);
 for (i = 0;i> maxx[i][j];
 cout << "请输入需求矩阵:" << '\n';
 for (i = 0;i> need[i][j];
 for (i = 0;i

void display() //输出状态函数
{
int i, j;
cout << “当前资源向量:” << ‘\n’;
for (i = 0;i {
cout << available[i] << ’ ';
}
cout << ‘\n’;
cout<<“";
cout << ‘\n’;
cout << “最大需求矩阵:” << ‘\n’;
for (i = 0;i {
for (j = 0;j cout << maxx[i][j] << ’ ';
cout << ‘\n’;
}
cout << ‘\n’;
cout<<"
”;
cout << ‘\n’;
cout << “当前分配矩阵:” << ‘\n’;
for (i = 0;i {
for (j = 0;j cout << allocation[i][j] << ’ ';
cout << ‘\n’;
}
cout << ‘\n’;
cout<<“";
cout << ‘\n’;
cout << “当前需求矩阵:” << ‘\n’;
for (i = 0;i {
for (j = 0;j cout << need[i][j] << ’ ';
cout << ‘\n’;
}
cout << ‘\n’;
cout<<"
”;
cout << ‘\n’;
}
void roolBack(int p) //回滚函数,恢复到原来状态
{
int j;
for (j = 0;j {
available[j] += request[j];
allocation[p][j] -= request[j];
need[p][j] += request[j];
}
}
int checkSafe(int k) //安全检查函数,如果安全可形成一个安全序列
{
int i, j;
int flag = 1;
for (i = 0;i work[i] = available[i];
for (i = 0;i {
flag = 1;
if (!finish[i])
{
for (j = 0;j {
if (need[i][j]>work[j])
flag = 0;
}
if (flag)
{
for (j = 0;j work[j] += allocation[i][j];
finish[i] = 1;
safe[k++] = i;
i = -1;
}
}
}
for (i = 0;i {
if (!finish[i])
return 0;
}
return 1;
}
int request1(int p) //检查请求向量是否符合要求,小于需求需求向量,//并小于资源向量
{
int flag = 1;
int j;
for (j = 0;j {
if (request[j]>need[p][j])
{
flag = 0;
}
}
for (j = 0;j {
if (request[j]>avaliable [p][j])
{
flag = 0;
}
}
return flag;
}
int banker() //银行家算法实现函数
{
int i, j, p;
char ch;
cout << “初始化安全性检查:” << ‘\n’;
int k = 0;
for (i = 0;i finish[i] = 0;
if (checkSafe(k))
{
cout << “处于安全状态.安全序列为:”;
for (i = 0;i cout << safe[i] << ’ ';
cout << ‘\n’;
}
else
{
cout << “初始资源出错,退出程序.” << ‘\n’;
return 0;
}
display();
do {
for (i = 0;i safe[i] = 0;
for (i = 0;i finish[i] = 0;
cout << “请输入当前请求进程号(例如:p0,输入0):” << ‘\n’;
cin >> p;
cout << “请输入当前请求向量(例如:请求(1,2,3),输入1,2,3):” << ‘\n’;
for (i = 0;i cin >> request[i];
if (request1§)
{
for (j = 0;j {
available[j] -= request[j];
allocation[p][j] += request[j];
need[p][j] -= request[j];
}
k = 0;
if (checkSafe(k))
{
cout << “处于安全状态.安全序列为:”;
for (i = 0;i cout << safe[i] << ’ ';
cout << ‘\n’;
}
else
{
roolBack§;
cout << “不安全,请重新输入请求向量.” << ‘\n’;
}
}
else
{
cout << “当前请求向量不符合要求,请重新输入.” << ‘\n’;
}
display();
cout << “是否继续分配?(y or n)”;
cin >> ch;
} while (ch == ‘y’ || ch == ‘Y’);
return 0;
}
int main()
{
cout << “银行家算法” << ‘\n’;
inint();
display();
banker();
return 0;
}

你可能感兴趣的:(动态分配算法演示程序(银行家算法))