El algoritmo bancario es un algoritmo de asignación de recursos y evitación de interbloqueos desarrollado por Edsger Dijkstra que prueba la seguridad simulando la asignación de cantidades máximas posibles predeterminadas de todos los recursos y luego realiza una verificación de "estado s" para probar posibles condiciones de interbloqueo para todos los demás. actividades pendientes, antes de decidir si se debe permitir que continúe la asignación.
El algoritmo se desarrolló en el proceso de diseño del sistema operativo THE y se describió originalmente (en holandés ) en EWD108. [1] Cuando un nuevo proceso ingresa a un sistema, debe declarar el número máximo de instancias de cada tipo de recurso que puede reclamar; Claramente, ese número no puede exceder el número total de recursos del sistema. Además, cuando un proceso obtiene todos los recursos solicitados, debe devolverlos en un tiempo finito.
Para que el algoritmo del banquero funcione, necesita saber tres cosas:
Se podrán asignar recursos a un proceso sólo si la cantidad de recursos solicitados es menor o igual a la cantidad disponible; de lo contrario, el proceso espera hasta que haya recursos disponibles.
Algunos de los recursos que se rastrean en los sistemas reales son la memoria , los semáforos y el acceso a la interfaz .
El algoritmo del banquero deriva su nombre del hecho de que este algoritmo podría usarse en un sistema bancario para garantizar que el banco no se quede sin recursos, porque el banco nunca asignaría su dinero de tal manera que ya no pueda satisfacer las necesidades. necesidades de todos sus clientes. [2] Al utilizar el algoritmo del banquero, el banco garantiza que cuando los clientes soliciten dinero, el banco nunca abandone un estado seguro. Si la solicitud del cliente no hace que el banco salga de un estado seguro, se asignará el efectivo; de lo contrario, el cliente deberá esperar hasta que otro cliente deposite lo suficiente.
Estructuras de datos básicas que se mantendrán para implementar el algoritmo del banquero:
Sea n el número de procesos en el sistema y m el número de tipos de recursos. Entonces necesitamos las siguientes estructuras de datos:
Nota: Necesidad[i,j] = Max[i,j] - Asignación[i,j]. n=ma.
Los recursos totales del sistema son:A B C D6 5 7 6
Los recursos disponibles del sistema son:A B C D3 1 1 2
Procesos (recursos actualmente asignados): A B C DP1 1 2 2 1P2 1 0 3 3P3 1 2 1 0
Procesos (recursos máximos): A B C DP1 3 3 2 2P2 1 2 3 4P3 1 3 5 0
Necesidad = recursos máximos - recursos actualmente asignadosProcesos (posiblemente recursos necesarios): A B C DP1 2 1 0 1P2 0 2 0 1P3 0 1 4 0
Un estado (como en el ejemplo anterior) se considera seguro si es posible que todos los procesos terminen de ejecutarse (terminar). Dado que el sistema no puede saber cuándo terminará un proceso, o cuántos recursos habrá solicitado para entonces, el sistema supone que todos los procesos eventualmente intentarán adquirir sus recursos máximos establecidos y terminarán poco después. Esta es una suposición razonable en la mayoría de los casos, ya que al sistema no le preocupa especialmente cuánto tiempo se ejecuta cada proceso (al menos no desde la perspectiva de evitar interbloqueos). Además, si un proceso finaliza sin adquirir su recurso máximo, solo lo hace más fácil para el sistema. Se considera que un estado seguro es quien toma las decisiones si va a procesar la cola lista.
Dada esa suposición, el algoritmo determina si un estado es seguro tratando de encontrar un conjunto hipotético de solicitudes de los procesos que permitirían a cada uno adquirir sus recursos máximos y luego terminar (devolviendo sus recursos al sistema). Cualquier estado donde no exista tal conjunto es un estado inseguro .
Podemos demostrar que el estado dado en el ejemplo anterior es un estado seguro mostrando que es posible que cada proceso adquiera sus recursos máximos y luego finalice.
Como ejemplo de un estado inseguro, considere lo que sucedería si el proceso 2 tuviera 1 unidad del recurso B al principio.
Cuando el sistema recibe una solicitud de recursos, ejecuta el algoritmo del banquero para determinar si es seguro otorgar la solicitud. El algoritmo es bastante sencillo una vez que se comprende la distinción entre estados seguros e inseguros.
Si el sistema rechaza o pospone una solicitud imposible o insegura es una decisión específica del sistema operativo.
Ejemplo
Comenzando en el mismo estado en el que comenzó el ejemplo anterior, suponga que el proceso 1 solicita 2 unidades del recurso C.
Por otro lado, supongamos que el proceso 3 solicita 1 unidad del recurso C.
Recursos del sistema disponibles A B C DGratis 3 1 0 2
Procesos (recursos actualmente asignados): A B C DP1 1 2 2 1P2 1 0 3 3P3 1 2 2 0
Procesos (recursos máximos): A B C DP1 3 3 2 2P2 1 2 3 4P3 1 3 5 0
Ejemplo final: desde el estado en el que comenzamos, supongamos que el proceso 2 solicita 1 unidad del recurso B.
Recursos disponibles del sistema: A B C DGratis 3 0 1 2
Procesos (recursos actualmente asignados): A B C DP1 1 2 5 1P2 1 1 3 3P3 1 2 1 0
Procesos (recursos máximos): A B C DP1 3 3 2 2P2 1 2 3 4P3 1 3 5 0
importar numpy como npn_processes = int ( input ( "¿Número de procesos? " )) n_resources = int ( input ( "¿Número de recursos? " ))recursos_disponibles = [ int ( x ) para x en entrada ( "¿Vector de reclamo?" ) . dividir ( " " )]actualmente_asignado = np . matriz ([ [ int ( x ) para x en entrada ( f "Actualmente asignado para el proceso { i + 1 } ? " ) . split ( " " )] para i en rango ( n_procesos ) ]) demanda_max = np . matriz ([ [ int ( x ) para x en entrada ( f "Demanda máxima del proceso { i + 1 } ? " ) . split ( " " )] para i en rango ( n_procesos ) ]) total_disponible = recursos_disponibles - np . suma ( actualmente asignada , eje = 0 ) en ejecución = np . ones ( n_processes ) # Una matriz con n_processes unos para indicar si el proceso aún no se ha ejecutadomientras np . count_nonzero ( en ejecución ) > 0 : al menos_uno_allocado = Falso para p en el rango ( n_procesos ): si se está ejecutando [ p ]: si todo ( i >= 0 para i en total_disponible - ( max_demand [ p ] - actualmente_allocado [ p ])): al menos_uno_allocado = Verdadero imprimir ( f " { p } se está ejecutando" ) ejecutando [ p ] = 0 total_disponible += actualmente_asignado [ p ] si no al_menos_uno_asignado : imprimir ( "Inseguro" ) romper # salir más : imprimir ( "Seguro" )
Al igual que los otros algoritmos, el algoritmo del banquero tiene algunas limitaciones cuando se implementa. Específicamente, necesita saber qué cantidad de cada recurso podría solicitar un proceso. En la mayoría de los sistemas, esta información no está disponible, lo que hace imposible implementar el algoritmo bancario. Además, no es realista suponer que el número de procesos es estático ya que en la mayoría de los sistemas el número de procesos varía dinámicamente. Además, el requisito de que un proceso libere eventualmente todos sus recursos (cuando finalice el proceso) es suficiente para la corrección del algoritmo, pero no es suficiente para un sistema práctico. Por lo general, no es aceptable esperar horas (o incluso días) para que se liberen los recursos.
{{cite book}}
: Mantenimiento CS1: varios nombres: lista de autores ( enlace )