Dev c++银行家算法代码实现
时间: 2023-06-17 11:08:36 浏览: 137
银行家算法C++代码实现.doc
银行家算法是操作系统中用于避免死锁的一种算法。下面是使用Dev C++实现银行家算法的代码:
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAX_PROCESS_NUM 10 // 最大进程数
#define MAX_RESOURCE_NUM 5 // 最大资源种类数
int Available[MAX_RESOURCE_NUM]; // 系统可用资源
int Max[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; // 进程最大需求资源
int Allocation[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; // 进程已分配资源
int Need[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; // 进程还需资源
int Work[MAX_RESOURCE_NUM]; // Work数组,表示系统可用资源的副本
int Finish[MAX_PROCESS_NUM]; // Finish数组,表示进程是否完成的标志
void init_data() { // 初始化数据
int i, j;
// 初始化Available数组
for (i = 0; i < MAX_RESOURCE_NUM; i++) {
printf("请输入系统可用的第%d种资源数量:", i + 1);
scanf("%d", &Available[i]);
}
// 初始化Max数组
for (i = 0; i < MAX_PROCESS_NUM; i++) {
printf("请输入进程P%d的最大需求:", i);
for (j = 0; j < MAX_RESOURCE_NUM; j++) {
scanf("%d", &Max[i][j]);
}
}
// 初始化Allocation数组和Need数组
for (i = 0; i < MAX_PROCESS_NUM; i++) {
printf("请输入进程P%d已分配的资源:", i);
for (j = 0; j < MAX_RESOURCE_NUM; j++) {
scanf("%d", &Allocation[i][j]);
Need[i][j] = Max[i][j] - Allocation[i][j];
}
Finish[i] = 0; // 初始化Finish数组
}
}
int safety_algorithm() { // 安全性算法
int i, j, k;
int flag; // 标志位,表示是否有进程可以完成
int count = 0; // 记录已完成的进程数
int safe_seq[MAX_PROCESS_NUM]; // 安全序列
// 初始化Work数组
for (i = 0; i < MAX_RESOURCE_NUM; i++) {
Work[i] = Available[i];
}
// 安全性算法主要过程
while (count < MAX_PROCESS_NUM) {
flag = 0;
for (i = 0; i < MAX_PROCESS_NUM; i++) {
if (!Finish[i]) { // 如果进程未完成
for (j = 0; j < MAX_RESOURCE_NUM; j++) {
if (Need[i][j] > Work[j]) { // 如果进程所需资源大于可用资源
break;
}
}
if (j == MAX_RESOURCE_NUM) { // 如果所有资源都满足
for (k = 0; k < MAX_RESOURCE_NUM; k++) {
Work[k] += Allocation[i][k]; // 更新Work数组
}
Finish[i] = 1; // 更新Finish数组
safe_seq[count++] = i; // 添加到安全序列中
flag = 1;
}
}
}
if (!flag) { // 如果没有进程可以完成
return -1;
}
}
// 输出安全序列
printf("安全序列为:");
for (i = 0; i < MAX_PROCESS_NUM; i++) {
printf("P%d", safe_seq[i]);
if (i < MAX_PROCESS_NUM - 1) {
printf(" -> ");
}
}
printf("\n");
return 0;
}
int request_algorithm() { // 请求算法
int i, j;
int request[MAX_RESOURCE_NUM]; // 请求资源
int pid; // 请求资源的进程号
printf("请输入请求资源的进程号(0 ~ %d):", MAX_PROCESS_NUM - 1);
scanf("%d", &pid);
printf("请输入进程P%d请求的资源:", pid);
for (i = 0; i < MAX_RESOURCE_NUM; i++) {
scanf("%d", &request[i]);
if (request[i] > Need[pid][i] || request[i] > Available[i]) { // 如果请求资源大于所需或者大于可用,请求无效
printf("请求无效!\n");
return -1;
}
}
// 尝试分配资源
for (i = 0; i < MAX_RESOURCE_NUM; i++) {
Available[i] -= request[i];
Allocation[pid][i] += request[i];
Need[pid][i] -= request[i];
}
// 进行安全性检查
if (safety_algorithm() == 0) {
printf("请求成功!\n");
} else {
printf("请求失败!\n");
// 还原分配结果
for (i = 0; i < MAX_RESOURCE_NUM; i++) {
Available[i] += request[i];
Allocation[pid][i] -= request[i];
Need[pid][i] += request[i];
}
return -1;
}
return 0;
}
int main() {
int choice;
init_data(); // 初始化数据
while (1) {
printf("\n请选择要进行的操作:\n");
printf("1. 安全性算法\n");
printf("2. 请求算法\n");
printf("3. 退出\n");
printf("请选择(1 ~ 3):");
scanf("%d", &choice);
switch (choice) {
case 1:
if (safety_algorithm() == 0) {
printf("系统安全!\n");
} else {
printf("系统不安全!\n");
}
break;
case 2:
request_algorithm();
break;
case 3:
exit(0);
break;
default:
printf("输入无效,请重新输入!\n");
break;
}
}
return 0;
}
```
注:以上代码仅供参考,实际使用时需要根据具体情况进行修改和适配。
阅读全文