Sistemas operativos modernos
#define N 100 typedef int semaforo; semaforo mutex = 1; semaforo vacias = N; semaforo llenas = 0; void productor(void) { int elem; while (TRUE) { elem = producir_elem( ); down(&vacias); down(&mutex); insertar_elem(elem); up(&mutex); up(&ttenas); } r ranuras en el búfer V /* los semáforos son int especiales */ r controla el acceso a región crítica */ /* cuenta ranuras de búfer vacías */ r cuenta ranuras de búfer ocupadas V /* TRUE es la constante 1 */ /* genera algo para poner en el búfer V /* decrementa la cuenta de vacías */ /* entra en región crítica */ /* pone elem. nuevo en el búfer */ r sale de la región crítica V r incrementa la cuenta de ranuras ocupadas V void consumidor(void) { int elem; white (TRUE) { down(&llenas); down(&mutex); elem = sacar_elem( ); up(&mutex); up(&vacias); consumir_elem(elem); } r ciclo infinito V /* decrementa cuenta de ocupadas V /* entra en región crítica */ /* saca un elemento del búfer */ /* sale de región crítica */ r incrementa la cuenta de ranuras vacías */ r hace algo con el elemento */ Figura 2-24. El problema de productor-consumidor empleando semáforos. En el ejemplo de la figura 2-24 utilizamos los semáforos de dos maneras distintas. Esta di ferencia es lo bastante importante como para destacarla. El semáforo mutex sirve para exclu sión mutua: está diseñado para garantizar que sólo un proceso estará leyendo o escribiendo en el búfer y las variables asociadas en un momento dado. Esta exclusión mutua es necesaria pa ra evitar el caos. En la siguiente sección estudiaremos más a fondo la exclusión mutua y cómo lograrla.
RkJQdWJsaXNoZXIy MjI4NDcx