Sistemas operativos modernos
La instrucción TSL Ahora examinemos una propuesta que requiere un poco de ayuda del hardware. Muchas compu tadoras, sobre todo las diseñadas pensando en miíltiples procesadores, tienen una instrucción TSL RX.BLOQUEO {Test and Set Lock, probar y establecer bloqueo) que funciona como sigue: lee el contenido de la palabra de memoria bloqueo, lo coloca en el registro RX y luego guarda un valor distinto de ce ro en la dirección de memoria bloqueo. Se garantiza que las operaciones de leer la palabra y escribir en ella son indivisibles: ningún otro procesador puede tener acceso a la palabra de me moria antes de que haya terminado de ejecutarse la instrucción. La CPU que ejecuta la instruc ción TSL cierra el bus de memoria para impedir que otras CPUs tengan acceso a la memoria antes de que termine. Para usar la instrucción TSL, nos valdremos de una variable compartida, bloqueo, para coordinar el acceso a la memoria compartida. Cuando bloqueo es O, cualquier proceso puede establecerla a 1 utilizando la instrucción TSL y luego leer o escribir en la memoria comparti da. Cuando termina, el proceso vuelve a establecer a Odicha variable utilizando una instruc ción move ordinaria. ¿Cómo puede esta instrucción evitar que dos procesos ingresen al mismo tiempo en su re gión crítica? La solución se da en la figura 2-22, donde se muestra una subrutina de cuatro ins trucciones en un lenguaje ensamblador ficticio (aunque representativo). La primera instrucción copia el valor antiguo de bloqueo en el registro y luego establece bloqueo a 1. A continuación, el valor antiguo se compara con 0. Si es distinto de cero, quiere decir que el bloqueo ya estaba establecido, así que el programa tan sólo vuelve al principio para probarlo otra vez. Tarde o temprano el bloqueo será O (cuando el proceso que actualmente está en su región crítica salga de ella) y la subrutina terminará, con el bloqueo establecido. Quitar el bloqueo es sencillo. El programa sólo coloca un Oen bloqueo', no se requieren instrucciones especiales. entrar_region: T S L R EG ISTRO ,B LOQU EO l copia el bloqueo en el registro y lo establece a 1 OMP R EG IST RO ,#0 I ¿el bloqueo era cero? JN E entrar_region I si no era O, había bloqueo; por lo tanto, realiza un ciclo R E T I retorno al invocador; se entró en región crítica salir_region: MOVE BLOQUEO,#0 R E T I retorno al invocador I establece a O el bloqueo Figura 2-22. Ingreso en, y salida de, la región crítica empleando la instrucción T S L . Ahora una de las soluciones del problema de la región críüca es sencilla. Antes de entrar en su región crítica, un proceso invoca a entrar_region, que efectúa una espera activa hasta que
RkJQdWJsaXNoZXIy MjI4NDcx