En informática , la instrucción de CPU de prueba y configuración se utiliza para implementar la exclusión mutua en entornos multiprocesador . Aunque se puede implementar un bloqueo correcto con test-and-set, puede conducir a la contención de recursos en el bloqueo de ocupado (causado por el bloqueo del bus y la invalidación de la caché cuando la operación de prueba y configuración necesita acceder a la memoria de forma atómica ).
Para reducir la sobrecarga, se utiliza una prueba de protocolo de bloqueo más elaborada y una prueba y configuración .
Dado un candado:
booleano bloqueado: = falso // variable de bloqueo compartido
El protocolo de entrada es:
procedimiento EnterCritical () { do { while (bloqueado == verdadero) saltar // girar hasta que el bloqueo parezca libre } while ( TestAndSet (bloqueado) == verdadero) // intentar el bloqueo atómico real usando la instrucción de prueba y configuración}
El protocolo de salida es:
procedimiento ExitCritical () { bloqueado: = falso}
El protocolo de entrada utiliza lecturas de memoria normales para esperar a que se libere el candado. Test-and-set solo se usa para intentar obtener el bloqueo cuando la lectura normal de la memoria dice que está libre. Por lo tanto, las costosas operaciones de memoria atómica ocurren con menos frecuencia que en un simple giro de prueba y configuración.
Si el lenguaje de programación utilizado admite la evaluación de cortocircuitos , el protocolo de entrada podría implementarse como:
procedimiento EnterCritical () { while (bloqueado == verdadero o TestAndSet (bloqueado) == verdadero) saltar // girar hasta bloquear }
Consideración
Aunque esta optimización es útil en la programación del sistema , debe evitarse en la programación concurrente de alto nivel a menos que todas las restricciones sean claras y se comprendan. Un ejemplo de mal uso es un lenguaje similar llamado bloqueo de doble verificación , que no es seguro sin precauciones especiales y puede ser un anti-patrón . [1]
Ver también
Referencias
- ^ David Bacon y col. La declaración "El bloqueo verificado dos veces está roto" .
- Gregory R. Andrews, Fundamentos de la programación multiproceso, paralela y distribuida , págs. 100–101. Addison-Wesley, 2000. ISBN 0-201-35752-6 .