The banker’s algorithm which is also known as avoidance algorithm is a deadlock detection algorithm. It was developed by Edsger Dijkstra. It is designed to check the safe state whenever a resource is requested. It takes analogy of bank, where customer request to withdraw cash. Based on some data the cash is lent to the customer. The banker can’t give more cash than what the customer has requested for, and the total available cash. As this algorithm uses bank analogy so named as banker’s algorithm

The basic data structures used to implement this algorithm are given below.
Let n be the total number of processes and m be the total number of resource types in the system.
Available: A vector of length m. It shows number of available resources of each type. If Available[i] = k, then k instances of resource Ri are available.
Max: An n×m matrix that contain maximum demand of each process. If Max[i,j] = k, then process Pi can request maximum k instances of resource type Rj.
Allocation: An n×m matrix that contain number of resources of each type currently allocated to each process. If Allocation[i,j] = k, then Pi is currently allocated k instances of resource type Rj.
Need: An n×m matrix that shows the remaining resource need of each process. If Need[i,j] = k, then process Pi may need k more instances of resource type Rj to complete the task.
Program for Banker’s Algorithm in C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | #include <stdio.h> int current[5][5], maximum_claim[5][5], available[5]; int allocation[5] = {0, 0, 0, 0, 0}; int maxres[5], running[5], safe = 0; int counter = 0, i, j, exec, resources, processes, k = 1; int main() { printf("\nEnter number of processes: "); scanf("%d", &processes); for (i = 0; i < processes; i++) { running[i] = 1; counter++; } printf("\nEnter number of resources: "); scanf("%d", &resources); printf("\nEnter Claim Vector:"); for (i = 0; i < resources; i++) { scanf("%d", &maxres[i]); } printf("\nEnter Allocated Resource Table:\n"); for (i = 0; i < processes; i++) { for(j = 0; j < resources; j++) { scanf("%d", ¤t[i][j]); } } printf("\nEnter Maximum Claim Table:\n"); for (i = 0; i < processes; i++) { for(j = 0; j < resources; j++) { scanf("%d", &maximum_claim[i][j]); } } printf("\nThe Claim Vector is: "); for (i = 0; i < resources; i++) { printf("\t%d", maxres[i]); } printf("\nThe Allocated Resource Table:\n"); for (i = 0; i < processes; i++) { for (j = 0; j < resources; j++) { printf("\t%d", current[i][j]); } printf("\n"); } printf("\nThe Maximum Claim Table:\n"); for (i = 0; i < processes; i++) { for (j = 0; j < resources; j++) { printf("\t%d", maximum_claim[i][j]); } printf("\n"); } for (i = 0; i < processes; i++) { for (j = 0; j < resources; j++) { allocation[j] += current[i][j]; } } printf("\nAllocated resources:"); for (i = 0; i < resources; i++) { printf("\t%d", allocation[i]); } for (i = 0; i < resources; i++) { available[i] = maxres[i] - allocation[i]; } printf("\nAvailable resources:"); for (i = 0; i < resources; i++) { printf("\t%d", available[i]); } printf("\n"); while (counter != 0) { safe = 0; for (i = 0; i < processes; i++) { if (running[i]) { exec = 1; for (j = 0; j < resources; j++) { if (maximum_claim[i][j] - current[i][j] > available[j]) { exec = 0; break; } } if (exec) { printf("\nProcess%d is executing\n", i + 1); running[i] = 0; counter--; safe = 1; for (j = 0; j < resources; j++) { available[j] += current[i][j]; } break; } } } if (!safe) { printf("\nThe processes are in unsafe state.\n"); break; } else { printf("\nThe process is in safe state"); printf("\nAvailable vector:"); for (i = 0; i < resources; i++) { printf("\t%d", available[i]); } printf("\n"); } } return 0; } |