PUERTA | PUERTA CS 2012 | Pregunta 30

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/

Cuestionario de esta pregunta

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

Deja una respuesta

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