Algoritmo del banquero en el sistema operativo – Part 1

Requisito previo: gráfico de asignación de recursos (RAG) , algoritmo de banquero , programa para el algoritmo de banquero El algoritmo 
de banquero es un algoritmo de asignación de recursos y evitación de puntos muertos. Este algoritmo prueba la seguridad simulando la asignación de cantidades posibles máximas predeterminadas de todos los recursos, luego realiza una verificación de «estado s» para probar posibles actividades, antes de decidir si se debe permitir que continúe la asignación.

En términos simples, verifica si la asignación de cualquier recurso conducirá a un punto muerto o no, O si es seguro asignar un recurso a un proceso y, de lo contrario, el recurso no se asigna a ese proceso. Determinar una secuencia segura (incluso si solo hay 1) garantizará que el sistema no entre en punto muerto.

El algoritmo de Banker se usa generalmente para encontrar si existe o no una secuencia segura. Pero aquí determinaremos el número total de secuencias seguras e imprimiremos todas las secuencias seguras.

La estructura de datos utilizada es: 

  • Vector disponible
  • Array máxima
  • Array de asignación
  • Array de necesidades

Ejemplo:
Entrada: 

Output: Safe sequences are:
P2--> P4--> P1--> P3
P2--> P4--> P3--> P1
P4--> P2--> P1--> P3
P4--> P2--> P3--> P1

There are total 4 safe-sequences 

Explicación: 
los recursos totales son R1 = 10, R2 = 5, R3 = 7 y los recursos asignados son R1 = (0+2+3+2 =) 7, R2 = (1+0+0+1 =) 2, R3 = (0+0+2+1 =) 3. Por lo tanto, los recursos restantes son R1 = (10 – 7 =) 3, R2 = (5 – 2 =) 3, R3 = (7 – 3 =) 4. 
Quedan disponibles = Recursos totales: recursos asignados 

necesidad restante = máx.: asignado
 

Entonces, podemos comenzar desde P2 o P4. No podemos satisfacer la necesidad restante de los recursos disponibles de P1 o P3 en el paso de primer o segundo intento del algoritmo de Banker. Solo hay cuatro posibles secuencias seguras. Estos son: 
P2–> P4–> P1–> P3 
P2–> P4–> P3–> P1 
P4–> P2–> P1–> P3 
P4–> P2–> P3–> P1

Implementación:

C++

// C++ Program to Print all possible safe sequences using banker's algorithm
#include <iostream>
#include <string.h>
#include <vector>
// total number of process
#define P 4
// total number of resources
#define R 3
  
// total safe-sequences
int total = 0;
  
using namespace std;
  
// function to check if process
// can be allocated or not
bool is_available(int process_id, int allocated[][R],
                  int max[][R], int need[][R], int available[])
{
  
    bool flag = true;
  
    // check if all the available resources
    // are less greater than need of process
    for (int i = 0; i < R; i++) {
  
        if (need[process_id][i] > available[i])
            flag = false;
    }
  
    return flag;
}
  
// Print all the safe-sequences
void safe_sequence(bool marked[], int allocated[][R], int max[][R],
                   int need[][R], int available[], vector<int> safe)
{
  
    for (int i = 0; i < P; i++) {
  
        // check if it is not marked
        // already and can be allocated
        if (!marked[i] && is_available(i, allocated, max, need, available)) {
  
            // mark the process
            marked[i] = true;
  
            // increase the available
            // by deallocating from process i
            for (int j = 0; j < R; j++)
                available[j] += allocated[i][j];
  
            safe.push_back(i);
            // find safe sequence by taking process i
            safe_sequence(marked, allocated, max, need, available, safe);
            safe.pop_back();
  
            // unmark the process
            marked[i] = false;
  
            // decrease the available
            for (int j = 0; j < R; j++)
                available[j] -= allocated[i][j];
        }
    }
  
    // if a safe-sequence is found, display it
    if (safe.size() == P) {
  
        total++;
        for (int i = 0; i < P; i++) {
  
            cout << "P" << safe[i] + 1;
            if (i != (P - 1))
                cout << "--> ";
        }
  
        cout << endl;
    }
}
  
// Driver Code
int main()
{
  
    // allocated matrix of size P*R
    int allocated[P][R] = { { 0, 1, 0 },
                            { 2, 0, 0 },
                            { 3, 0, 2 },
                            { 2, 1, 1 } };
  
    // max matrix of size P*R
    int max[P][R] = { { 7, 5, 3 },
                      { 3, 2, 2 },
                      { 9, 0, 2 },
                      { 2, 2, 2 } };
  
    // Initial total resources
    int resources[R] = { 10, 5, 7 };
  
    // available vector of size R
    int available[R];
  
    for (int i = 0; i < R; i++) {
  
        int sum = 0;
        for (int j = 0; j < P; j++)
            sum += allocated[j][i];
  
        available[i] = resources[i] - sum;
    }
  
    // safe vector for displaying a safe-sequence
    vector<int> safe;
  
    // marked of size P for marking allocated process
    bool marked[P];
    memset(marked, false, sizeof(marked));
  
    // need matrix of size P*R
    int need[P][R];
    for (int i = 0; i < P; i++)
        for (int j = 0; j < R; j++)
            need[i][j] = max[i][j] - allocated[i][j];
  
    cout << "Safe sequences are:" << endl;
    safe_sequence(marked, allocated, max, need, available, safe);
  
    cout << "\nThere are total " << total << " safe-sequences" << endl;
    return 0;
}

Java

// Java Program to Print all possible safe 
// sequences using banker's algorithm
import java.util.*;
  
public class GFG
{
  
    // total number of process
    static int P = 4;
      
    // total number of resources
    static int R = 3;
      
    // total safe-sequences
    static int total = 0;
  
    // function to check if process
    // can be allocated or not
    static boolean is_available(int process_id, int allocated[][],
                    int max[][], int need[][], int available[]) 
    {
  
        boolean flag = true;
  
        // check if all the available resources
        // are less greater than need of process
        for (int i = 0; i < R; i++)
        {
  
            if (need[process_id][i] > available[i]) 
            {
                flag = false;
            }
        }
  
        return flag;
    }
  
    // Print all the safe-sequences
    static void safe_sequence(boolean marked[], int allocated[][], int max[][],
                        int need[][], int available[], Vector<Integer> safe) 
    {
  
        for (int i = 0; i < P; i++) 
        {
  
            // check if it is not marked
            // already and can be allocated
            if (!marked[i] && is_available(i, allocated, max, need, available))
            {
  
                // mark the process
                marked[i] = true;
  
                // increase the available
                // by deallocating from process i
                for (int j = 0; j < R; j++) 
                {
                    available[j] += allocated[i][j];
                }
  
                safe.add(i);
                  
                // find safe sequence by taking process i
                safe_sequence(marked, allocated, max, need, available, safe);
                safe.removeElementAt(safe.size() - 1);
  
                // unmark the process
                marked[i] = false;
  
                // decrease the available
                for (int j = 0; j < R; j++) 
                {
                    available[j] -= allocated[i][j];
                }
            }
        }
  
        // if a safe-sequence is found, display it
        if (safe.size() == P) 
        {
  
            total++;
            for (int i = 0; i < P; i++) 
            {
  
                System.out.print("P" + (safe.get(i) + 1));
                if (i != (P - 1)) 
                {
                    System.out.print("--> ");
                }
            }
  
            System.out.println("");;
        }
    }
  
    // Driver Code
    public static void main(String[] args) 
    {
          
        // allocated matrix of size P*R
        int allocated[][] = {{0, 1, 0},
        {2, 0, 0},
        {3, 0, 2},
        {2, 1, 1}};
  
        // max matrix of size P*R
        int max[][] = {{7, 5, 3},
        {3, 2, 2},
        {9, 0, 2},
        {2, 2, 2}};
  
        // Initial total resources
        int resources[] = {10, 5, 7};
  
        // available vector of size R
        int[] available = new int[R];
  
        for (int i = 0; i < R; i++)
        {
  
            int sum = 0;
            for (int j = 0; j < P; j++) 
            {
                sum += allocated[j][i];
            }
  
            available[i] = resources[i] - sum;
        }
  
        // safe vector for displaying a safe-sequence
        Vector<Integer> safe = new Vector<Integer>();
  
        // marked of size P for marking allocated process
        boolean[] marked = new boolean[P];
  
        // need matrix of size P*R
        int[][] need = new int[P][R];
        for (int i = 0; i < P; i++)
        {
            for (int j = 0; j < R; j++)
            {
                need[i][j] = max[i][j] - allocated[i][j];
            }
        }
  
        System.out.println("Safe sequences are:");
        safe_sequence(marked, allocated, max, need, available, safe);
  
        System.out.println("\nThere are total " + total + " safe-sequences");
    }
}
  
/* This code contributed by PrinciRaj1992 */

Python3

# Python3 program to print all 
# possible safe sequences 
# using banker's algorithm
  
# Total number of process
P = 4
  
# Total number of resources
R = 3
   
# Total safe-sequences
total = 0
   
# Function to check if process
# can be allocated or not
def is_available(process_id, allocated, 
                 max, need, available):
                       
    flag = True
   
    # Check if all the available resources
    # are less greater than need of process
    for i in range(R):
        if (need[process_id][i] > available[i]):
            flag = False
   
    return flag
  
# Print all the safe-sequences
def safe_sequence(marked, allocated, 
                  max, need, available, safe):
      
    global total, P, R
      
    for i in range(P):
          
        # Check if it is not marked
        # already and can be allocated
        if (not marked[i] and 
            is_available(i, allocated, max,
                         need, available)):
                               
            # mark the process
            marked[i] = True
   
            # Increase the available
            # by deallocating from process i
            for j in range(R):
                available[j] += allocated[i][j]
   
            safe.append(i)
              
            # Find safe sequence by taking process i
            safe_sequence(marked, allocated, max,
                          need, available, safe)
            safe.pop()
   
            # unmark the process
            marked[i] = False
   
            # Decrease the available
            for j in range(R):
                available[j] -= allocated[i][j]
          
    # If a safe-sequence is found, display it
    if (len(safe) == P):
        total += 1
          
        for i in range(P):
            print("P" + str(safe[i] + 1), end = '')
             
            if (i != (P - 1)):
                print("--> ", end = '')
              
        print()
   
# Driver code        
if __name__=="__main__":
      
    # Allocated matrix of size P*R
    allocated = [ [ 0, 1, 0 ],
                  [ 2, 0, 0 ],
                  [ 3, 0, 2 ],
                  [ 2, 1, 1 ]]
   
    # max matrix of size P*R
    max = [ [ 7, 5, 3 ],
            [ 3, 2, 2 ],
            [ 9, 0, 2 ],
            [ 2, 2, 2 ] ]
   
    # Initial total resources
    resources = [ 10, 5, 7 ]
   
    # Available vector of size R
    available = [0 for i in range(R)]
      
    for i in range(R):
        sum = 0
          
        for j in range(P):
            sum += allocated[j][i]
   
        available[i] = resources[i] - sum
      
   
    # Safe vector for displaying a
    # safe-sequence
    safe = []
   
    # Marked of size P for marking 
    # allocated process
    marked = [False for i in range(P)]
   
    # Need matrix of size P*R
    need = [[0 for j in range(R)] 
               for i in range(P)]
      
    for i in range(P):
        for j in range(R):
            need[i][j] = (max[i][j] - 
                    allocated[i][j])
      
    print("Safe sequences are:")
      
    safe_sequence(marked, allocated, max,
                  need, available, safe)
      
    print("\nThere are total " + str(total) +
          " safe-sequences")
  
# This code is contributed by rutvik_56

C#

// C# Program to Print all possible safe 
// sequences using banker's algorithm
using System; 
using System.Collections.Generic; 
  
class GFG
{
  
    // total number of process
    static int P = 4;
      
    // total number of resources
    static int R = 3;
      
    // total safe-sequences
    static int total = 0;
  
    // function to check if process
    // can be allocated or not
    static Boolean is_available(int process_id, 
                                int [,]allocated,
                                int [,]max, int [,]need, 
                                int []available) 
    {
        Boolean flag = true;
  
        // check if all the available resources
        // are less greater than need of process
        for (int i = 0; i < R; i++)
        {
  
            if (need[process_id, i] > available[i]) 
            {
                flag = false;
            }
        }
  
        return flag;
    }
  
    // Print all the safe-sequences
    static void safe_sequence(Boolean []marked, 
                              int [,]allocated, 
                              int [,]max, int [,]need, 
                              int []available, 
                              List<int> safe) 
    {
        for (int i = 0; i < P; i++) 
        {
  
            // check if it is not marked
            // already and can be allocated
            if (!marked[i] && 
                is_available(i, allocated, max, 
                               need, available))
            {
  
                // mark the process
                marked[i] = true;
  
                // increase the available
                // by deallocating from process i
                for (int j = 0; j < R; j++) 
                {
                    available[j] += allocated[i, j];
                }
  
                safe.Add(i);
                  
                // find safe sequence by taking process i
                safe_sequence(marked, allocated, max,
                               need, available, safe);
                safe.RemoveAt(safe.Count - 1);
  
                // unmark the process
                marked[i] = false;
  
                // decrease the available
                for (int j = 0; j < R; j++) 
                {
                    available[j] -= allocated[i, j];
                }
            }
        }
  
        // if a safe-sequence is found, 
        // display it
        if (safe.Count == P) 
        {
            total++;
            for (int i = 0; i < P; i++) 
            {
                Console.Write("P" + (safe[i] + 1));
                if (i != (P - 1)) 
                {
                    Console.Write("--> ");
                }
            }
            Console.WriteLine("");;
        }
    }
  
    // Driver Code
    public static void Main(String[] args) 
    {
          
        // allocated matrix of size P*R
        int [,]allocated = {{0, 1, 0},
                            {2, 0, 0},
                            {3, 0, 2},
                            {2, 1, 1}};
  
        // max matrix of size P*R
        int [,]max = {{7, 5, 3},
                      {3, 2, 2},
                      {9, 0, 2},
                      {2, 2, 2}};
  
        // Initial total resources
        int []resources = {10, 5, 7};
  
        // available vector of size R
        int[] available = new int[R];
  
        for (int i = 0; i < R; i++)
        {
            int sum = 0;
            for (int j = 0; j < P; j++) 
            {
                sum += allocated[j,i];
            }
  
            available[i] = resources[i] - sum;
        }
  
        // safe vector for displaying a safe-sequence
        List<int> safe = new List<int>();
  
        // marked of size P for marking
        // allocated process
        Boolean[] marked = new Boolean[P];
  
        // need matrix of size P*R
        int[,] need = new int[P,  R];
        for (int i = 0; i < P; i++)
        {
            for (int j = 0; j < R; j++)
            {
                need[i, j] = max[i, j] - allocated[i, j];
            }
        }
  
        Console.WriteLine("Safe sequences are:");
        safe_sequence(marked, allocated, max, 
                       need, available, safe);
  
        Console.WriteLine("\nThere are total " + 
                            total + " safe-sequences");
    }
}
  
// This code is contributed by Rajput-Ji

Producción: 

Safe sequences are:
P2--> P4--> P1--> P3
P2--> P4--> P3--> P1
P4--> P2--> P1--> P3
P4--> P2--> P3--> P1

There are total 4 safe-sequences


Publicación traducida automáticamente

Artículo escrito por shubham_rana_77 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *