Contadores de Eventos(Problema del productor y consumidor)
1. Problema del productor y el consumidor
Carolina Dávila Llerena
Lic. Diseño Web y Aplicaciones Multimedia
2. Dos procesos comparten un almacén de
tamaño fijo. Uno de ellos, el productor
coloca información en el almacén,
mientras que el otro, el consumidor, la
obtiene de él.
El problema surge cuando el productor
desea colocar un nuevo elemento en el
almacén, pero está lleno.
3. Si el almacén está lleno el productor debe
irse a dormir.
El consumidor debe despertar al productor
cuando haya eliminado uno o más
elementos del almacén.
Si el consumidor desea eliminar algún
elemento del almacén y está vacío debe
irse a dormir.
4. El productor despierta al consumidor
cuando ha puesto algo en el almacén.
Se necesita saber el tamaño del almacén.
Con está técnica no se necesita la
exclusión mutua.
Se utiliza un tipo especial de variable
llamada contador de eventos.
5. Hay tres operaciones sobre el contador
de eventos (E):
Read(E). Da el valor actual de E.
Advanced(E). Incrementa a E en 1.
Await(E,v). Espera a que E >= v.
6. Los contadores inician en 0 y sólo
aumentan.
Se usan dos contadores de eventos, in
e out.
7. in, cuenta el número de elementos que
el productor ha colocado en el almacén
desde el inicio de la ejecución del
programa.
out, cuenta el número de elementos que
el consumidor ha retirado del almacén
hasta el momento.
8. Cuando el productor desea colocar un
elemento en el almacén, verifica si hay
espacio por medio de await.
El consumidor espera a que in sea igual
a k- elemento, es decir, que el productor
ha colocado k elementos en el almacén,
antes de eliminarlo.
9. #include “prototypes.h”
#define N 100 /*número de entradas en el almacén (buffer)*/
typedef int event_counter; /*event_counter son un tipo especial de int*/
event_counter in = 0; /*cuenta los elementos insertados en el almacén
(buffer) */
event_counter out = 0; /*cuenta los elementos retirados del almacén (buffer)*/
void producer(void)
{
int item, sequence = 0;
while (TRUE) { /*ciclo infinito*/
sequence = sequence + 1; /*número de elemento a eliminar del almacén
(buffer)*/
await(in, sequence); /*espera a que esté presente el elemento del
espacio*/
remove_item(&item); /*retira al elemento de la entrada (sequence – 1) % N */
Advance(&out); /*deja que el productor se entere de que el elemento
ha sido retirado*/
consume_item(item) /*hace algo con el elemento*/
}
}