Bankers resource request algorithm implementation in c

5.2k Views Asked by At

Below is the code for resource request. My safety algorithm is running fine but when I ask for additional resources it is giving error situation(request>need). But when I practically do it than I am unable to find any error.

here is my code

#include<stdio.h>
#include<conio.h>

int max[100][100];
int alloc[100][100];
int need[100][100];
int avail[100];
int n, r;

void input();

void show();

void cal();

int main() {
    int i, j;
    printf("********** Banker's Algo ************\n");
    input();
    show();
    cal();
    request();
    getch();
    return 0;
}

void input() {
    int i, j;
    printf("Enter the no of Processes\t");
    scanf("%d", &n);
    printf("Enter the no of resources instances\t");
    scanf("%d", &r);
    printf("Enter the Max Matrix\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < r; j++) {
            scanf("%d", &max[i][j]);
        }
    }
    printf("Enter the Allocation Matrix\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < r; j++) {
            scanf("%d", &alloc[i][j]);
        }

    }
    printf("Enter the available Resources\n");
    for (j = 0; j < r; j++) {
        scanf("%d", &avail[j]);
    }
}

void show() {
    int i, j;
    printf("Process\t Allocation\t Max\t Available\t");
    for (i = 0; i < n; i++) {
        printf("\nP%d\t ", i + 1);
        for (j = 0; j < r; j++) {
            printf("%d ", alloc[i][j]);
        }
        printf("\t");
        for (j = 0; j < r; j++) {
            printf("%d ", max[i][j]);
        }
        printf("\t");
        if (i == 0) {
            for (j = 0; j < r; j++)
                printf("%d ", avail[j]);
        }
    }
}

void cal() {
    int finish[100], temp, need[100][100], flag = 1, k, c1 = 0;
    int safe[100];
    int i, j;
    for (i = 0; i < n; i++) {
        finish[i] = 0;
    }
//find need matrix
    for (i = 0; i < n; i++) {
        for (j = 0; j < r; j++) {
            need[i][j] = max[i][j] - alloc[i][j];
        }
    }
    printf("\n");
    while (flag) {
        flag = 0;
        for (i = 0; i < n; i++) {
            int c = 0;
            for (j = 0; j < r; j++) {
                if ((finish[i] == 0) && (need[i][j] <= avail[j])) {
                    c++;
                    if (c == r) {
                        for (k = 0; k < r; k++) {
                            avail[k] += alloc[i][j];
                            finish[i] = 1;
                            flag = 1;
                        }
                        printf("P%d->", i);
                        if (finish[i] == 1) {
                            i = n;
                        }
                    }
                }
            }
        }
    }
    for (i = 0; i < n; i++) {
        if (finish[i] == 1) {
            c1++;
        } else {
            printf("P%d->", i);
        }

    }
    if (c1 == n) {
        printf("\n The system is in safe state");
    } else {
        printf("\n Process are in dead lock");
        printf("\n System is in unsafe state");
    }
}

void request() {
    int c, pid, request[100][100], B[100][100], i;
    printf("\n Do you want make an additional request for any of the process ? (1=Yes|0=No)");
    scanf("%d", &c);
    if (c == 1) {
        printf("\n Enter process number : ");
        scanf("%d", &pid);
        printf("\n Enter additional request : \n");
        for (i = 0; i < r; i++) {
            printf(" Request for resource %d : ", i + 1);
            scanf("%d", &request[0][i]);
        }
        for (i = 0; i < r; i++) {
            if (request[0][i] > need[pid][i]) {
                printf("\n ******Error encountered******\n");
                exit(0);
            }
        }
        for (i = 0; i < r; i++) {
            avail[i] -= request[0][i];
            alloc[pid][i] += request[0][i];
            need[pid][i] -= request[0][i];
        }
        cal();
        getch();
    } else {
        exit(0);
    }
}

OUTPUT for the above code:

Enter the no of Processes       5
Enter the no of resources instances     3
Enter the Max Matrix
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
Enter the Allocation Matrix
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
Enter the available Resources
3 3 2
Process  Allocation      Max     Available
P1       0 1 0  7 5 3   3 3 2 
P2       2 0 0  3 2 2 
P3       3 0 2  9 0 2 
P4       2 1 1  2 2 2 
P5       0 0 2  4 3 3 
P1->P3->P4->P2->P0->
 The system is in safe state
 Do you want make an additional request for any of the process ? (1=Yes|0=No)1

 Enter process number : 2

 Enter additional request : 
 Request for resource 1 : 1
 Request for resource 2 : 2
 Request for resource 3 : 1

 ******Error encountered******

OUTPUT that is needed:

*********DEADLOCK AVOIDANCE USINGBANKER'S ALGORITHM***********

 Enter total number of processes : 5

 Enter total number of resources : 3
Enter the Max Matrix
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
Enter the Allocation Matrix
0 1 0
2 0 0
3 0
2
2 1 1
0 0 2

 Available resources : 
 Resource 1 : 3  
 Resource 2 : 3 
 Resource 3 : 2

 ********Maximum Requirement Matrix*********
7       5       3
3       2       2
9       0       2
2       2       2
4       3       3
 ********Allocation Matrix**********
0       1       0
2       0       0
3       0       2
2       1       1
0       0       2

 A safety sequence has been detected.
 P1  P3  P4  P0  P2 

 Do you want make an additionalrequest for any of the process ? (1=Yes|0=No)1

 Enter process number : 2

 Enter additional request : 
 Request for resource 1 : 1
 Request for resource 2 : 2 
 Request for resource 3 : 1
 A safety sequence has been detected.
 P1  P3  P4  P0  P2 

Where can I make changes to get the above output.

1

There are 1 best solutions below

0
On BEST ANSWER

Having done some cleanup on your code it appears that your problem is that in if (request[0][i] > need[pid][i]) {, you are looking at the values,

request[0][0] = 1
request[0][1] = 2
request[0][2] = 1

However when you compare this against need you are comparing against need[2][i], the values of i at this time are,

need[2][0] = 6
need[2][1] = 0
need[2][2] = 0

As such when i=1 and when i=2 the values 1 and 2 are more than 0 and 0, as such the error occurs.

I've modified the output to show you the values in need,

********** Banker's Algo ************
Enter the no of Processes   5
Enter the no of resources instances 3
Enter the Max Matrix
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
Enter the Allocation Matrix
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
Enter the available Resources
3 3 2

P1->P3->P4->P2->P0->
 The system is in safe state
Process  Allocation  Need    Max     Available
P1   0 1 0  7 5 3   7 4 3   8 8 7 
P2   2 0 0  3 2 2   1 2 2   
P3   3 0 2  9 0 2   6 0 0   
P4   2 1 1  2 2 2   0 1 1   
P5   0 0 2  4 3 3   4 3 1   
 Do you want make an additional request for any of the process ? (1=Yes|0=No)1

 Enter process number : 2

 Enter additional request : 
 Request for resource 1 : 1
 Request for resource 2 : 2
 Request for resource 3 : 1

 ******Error encountered******

Code,

#include<stdio.h>
#include<stdlib.h>
//include<conio.h>

int max[100][100];
int alloc[100][100];
int need[100][100];
int avail[100];
int n, r;

void input();

void show();

void cal();

void request();

int main() {
    int i, j;
    printf("********** Banker's Algo ************\n");
    input();
    cal();
    show();
    request();
    //getch();
    return 0;
}

void input() {
    int i, j;
    printf("Enter the no of Processes\t");
    scanf("%d", &n);
    printf("Enter the no of resources instances\t");
    scanf("%d", &r);
    printf("Enter the Max Matrix\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < r; j++) {
            scanf("%d", &max[i][j]);
        }
    }
    printf("Enter the Allocation Matrix\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < r; j++) {
            scanf("%d", &alloc[i][j]);
        }

    }
    printf("Enter the available Resources\n");
    for (j = 0; j < r; j++) {
        scanf("%d", &avail[j]);
    }
}

void show() {
    int i, j;
    printf("Process\t Allocation\t Need\t Max\t Available");
    for (i = 0; i < n; i++) {
        printf("\nP%d\t ", i + 1);
        for (j = 0; j < r; j++) {
            printf("%d ", alloc[i][j]);
        }
        printf("\t");
        for (j = 0; j < r; j++) {
            printf("%d ", max[i][j]);
        }
        printf("\t");
        for (j = 0; j < r; j++) {
            printf("%d ", need[i][j]);
        }
        printf("\t");
        if (i == 0) {
            for (j = 0; j < r; j++)
                printf("%d ", avail[j]);
        }
    }
}

void cal() {
    int finish[100], flag = 1, k, c1 = 0;
    int i, j;
    for (i = 0; i < n; i++) {
        finish[i] = 0;
    }

    //find need matrix
    for (i = 0; i < n; i++) {
        for (j = 0; j < r; j++) {
            need[i][j] = max[i][j] - alloc[i][j];
        }
    }
    printf("\n");
    while (flag) {
        flag = 0;
        for (i = 0; i < n; i++) {
            int c = 0;
            for (j = 0; j < r; j++) {
                if ((finish[i] == 0) && (need[i][j] <= avail[j])) {
                    c++;
                    if (c == r) {
                        for (k = 0; k < r; k++) {
                            avail[k] += alloc[i][j];
                            finish[i] = 1;
                            flag = 1;
                        }
                        printf("P%d->", i);
                        if (finish[i] == 1) {
                            i = n;
                        }
                    }
                }
            }
        }
    }
    for (i = 0; i < n; i++) {
        if (finish[i] == 1) {
            c1++;
        } else {
            printf("P%d->", i);
        }

    }
    if (c1 == n) {
        printf("\n The system is in safe state\n");
    } else {
        printf("\n Process are in dead lock\n");
        printf("\n System is in unsafe state\n");
    }
}

void request() {
    int c, pid, request[100][100], i;
    printf("\n Do you want make an additional request for any of the process ? (1=Yes|0=No)");
    scanf("%d", &c);
    if (c == 1) {
        printf("\n Enter process number : ");
        scanf("%d", &pid);
        printf("\n Enter additional request : \n");
        for (i = 0; i < r; i++) {
            printf(" Request for resource %d : ", i + 1);
            scanf("%d", &request[0][i]);
        }
        for (i = 0; i < r; i++) {
            if (request[0][i] > need[pid][i]) {
                printf("\n ******Error encountered******\n");
                exit(0);
            }
        }
        for (i = 0; i < r; i++) {
            avail[i] -= request[0][i];
            alloc[pid][i] += request[0][i];
            need[pid][i] -= request[0][i];
        }
        cal();
        //getch();
    } else {
        exit(0);
    }
}