银行家算法 1)输入进程个数、进程资源个数、所有进程的Allocation(单个进程的资源 之间以空格间隔,进程之间以分号间隔,如123;456)。可资源申请,输入 要申请资源的进程序号和申请的资源(以空格间隔)。 2)输出所有的安全序列和序列数量,如果申请的资源不符合条件则输出“申 请的资源不符合条件!请重新输入!”。c语言代码
时间: 2024-03-24 21:41:11 浏览: 51
以下是C语言实现银行家算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_PROCESS_NUM 10 // 最大进程数
#define MAX_RESOURCE_NUM 10 // 最大资源数
int process_num; // 进程个数
int resource_num; // 资源种类数
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 request[MAX_PROCESS_NUM][MAX_RESOURCE_NUM]; // 请求矩阵
int work[MAX_RESOURCE_NUM]; // 工作向量
int finish[MAX_PROCESS_NUM]; // 进程是否能完成
// 比较两个向量是否相等
int is_equal(int v1[], int v2[], int n) {
for (int i = 0; i < n; i++) {
if (v1[i] != v2[i]) {
return 0;
}
}
return 1;
}
// 输出安全序列
void print_safe_sequence(int safe_sequence[], int count) {
printf("安全序列:");
for (int i = 0; i < count; i++) {
printf("%d ", safe_sequence[i]);
}
printf("\n");
}
// 判断是否存在安全序列
int is_safe_sequence() {
int work_copy[MAX_RESOURCE_NUM];
int finish_copy[MAX_PROCESS_NUM];
int safe_sequence[MAX_PROCESS_NUM];
int count = 0;
// 初始化工作向量和进程是否完成的标记
for (int i = 0; i < resource_num; i++) {
work_copy[i] = available[i];
}
for (int i = 0; i < process_num; i++) {
finish_copy[i] = finish[i];
}
// 找到一个未完成的进程且它的需求小于等于工作向量
for (int i = 0; i < process_num; i++) {
if (!finish_copy[i] && is_equal(need[i], work_copy, resource_num)) {
// 将该进程的资源分配给它
for (int j = 0; j < resource_num; j++) {
work_copy[j] += allocation[i][j];
}
// 标记该进程完成
finish_copy[i] = 1;
// 将该进程添加到安全序列中
safe_sequence[count++] = i;
// 重新从头开始搜索
i = -1;
}
}
// 如果所有进程都完成,则说明存在安全序列
if (is_equal(finish_copy, finish, process_num)) {
print_safe_sequence(safe_sequence, count);
return 1;
} else {
return 0;
}
}
int main() {
// 读入进程个数和资源种类数
printf("请输入进程个数和资源种类数:");
scanf("%d %d", &process_num, &resource_num);
// 读入可用资源数量
printf("请输入可用资源数量:");
for (int i = 0; i < resource_num; i++) {
scanf("%d", &available[i]);
}
// 读入最大需求矩阵
printf("请输入最大需求矩阵:\n");
for (int i = 0; i < process_num; i++) {
for (int j = 0; j < resource_num; j++) {
scanf("%d", &max[i][j]);
}
}
// 读入已分配矩阵
printf("请输入已分配矩阵:\n");
for (int i = 0; i < process_num; i++) {
for (int j = 0; j < resource_num; j++) {
scanf("%d", &allocation[i][j]);
// 计算需求矩阵
need[i][j] = max[i][j] - allocation[i][j];
}
}
// 初始化进程是否能完成的标记
for (int i = 0; i < process_num; i++) {
finish[i] = 0;
}
// 判断是否存在安全序列
if (is_safe_sequence()) {
// 如果存在安全序列,则进行资源分配
int process_id, resource_num;
printf("请输入要申请资源的进程序号和申请的资源:");
scanf("%d %d", &process_id, &resource_num);
for (int i = 0; i < resource_num; i++) {
scanf("%d", &request[process_id][i]);
}
// 判断是否可以满足请求
for (int i = 0; i < resource_num; i++) {
if (request[process_id][i] > need[process_id][i] || request[process_id][i] > available[i]) {
printf("申请的资源不符合条件!请重新输入!\n");
return 0;
}
}
// 如果可以满足请求,则进行资源分配
for (int i = 0; i < resource_num; i++) {
available[i] -= request[process_id][i];
allocation[process_id][i] += request[process_id][i];
need[process_id][i] -= request[process_id][i];
}
// 判断是否存在安全序列
if (is_safe_sequence()) {
printf("资源分配成功!\n");
} else {
printf("资源分配失败!\n");
// 恢复分配之前的状态
for (int i = 0; i < resource_num; i++) {
available[i] += request[process_id][i];
allocation[process_id][i] -= request[process_id][i];
need[process_id][i] += request[process_id][i];
}
}
} else {
printf("不存在安全序列!\n");
}
return 0;
}
```
注意,此代码只是一个简单的实现,没有考虑死锁等问题,实际使用时还需要进一步完善。
阅读全文