Le modèle Producteur - Consommateur


Définition

Le producteur et le consommateur sont deux processus cycliques.

ProducteurConsommateur
...
produire(messageP);
déposer(case, messageP);
...
...
retirer(case, messageC);
consommer(messageC);
...

Problèmes : déposer un message alors que le consommateur n'a pas retiré le prédent ou retirer un message alors que le producteur n'a rien déposé.

Solution à une case

On utilise 2 sémaphores plein et vide initialisé à 0 et 1.

plein indique si la case est pleine et vide ...

ProducteurConsommateur
P(vide)
produire(messageP);
déposer(case, messageP);
V(plein)
P(plein)
retirer(case, messageC);
consommer(messageC);
V(vide)

Amélioration :

ProducteurConsommateur
produire(messageP);
P(vide)
déposer(case, messageP);
V(plein)
P(plein)
retirer(case, messageC);
V(vide)
consommer(messageC);

Solution à n cases

Hypothèse : tampon à n cases.

Il faut gérer le tampon. C'est-à-dire :

On utilise 2 sémaphores plein et vide initialisé à 0 et n.

Les indices tête et queue sont initialisés à 0.

plein indique le nombre de cases pleines et vide ...

ProducteurConsommateur
produire(messageP);
P(vide);
tampon[tête] = messageP;
tête = (tête + 1) mod n;
V(plein);
P(plein);
messageC = tampon[queue];
queue = (queue + 1) mod n;
V(vide);
consommer(messageC);

Solution à p producteurs et c consommateurs

Hypothèses : Il faut protéger l'utilisation des indices.

On utilise 2 sémaphores mutexprod et mutexcons d'exclusion mutuelle initialisés à 1.

ProducteurConsommateur
produire(messageP);
P(vide);
P(mutexprod);
tampon[tête] = messageP;
tête = (tête + 1) mod n;
V(mutexprod);
V(plein);
P(plein);
P(mutexcons);
messageC = tampon[queue];
queue = (queue + 1) mod n;
V(mutexcons);
V(vide);
consommer(messageC);


Retour au sommaire.