Bankers Algorithm - Deadlock Prevention



The Banker's Algorithm, primarily known for deadlock avoidance, can also be adapted for deadlock detection. Here's how the Banker's Algorithm can be used for deadlock detection:

Banker's Algorithm for Deadlock Detection:

System Snapshot:
  • Similar to deadlock avoidance, the deadlock detection version of the Banker's Algorithm starts by taking a snapshot of the current system state.
  • This snapshot includes information about the maximum resources each process may need, the resources currently allocated to each process, and the available resources.
Resource Allocation Simulation:
  • Instead of attempting to allocate resources to processes as in the avoidance version, in the deadlock detection variant, the algorithm doesn't actually allocate resources.
  • It simulates resource allocation to processes without making any changes to the actual resource allocation state.
Safety Check:
  • The algorithm performs a safety check on the system state to determine if it's in a safe state or not.
  • Unlike the avoidance version, where the objective is to keep the system in a safe state, in deadlock detection, the goal is to identify whether the current state can lead to a deadlock.
Detection of Unsafe States:
  • If the safety check reveals that the system is in an unsafe state (i.e., there's no safe sequence of resource allocations), it indicates a potential deadlock.
  • An unsafe state implies that if resource requests were granted according to the current snapshot, deadlock could occur.
Reporting Deadlocks:
  • Upon detecting an unsafe state, the algorithm identifies the processes involved in the deadlock and reports them.
  • It may also provide additional information, such as the resource requests that led to the unsafe state and the processes holding resources.
Example:
  • Consider a scenario where the Banker's Algorithm for deadlock detection detects an unsafe state:Suppose the algorithm simulates resource allocation and finds that there's no safe sequence to allocate resources.
  • This indicates that granting resource requests according to the current state could potentially lead to deadlock.
  • The algorithm then identifies the processes involved in the deadlock and reports them, providing insight into the resource requests that contributed to the deadlock.
Conclusion:

By simulating resource allocation and performing safety checks, the Banker's Algorithm can effectively detect potential deadlocks in a system. It's a valuable tool for preemptively identifying and addressing deadlock situations before they occur, thus enhancing system reliability and stability.

//**************************************
// C -Implementation Dead lock Detection
//**************************************
#include <stdio.h>

#define MAX_PROC 10
#define MAX_RES 10

int n, m; // Number of processes and resources
int max[MAX_PROC][MAX_RES]; // Maximum resource needs of processes
int alloc[MAX_PROC][MAX_RES]; // Resources currently allocated to processes
int avail[MAX_RES]; // Available resources
int finish[MAX_PROC]; // Array to track if a process is finished

// Function to perform safety check using Banker's Algorithm
int isSafe() {
    int work[MAX_RES], temp_finish[MAX_PROC];
    int i, j;

    // Initialize work[] with available resources
    for (i = 0; i < m; i++) {
        work[i] = avail[i];
    }

    // Initialize temp_finish[] to track finished processes
    for (i = 0; i < n; i++) {
        temp_finish[i] = finish[i];
    }

    int count = 0;
    while (count < n) {
        int found = 0; // Flag to check if a process can be allocated resources
        for (i = 0; i < n; i++) {
            if (temp_finish[i] == 0) {
                // Check if process i can be allocated resources
                int j, flag=1;
                for (j = 0; j < m; j++) {
                    if (max[i][j] - alloc[i][j] > work[j]) {
                        flag=0;
                        break; // Not enough resources available for process i
                    }
                }
                if (flag==1) {
                    // If all resources can be allocated to process i
                    // Mark process i as finished and update work[]
                    for (int k = 0; k < m; k++) {
                        work[k] += alloc[i][k];
                    }
                    temp_finish[i] = 1;
                    found = 1;
                    count++;
                }
            }
        }
        if (found == 0) {
            // If no process can be allocated resources, it's an unsafe state
            return 0;
        }
    }
    // If all processes can be allocated resources safely, it's a safe state
    return 1;
}

// Main function
int main() {
    int i, j;

    // Input number of processes and resources
    printf("Enter number of processes: ");
    scanf("%d", &n);
    printf("Enter number of resources: ");
    scanf("%d", &m);

    // Input maximum resource needs of processes
    printf("Enter maximum resource needs for each process:\n");
    for (i = 0; i < n; i++) {
        printf("For process P%d: ", i);
        for (j = 0; j < m; j++) {
            scanf("%d", &max[i][j]);
        }
    }

    // Input resources currently allocated to processes
    printf("Enter resources currently allocated to each process:\n");
    for (i = 0; i < n; i++) {
        printf("For process P%d: ", i);
        for (j = 0; j < m; j++) {
            scanf("%d", &alloc[i][j]);
        }
    }

    // Input available resources
    printf("Enter available resources: ");
    for (i = 0; i < m; i++) {
        scanf("%d", &avail[i]);
    }

    // Initialize finish[] array
    for (i = 0; i < n; i++) {
        finish[i] = 0;
    }

    // Perform safety check
    if (isSafe()) {
        printf("System is in safe state. No deadlock detected.\n");
    } else {
        printf("System is in unsafe state. Deadlock detected.\n");
    }

    return 0;
}

Enter number of processes: 5
Enter number of resources: 3
Enter maximum resource needs for each process:
For process P0: 7 5 3
For process P1: 3 2 2
For process P2: 9 0 2
For process P3: 2 2 2
For process P4: 4 3 3
Enter resources currently allocated to each process:
For process P0: 1 1 1
For process P1: 3 2 1
For process P2: 1 0 0
For process P3: 1 0 0
For process P4: 0 0 0
Enter available resources: 1 1 1
System is in unsafe state. Deadlock detected.

Comments

Popular posts from this blog

CSL 204 OPERATING SYSTEM LAB KTU IV SEM CSE

FCFS and SJF

Banker's Algorithm- Deadlock Detection