Sistemas operativos modernos
el bloqueo esté libre; luego adquiere el bloqueo y termina. Después de la región crítica, el pro ceso invoca a salir_region, que coloca un Oen bloqueo. Al igual que con todas las soluciones basadas en regiones críticas, los procesos deben invocar a entrar_region y salir^region en los momentos correctos para que el método funcione. Si un proceso hace trampa, la exclusión mu tua fracasará. 2.3.4 Activar y desactivar Tanto la solución de Peterson como la que usa TSL son correctas, pero ambas tienen el defec to de que requieren espera activa. En esencia, lo que estas soluciones hacen es lo siguiente: cuando un proceso quiere entrar en su región crítica, verifica si tal ingreso está permitido. Si no está permitido, el proceso entra en un ciclo corto para esperar hasta que lo esté. Este enfoque no sólo desperdicia tiempo de CPU, sino que puede tener efectos inesperados. Consideremos una computadora con dos procesos; A, que es prioritario, y B, que no lo es. Las reglas de calendarización son de tal forma que A se ejecuta siempre que está en estado listo. En cierto momento, cuando B está en su región crítica, A queda listo para ejecutarse (es decir, ter mina una operación de E/S). Ahora A inicia una espera activa, pero dado que B nunca se calen- dariza mientras A se está ejecutando, B nunca tendrá oportunidad de salir de su región crítica, y A seguirá dando vueltas en forma indefinida. Esta situación se conoce como problema de in versión de prioridad. Ahora veamos algunas primitivas de comunicación entre procesos que se bloquean, en lu gar de desperdiciar tiempo de CPU, cuando no se les permite entrar en su región crítica. Una de las más sencillas es el par sieep y wakeup. SIeep es una llamada al sistema que hace que el invocador se bloquee, es decir, quede suspendido hasta que otro proceso lo active. La llama da wakeup tiene un parámetro, el proceso por activar. De manera alternativa, tanto sIeep co mo wakeup tienen un parámetro: una dirección de memoria que sirve para relacionar llamadas sieep con llamadas wakeup. El problema del productor-consumidor Como ejemplo del uso de estas primitivas, consideremos el problema del productor-consu- midor (también conocido como problema del búfer acotado). Dos procesos comparten un bú fer de tamaño fijo. Uno de ellos, el productor, coloca información allí y el otro, el consumidor, la saca. (También es posible generalizar el problema a m productores y n consumidores, pero sólo consideraremos el caso de un productor y un consumidor porque eso simplifica las solu ciones.) Los problemas surgen cuando el productor quiere colocar un nuevo elemento en el búfer pero éste ya está lleno. La solución es que el productor se desactive y se vuelva a actuar cuan do el consumidor haya sacado uno o más elementos. Asimismo, si el consumidor quiere sacar un elemento del búfer y ve que está vacío, se desactiva hasta que el productor coloca algo allí y lo activa. Este enfoque parece sencillo, pero da pie a condiciones de competencia como las que vi mos antes con el directorio de spooler. Para determinar cuántos elementos hay en el búfer, ne
RkJQdWJsaXNoZXIy MjI4NDcx