Untitled
#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; }
Leave a Comment