#include <stdio.h>
#define MAX_PROCESSES 5
#define MAX_RESOURCES 3
int available[MAX_RESOURCES];
int maximum[MAX_PROCESSES][MAX_RESOURCES];
int allocation[MAX_PROCESSES][MAX_RESOURCES];
int need[MAX_PROCESSES][MAX_RESOURCES];
int request_resources(int process_id, int request[]);
int release_resources(int process_id, int release[]);
int is_safe();
void print_state();
int main() {
// 初始化资源数量
printf("Enter the number of available resources:\n");
for (int i = 0; i < MAX_RESOURCES; i++) {
scanf("%d", &available[i]);
}
// 初始化最大需求矩阵
printf("Enter the maximum demand of each process:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
printf("For process %d:\n", i);
for (int j = 0; j < MAX_RESOURCES; j++) {
scanf("%d", &maximum[i][j]);
}
}
// 初始化分配矩阵
printf("Enter the allocation of each process:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
printf("For process %d:\n", i);
for (int j = 0; j < MAX_RESOURCES; j++) {
scanf("%d", &allocation[i][j]);
// 计算需要矩阵
need[i][j] = maximum[i][j] - allocation[i][j];
}
}
// 执行银行家算法
int process_id;
int request[MAX_RESOURCES];
int release[MAX_RESOURCES];
while (1) {
printf("Enter process id (or -1 to exit): ");
scanf("%d", &process_id);
if (process_id == -1) {
break;
}
printf("Enter the request for process %d:\n", process_id);
for (int i = 0; i < MAX_RESOURCES; i++) {
scanf("%d", &request[i]);
}
if (request_resources(process_id, request)) {
printf("Request granted. System is in safe state.\n");
print_state();
} else {
printf("Request denied. System remains in safe state.\n");
}
printf("Enter the resources to release for process %d:\n", process_id);
for (int i = 0; i < MAX_RESOURCES; i++) {
scanf("%d", &release[i]);
}
release_resources(process_id, release);
print_state();
}
return 0;
}
int request_resources(int process_id, int request[]) {
for (int i = 0; i < MAX_RESOURCES; i++) {
if (request[i] > need[process_id][i] || request[i] > available[i]) {
return 0; // Request denied
}
}
// Pretend to allocate resources
for (int i = 0; i < MAX_RESOURCES; i++) {
available[i] -= request[i];
allocation[process_id][i] += request[i];
need[process_id][i] -= request[i];
}
if (!is_safe()) {
// Roll back changes if not in a safe state
for (int i = 0; i < MAX_RESOURCES; i++) {
available[i] += request[i];
allocation[process_id][i] -= request[i];
need[process_id][i] += request[i];
}
return 0; // Request denied
}
return 1; // Request granted
}
int release_resources(int process_id, int release[]) {
for (int i = 0; i < MAX_RESOURCES; i++) {
available[i] += release[i];
allocation[process_id][i] -= release[i];
need[process_id][i] += release[i];
}
return 1; // Resources released successfully
}
int is_safe() {
int work[MAX_RESOURCES];
int finish[MAX_PROCESSES];
// Initialize work and finish arrays
for (int i = 0; i < MAX_RESOURCES; i++) {
work[i] = available[i];
}
for (int i = 0; i < MAX_PROCESSES; i++) {
finish[i] = 0;
}
// Find an index i such that both finish[i] is false and
// need[i] is less than or equal to work
int count = 0;
while (count < MAX_PROCESSES) {
int found = 0;
for (int i = 0; i < MAX_PROCESSES; i++) {
if (!finish[i]) {
int j;
for (j = 0; j < MAX_RESOURCES; j++) {
if (need[i][j] > work[j]) {
break;
}
}
if (j == MAX_RESOURCES) {
// Process i can finish
for (int k = 0; k < MAX_RESOURCES; k++) {
work[k] += allocation[i][k];
}
finish[i] = 1;
found = 1;
count++;
}
}
}
if (!found) {
// No such process found
break;
}
}
return count == MAX_PROCESSES;
}
void print_state() {
printf("Available resources: ");
for (int i = 0; i < MAX_RESOURCES; i++) {
printf("%d ", available[i]);
}
printf("\n");
printf("Maximum matrix:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
for (int j = 0; j < MAX_RESOURCES; j++) {
printf("%d ", maximum[i][j]);
}
printf("\n");
}
printf("Allocation matrix:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
for (int j = 0; j < MAX_RESOURCES; j++) {
printf("%d ", allocation[i][j]);
}
printf("\n");
}
printf("Need matrix:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
for (int j = 0; j < MAX_RESOURCES; j++) {
printf("%d ", need[i][j]);
}
printf("\n");
}
}
#include <stdio.h>
#define MAX_PROCESSES 5
#define MAX_RESOURCES 3
int available[MAX_RESOURCES];
int maximum[MAX_PROCESSES][MAX_RESOURCES];
int allocation[MAX_PROCESSES][MAX_RESOURCES];
int need[MAX_PROCESSES][MAX_RESOURCES];
int request_resources(int process_id, int request[]);
int release_resources(int process_id, int release[]);
int is_safe();
void print_state();
int main() {
// 初始化资源数量
printf("Enter the number of available resources:\n");
for (int i = 0; i < MAX_RESOURCES; i++) {
scanf("%d", &available[i]);
}
// 初始化最大需求矩阵
printf("Enter the maximum demand of each process:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
printf("For process %d:\n", i);
for (int j = 0; j < MAX_RESOURCES; j++) {
scanf("%d", &maximum[i][j]);
}
}
// 初始化分配矩阵
printf("Enter the allocation of each process:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
printf("For process %d:\n", i);
for (int j = 0; j < MAX_RESOURCES; j++) {
scanf("%d", &allocation[i][j]);
// 计算需要矩阵
need[i][j] = maximum[i][j] - allocation[i][j];
}
}
// 执行银行家算法
int process_id;
int request[MAX_RESOURCES];
int release[MAX_RESOURCES];
while (1) {
printf("Enter process id (or -1 to exit): ");
scanf("%d", &process_id);
if (process_id == -1) {
break;
}
printf("Enter the request for process %d:\n", process_id);
for (int i = 0; i < MAX_RESOURCES; i++) {
scanf("%d", &request[i]);
}
if (request_resources(process_id, request)) {
printf("Request granted. System is in safe state.\n");
print_state();
} else {
printf("Request denied. System remains in safe state.\n");
}
printf("Enter the resources to release for process %d:\n", process_id);
for (int i = 0; i < MAX_RESOURCES; i++) {
scanf("%d", &release[i]);
}
release_resources(process_id, release);
print_state();
}
return 0;
}
int request_resources(int process_id, int request[]) {
for (int i = 0; i < MAX_RESOURCES; i++) {
if (request[i] > need[process_id][i] || request[i] > available[i]) {
return 0; // Request denied
}
}
// Pretend to allocate resources
for (int i = 0; i < MAX_RESOURCES; i++) {
available[i] -= request[i];
allocation[process_id][i] += request[i];
need[process_id][i] -= request[i];
}
if (!is_safe()) {
// Roll back changes if not in a safe state
for (int i = 0; i < MAX_RESOURCES; i++) {
available[i] += request[i];
allocation[process_id][i] -= request[i];
need[process_id][i] += request[i];
}
return 0; // Request denied
}
return 1; // Request granted
}
int release_resources(int process_id, int release[]) {
for (int i = 0; i < MAX_RESOURCES; i++) {
available[i] += release[i];
allocation[process_id][i] -= release[i];
need[process_id][i] += release[i];
}
return 1; // Resources released successfully
}
int is_safe() {
int work[MAX_RESOURCES];
int finish[MAX_PROCESSES];
// Initialize work and finish arrays
for (int i = 0; i < MAX_RESOURCES; i++) {
work[i] = available[i];
}
for (int i = 0; i < MAX_PROCESSES; i++) {
finish[i] = 0;
}
// Find an index i such that both finish[i] is false and
// need[i] is less than or equal to work
int count = 0;
while (count < MAX_PROCESSES) {
int found = 0;
for (int i = 0; i < MAX_PROCESSES; i++) {
if (!finish[i]) {
int j;
for (j = 0; j < MAX_RESOURCES; j++) {
if (need[i][j] > work[j]) {
break;
}
}
if (j == MAX_RESOURCES) {
// Process i can finish
for (int k = 0; k < MAX_RESOURCES; k++) {
work[k] += allocation[i][k];
}
finish[i] = 1;
found = 1;
count++;
}
}
}
if (!found) {
// No such process found
break;
}
}
return count == MAX_PROCESSES;
}
void print_state() {
printf("Available resources: ");
for (int i = 0; i < MAX_RESOURCES; i++) {
printf("%d ", available[i]);
}
printf("\n");
printf("Maximum matrix:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
for (int j = 0; j < MAX_RESOURCES; j++) {
printf("%d ", maximum[i][j]);
}
printf("\n");
}
printf("Allocation matrix:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
for (int j = 0; j < MAX_RESOURCES; j++) {
printf("%d ", allocation[i][j]);
}
printf("\n");
}
printf("Need matrix:\n");
for (int i = 0; i < MAX_PROCESSES; i++) {
for (int j = 0; j < MAX_RESOURCES; j++) {
printf("%d ", need[i][j]);
}
printf("\n");
}
}