La siguiente pregunta se hizo en el examen GATE 2012 CS.
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 privación
Respuesta (B)
Mire más de cerca el siguiente ciclo 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 } }
Consulte GATE Corner para ver todos los documentos/soluciones/explicaciones del año anterior, programa de estudios, fechas importantes, notas, etc.
Escriba comentarios si encuentra que alguna de las respuestas/explicaciones es incorrecta, o si desea compartir más información sobre los temas discutidos anteriormente.
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