Fetch_And_Add(X,i) es una instrucción atómica de lectura, modificación y escritura que lee el valor de la ubicación de memoria X, lo incrementa en el valor i y devuelve el valor anterior de X. Se usa en el pseudocódigo que se muestra a continuación para implementar un Bloqueo de espera ocupada. L es una variable compartida entera sin signo inicializada en 0. El valor de 0 corresponde a que el bloqueo está disponible, mientras que cualquier valor distinto de cero corresponde a que el bloqueo no está disponible.
AcquireLock(L){ while (Fetch_And_Add(L,1)) L = 1; } ReleaseLock(L){ L = 0; }
Esta implementación
(A) falla porque L puede desbordarse
(B) falla porque L puede tomar un valor distinto de cero cuando el bloqueo está realmente disponible
(C) funciona correctamente pero puede privar a algunos procesos
(D) funciona correctamente sin hambre
Respuesta: ( B)
Explicación: mire más de cerca el siguiente bucle while.
while (Fetch_And_Add(L,1)) L = 1; // A waiting process // can be here just after // the lock is released, // and can make L = 1.
Considere una situación en la que un proceso acaba de liberar el bloqueo e hizo que L = 0. Que haya un proceso más esperando el bloqueo, significa ejecutar la función AcquireLock(). Justo después de que L se convirtió en 0, deje que los procesos en espera ejecuten la línea L = 1. Ahora, el bloqueo está disponible y L = 1. Dado que L es 1, el proceso en espera (y cualquier otro proceso futuro) no puede salir del bucle while.
El problema anterior se puede resolver cambiando AcuireLock() a siguiente.
AcquireLock(L){ while (Fetch_And_Add(L,1)) { // Do Nothing } }
El desbordamiento puede ocurrir solo cuando un número mayor de procesos que el tamaño de ‘int’ ejecutan la condición de verificación del ciclo while pero no L = 1, es decir, se requiere preferencia.
Pero cuando L es 1, el proceso se repite en el ciclo while; no hay desbordamiento porque después de cada incremento a L, L vuelve a ser igual a 1.
La opción (b) es la mejor opción sobre la opción (a).
Fuente: https://www.geeksforgeeks.org/operating-systems-set-17/
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA