Problema del consumidor del productor usando semáforos | Serie 1

Requisito previo: semáforos en el sistema operativo , el problema del consumidor del productor de comunicación entre procesos 
es un problema de sincronización clásico. Podemos resolver este problema usando semáforos. 

Un semáforo S es una variable entera a la que solo se puede acceder a través de dos operaciones estándar: esperar() y señal(). 
La operación wait() reduce el valor del semáforo en 1 y la operación signal() aumenta su valor en 1. 

wait(S){
while(S<=0);   // busy waiting
S--;
}

signal(S){
S++;
}

Los semáforos son de dos tipos:  

  1. Semáforo binario: es similar al bloqueo mutex pero no es lo mismo. Solo puede tener dos valores: 0 y 1. Su valor se inicializa en 1. Se utiliza para implementar la solución del problema de la sección crítica con múltiples procesos. 
     
  2. Semáforo de conteo: su valor puede variar en un dominio sin restricciones. Se utiliza para controlar el acceso a un recurso que tiene varias instancias. 
     

Declaración del problema: tenemos un búfer de tamaño fijo. Un productor puede producir un artículo y puede colocarlo en el búfer. Un consumidor puede elegir artículos y consumirlos. Necesitamos asegurarnos de que cuando un productor coloca un artículo en el búfer, al mismo tiempo, el consumidor no debe consumir ningún artículo. En este problema, el búfer es la sección crítica. 

Para resolver este problema, necesitamos dos semáforos de conteo: lleno y vacío. «Lleno» realiza un seguimiento de la cantidad de elementos en el búfer en un momento dado y «Vacío» realiza un seguimiento de la cantidad de ranuras desocupadas. 

Inicialización de semáforos – 
mutex = 1 
Full = 0 // Inicialmente, todas las ranuras están vacías. Por lo tanto, las ranuras llenas son 0 
Vacío = n // Todas las ranuras están vacías inicialmente 

Solución para Productor – 

do{

//produce an item

wait(empty);
wait(mutex);

//place in buffer

signal(mutex);
signal(full);

}while(true)

Cuando el productor produce un artículo, el valor de «vacío» se reduce en 1 porque ahora se llenará un espacio. El valor de mutex también se reduce para evitar que el consumidor acceda al búfer. Ahora, el productor ha colocado el artículo y, por lo tanto, el valor de «completo» aumenta en 1. El valor de mutex también aumenta en 1 porque la tarea del productor se ha completado y el consumidor puede acceder al búfer. 

Solución para el Consumidor – 

do{

wait(full);
wait(mutex);

// remove item from buffer

signal(mutex);
signal(empty);

// consumes item

}while(true)

A medida que el consumidor retira un elemento del búfer, el valor de «completo» se reduce en 1 y el valor de mutex también se reduce para que el productor no pueda acceder al búfer en este momento. Ahora, el consumidor ha consumido el artículo, aumentando así el valor de «vacío» en 1. El valor de mutex también aumenta para que el productor pueda acceder al búfer ahora. 

Consulte la implementación: solución productor-consumidor utilizando semáforos en Java | conjunto 2

Publicación traducida automáticamente

Artículo escrito por India_1998 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *