
实验三 预防进程死锁的银行家算法
一、需求分析
1)输入的形式和输入值的范围
输入进程个数、资源数、最大需求矩阵、分配矩阵、各资源现有数量。
输入值都应大于0。
2)输出的形式
输出用户输入的所有数据以及是否安全,若安全显示安全序列,若不安
全则输出系统是不安全的。在要求用户输入进程请求后显示是否安全,若安
全显示安全序列,若不安全显示拒绝请求。
3)程序所能达到的功能
能够判断用户输入的数据是否正确,以及系统是否安全,若安全则分配;
若不安全则拒绝分配
4)测试数据

二、概要设计
#define MAXPROCESS 100//最大进程数
#define MAXRESOURCE 100 //最大资源数
int AVAILIABLE[MAXRESOURCE]; //可用资源数组
int MAX[MAXPROCESS][MAXRESOURCE]; //最大需求矩阵
int ALLOCATION[MAXPROCESS][MAXRESOURCE]; //分配矩阵
int NEED[MAXPROCESS][MAXRESOURCE]; //需求矩阵
int REQUEST[MAXPROCESS][MAXRESOURCE]; //进程请求
bool FINISH[MAXPROCESS]; //是否分配
int p[MAXPROCESS]; //安全序列
int m, n; //m 个进程,n 个资源
void Init() //初始化
void print(int n,int m) //显示用户输入数据
bool safe() //安全性算法
void bank() //银行家算法
三、详细设计
bool safe() {
int l = 0;
int Work[MAXRESOURCE];//工作数组
for (int i = 0; i < n; i++)

Work[i] = AVAILIABLE[i];
for (int i = 0; i < m; i++)
FINISH[i] = false;
while (l < m) {
int init_index = l;
int j;
for (int i = 0; i < m; i++) {
if (FINISH[i] == true) //如果这个进程安全则继续下一个循环
continue;
for (j = 0; j < n; j++)
if (NEED[i][j] > Work[j])
break;
if (j == n) {
FINISH[i] = true;
for (int k = 0; k < n; k++)
Work[k] += ALLOCATION[i][k];
p[l++] = i;//记录进程号
}
else //如果超过继续循环下一个进程
continue;
}
if (l == init_index) {
cout << "系统是不安全的" << endl;
return false;
}
}
cout << "系统是安全的" << endl;
cout << "安全序列:" << endl;

for (int i = 0; i < l; i++) {
cout << p[i];
if (i != l - 1)
cout << "-->";
}
cout << endl;
return true;
}
void bank() {
int number, flag = 0; //number 为资源进程号
while (1) {
print(n,m);
cout << endl;
while (true) {
cout << "请输入要申请的进程号" << endl;
cin >> number;
if (number > m) {
cout << "没有该进程" << endl;
continue;
}
cout << "请输入所请求的各资源数量" << endl;
for (int i = 0; i < n; i++)
cin >> REQUEST[number][i];
for (int i = 0; i < n; i++) {
if (REQUEST[number][i] > NEED[number][i]) {
cout << "请求数超过进程需求量,重新输入" << endl;
continue;
}

if (REQUEST[number][i] > AVAILIABLE[i]) {
cout << "请求数超过系统资源数,重新输入" << endl;
continue;
}
}
break;
}
for (int i = 0; i < n; i++) {
AVAILIABLE[i] -= REQUEST[number][i];
ALLOCATION[number][i] += REQUEST[number][i];
NEED[number][i] -= REQUEST[number][i];
}
if (safe())
cout << "同意分配请求" << endl;
else {
cout << "拒绝请求" << endl;
for (int i = 0; i < n; i++) { //资源还给系统
AVAILIABLE[i] += REQUEST[number][i];
ALLOCATION[number][i] -= REQUEST[number][i];
NEED[number][i] += REQUEST[number][i];
}
}
for (int i = 0; i < n; i++) { //判断是否还需要资源
if (NEED[number][i] <= 0)
flag++;
}
if (flag == n) { //如果该进程各类资源都满足条件,则释放资源
for (int i = 0; i < n; i++) {