Untitled

 avatar
unknown
plain_text
a month ago
7.4 kB
4
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;
}
Leave a Comment