Untitled
unknown
plain_text
a year ago
7.4 kB
15
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define NUMBER_OF_CUSTOMERS 5
#define NUMBER_OF_RESOURCES 4
int available[NUMBER_OF_RESOURCES];
int maximum[NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];
int allocation[NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];
int need[NUMBER_OF_CUSTOMERS][NUMBER_OF_RESOURCES];
// Function declarations
bool is_safe(void);
int request_resources(int customer_num, int request[]);
void release_resources(int customer_num, int release[]);
void display_state(void);
bool is_safe() {
int work[NUMBER_OF_RESOURCES];
bool finish[NUMBER_OF_CUSTOMERS] = {false};
int finished_count = 0;
// Initialize work array with available resources
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
work[i] = available[i];
}
// For debugging
printf("\nDebug - Initial work array: ");
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
printf("%d ", work[i]);
}
printf("\n");
while (finished_count < NUMBER_OF_CUSTOMERS) {
bool found = false;
for (int i = 0; i < NUMBER_OF_CUSTOMERS; i++) {
if (!finish[i]) {
// Check if all needed resources are available
bool can_allocate = true;
for (int j = 0; j < NUMBER_OF_RESOURCES; j++) {
if (need[i][j] > work[j]) {
can_allocate = false;
break;
}
}
// If we can allocate to this process
if (can_allocate) {
// Debug output
printf("Debug - Process %d can be allocated. Before allocation: ", i);
for (int j = 0; j < NUMBER_OF_RESOURCES; j++) {
printf("%d ", work[j]);
}
printf("\n");
// Allocate resources
for (int j = 0; j < NUMBER_OF_RESOURCES; j++) {
work[j] += allocation[i][j];
}
finish[i] = true;
finished_count++;
found = true;
// Debug output
printf("Debug - After allocation: ");
for (int j = 0; j < NUMBER_OF_RESOURCES; j++) {
printf("%d ", work[j]);
}
printf("\n");
}
}
}
if (!found) {
printf("Debug - No process can be allocated in this iteration\n");
return false; // Deadlock detected
}
}
printf("Debug - All processes completed successfully\n");
return true;
}
int request_resources(int c, int req[]) {
// Debug output
printf("\nDebug - Processing request for customer %d: ", c);
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
printf("%d ", req[i]);
}
printf("\n");
// Check if request exceeds need or available
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
if (req[i] > need[c][i]) {
printf("Debug - Request exceeds need for resource %d\n", i);
return -1;
}
if (req[i] > available[i]) {
printf("Debug - Request exceeds available for resource %d\n", i);
return -1;
}
}
// Try allocation
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
available[i] -= req[i];
allocation[c][i] += req[i];
need[c][i] -= req[i];
}
// Check safety
if (!is_safe()) {
printf("Debug - State is unsafe after allocation, rolling back\n");
// Rollback
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
available[i] += req[i];
allocation[c][i] -= req[i];
need[c][i] += req[i];
}
return -1;
}
printf("Debug - Request granted successfully\n");
return 0;
}
void release_resources(int c, int rel[]) {
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
allocation[c][i] -= rel[i];
available[i] += rel[i];
need[c][i] += rel[i];
}
}
void display_state() {
printf("\nAvailable:\n");
for (int i = 0; i < NUMBER_OF_RESOURCES; i++)
printf("%d ", available[i]);
printf("\n\nMaximum:\n");
for (int i = 0; i < NUMBER_OF_CUSTOMERS; i++) {
for (int j = 0; j < NUMBER_OF_RESOURCES; j++)
printf("%d ", maximum[i][j]);
printf("\n");
}
printf("\nAllocation:\n");
for (int i = 0; i < NUMBER_OF_CUSTOMERS; i++) {
for (int j = 0; j < NUMBER_OF_RESOURCES; j++)
printf("%d ", allocation[i][j]);
printf("\n");
}
printf("\nNeed:\n");
for (int i = 0; i < NUMBER_OF_CUSTOMERS; i++) {
for (int j = 0; j < NUMBER_OF_RESOURCES; j++)
printf("%d ", need[i][j]);
printf("\n");
}
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc != NUMBER_OF_RESOURCES + 1) {
fprintf(stderr, "Usage: %s R1 R2 R3 R4\n", argv[0]);
return 1;
}
// Initialize available from command line
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
available[i] = atoi(argv[i+1]);
}
// Initialize allocation matrix to 0
memset(allocation, 0, sizeof(allocation));
// Open the maximum file
FILE *fp = fopen("maximum.txt", "r");
if (!fp) {
fprintf(stderr, "Error: Cannot open file maximum.txt\n");
return 1;
}
// Read maximum matrix and initialize need
for (int i = 0; i < NUMBER_OF_CUSTOMERS; i++) {
char line[256];
if (!fgets(line, sizeof(line), fp)) {
fprintf(stderr, "Error reading maximum file line.\n");
fclose(fp);
return 1;
}
line[strcspn(line, "\n")] = '\0';
char *token = strtok(line, ",");
for (int j = 0; j < NUMBER_OF_RESOURCES; j++) {
if (!token) {
fprintf(stderr, "Insufficient data in line %d.\n", i);
fclose(fp);
return 1;
}
maximum[i][j] = atoi(token);
need[i][j] = maximum[i][j]; // Initialize need
token = strtok(NULL, ",");
}
}
fclose(fp);
// Command loop
char cmd[10];
while (1) {
printf("Enter command (RQ, RL, *, QUIT): ");
if (scanf("%s", cmd) != 1) break;
if (strcmp(cmd, "RQ") == 0) {
int c, req[NUMBER_OF_RESOURCES];
if (scanf("%d", &c) != 1) break;
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
if (scanf("%d", &req[i]) != 1) break;
}
if (request_resources(c, req) == 0)
printf("Request satisfied.\n");
else
printf("Request denied.\n");
} else if (strcmp(cmd, "RL") == 0) {
int c, rel[NUMBER_OF_RESOURCES];
if (scanf("%d", &c) != 1) break;
for (int i = 0; i < NUMBER_OF_RESOURCES; i++) {
if (scanf("%d", &rel[i]) != 1) break;
}
release_resources(c, rel);
printf("Resources released.\n");
} else if (strcmp(cmd, "*") == 0) {
display_state();
} else if (strcmp(cmd, "QUIT") == 0) {
break;
}
}
return 0;
}Editor is loading...
Leave a Comment