Refer to Banker's Algorithm in Operating System - GeeksforGeeks
The banker’s algorithm is a resource allocationand deadlock avoidance algorithm that tests for safety by simulating the allocation for predetermined maximum possible amounts of all resources, then makes an “s - state” check to test for possible activities, before deciding whether allocation should be allowed to continue.
Let n be the number of processes in the systemand m be the number of resources types.
-
Available :
- It is a 1-d array of size
mindicating the number of available resources of each type. Available[j] = kmeans there arekinstances of resource typeRj
- It is a 1-d array of size
-
Max :
- It is a 2-d array of size
n*mthat defines the maximum demand of each process in a system. Max[i, j] = kmeans processPimay request at mostkinstances of resource typeRj.
- It is a 2-d array of size
-
Allocation :
- It is a 2-d array of size
n*mthat defines the number of resources of each type currently allocated to each process. Allocation[i, j] = kmeans processPiis currently allocatedkinstances of resource typeRj
- It is a 2-d array of size
-
Need :
- It is a 2-d array of size
n*mthat indicates the remaining resource need of each process. Need[i, j] = kmeans processPicurrently needkinstances of resource typeRjfor its execution.Need[i, j] = Max[i, j] – Allocation[i, j]
Banker’s algorithm consists of Safety algorithm and Resource request algorithm.
Safety Algorithm
- It is a 2-d array of size
-
- Let Work and Finish be vectors of length
mandnrespectively.
Initialize: Work = Available
Finish[i] = false; for i=1, 2, 3, 4….n
- Let Work and Finish be vectors of length
-
- Find an i such that both
- a) Finish[i] = false
- b) Needi <= Work
if no such i exists goto step (4)
-
- Work = Work + Allocation[i]
Finish[i] = true
goto step (2)
- Work = Work + Allocation[i]
-
- if Finish [i] = true for all i
then the system is in a safe state
- if Finish [i] = true for all i
Resource-Request Algorithm
Request_i[j] = k means process Pi wants k instances of resource type Rj.
-
- If Requesti <= Needi
Goto step (2) ; otherwise, raise an error condition, since the process has exceeded its maximum claim.
- If Requesti <= Needi
-
- If Requesti <= Available
Goto step (3); otherwise, Pi must wait, since the resources are not available.
- If Requesti <= Available
-
- Have the system pretend to have allocated the requested resources to process Pi by modifying the state as follows:
Available = Available – Requesti
Allocationi = Allocationi + Requesti
Needi = Needi– Requesti
- Have the system pretend to have allocated the requested resources to process Pi by modifying the state as follows:
Implementation in C++
// Banker's Algorithm
#include <stdio.h>
int main()
{
// P0, P1, P2, P3, P4 are the Process names here
int i, j, k;
const int n = 5; // Number of processes
const int m = 3; // Number of resources
int alloc[5][3] = { { 0, 1, 0 }, // P0 // Allocation Matrix
{ 2, 0, 0 }, // P1
{ 3, 0, 2 }, // P2
{ 2, 1, 1 }, // P3
{ 0, 0, 2 } }; // P4
int max[5][3] = { { 7, 5, 3 }, // P0 // MAX Matrix
{ 3, 2, 2 }, // P1
{ 9, 0, 2 }, // P2
{ 2, 2, 2 }, // P3
{ 4, 3, 3 } }; // P4
int avail[3] = { 3, 3, 2 }; // Available Resources
int f[n], ans[n], ind = 0;
for (k = 0; k < n; k++) {
f[k] = 0;
}
int need[n][m];
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
need[i][j] = max[i][j] - alloc[i][j];
}
int y = 0;
for (k = 0; k < 5; k++) {
for (i = 0; i < n; i++) {
if (f[i] == 0) {
int flag = 0;
for (j = 0; j < m; j++) {
if (need[i][j] > avail[j]) {
flag = 1;
break;
}
}
if (flag == 0) {
ans[ind++] = i;
for (y = 0; y < m; y++)
avail[y] += alloc[i][y];
f[i] = 1;
}
}
}
}
printf("Following is the SAFE Sequence\n");
for (i = 0; i < n - 1; i++)
printf(" P%d ->", ans[i]);
printf(" P%d", ans[n - 1]);
return (0);
}
Output:
Following is the SAFE Sequence
P1 -> P3 -> P4 -> P0 -> P2
// C++ program to illustrate Banker's Algorithm
#include<iostream>
using namespace std;
// Number of processes
const int P = 5;
// Number of resources
const int R = 3;
// Function to find the need of each process
void calculateNeed(int need[P][R], int maxm[P][R],
int allot[P][R])
{
// Calculating Need of each P
for (int i = 0; i < P; i++)
for (int j = 0; j < R; j++)
// Need of instance = maxm instance -
// allocated instance
need[i][j] = maxm[i][j] - allot[i][j];
}
// Function to find the system is in safe state or not
bool isSafe(int processes[], int avail[], int maxm[][R],
int allot[][R])
{
int need[P][R];
// Function to calculate need matrix
calculateNeed(need, maxm, allot);
// Mark all processes as infinish
bool finish[P] = { 0 };
// To store safe sequence
int safeSeq[P];
// Make a copy of available resources
int work[R];
for (int i = 0; i < R; i++)
work[i] = avail[i];
// While all processes are not finished
// or system is not in safe state.
int count = 0;
while (count < P)
{
// Find a process which is not finish and
// whose needs can be satisfied with current
// work[] resources.
bool found = false;
for (int p = 0; p < P; p++)
{
// First check if a process is finished,
// if no, go for next condition
if (finish[p] == 0)
{
// Check if for all resources of
// current P need is less
// than work
int j;
for (j = 0; j < R; j++)
if (need[p][j] > work[j])
break;
// If all needs of p were satisfied.
if (j == R)
{
// Add the allocated resources of
// current P to the available/work
// resources i.e.free the resources
for (int k = 0; k < R; k++)
work[k] += allot[p][k];
// Add this process to safe sequence.
safeSeq[count++] = p;
// Mark this p as finished
finish[p] = 1;
found = true;
}
}
}
// If we could not find a next process in safe
// sequence.
if (found == false)
{
cout << "System is not in safe state";
return false;
}
}
// If system is in safe state then
// safe sequence will be as below
cout << "System is in safe state.\nSafe"
" sequence is: ";
for (int i = 0; i < P; i++)
cout << safeSeq[i] << " ";
return true;
}
// Driver code
int main()
{
int processes[] = { 0, 1, 2, 3, 4 };
// Available instances of resources
int avail[] = { 3, 3, 2 };
// Maximum R that can be allocated
// to processes
int maxm[][R] = { {7, 5, 3},
{3, 2, 2},
{9, 0, 2},
{2, 2, 2},
{4, 3, 3} };
// Resources allocated to processes
int allot[][R] = { {0, 1, 0},
{2, 0, 0},
{3, 0, 2},
{2, 1, 1},
{0, 0, 2} };
// Check system is in safe state or not
isSafe(processes, avail, maxm, allot);
return 0;
}
Output:
System is in safe state.
Safe sequence is: 1 3 4 0 2