Cours 4 : Le schéma producteur/consommateur.
1 Le schéma producteur/consommateur
Le dernier problème de communication / synchronisation que nous aborderons est celui du producteur / consommateur. On considère
ici deux
processus
communiquant par un tampon de N cases. Le producteur dépose des messages dans le tampon dans la case pointée par l'index i.
Le consommateur prélève les messages dans la case pointée par l'index j. Le tampon est géré selon un mode FIFO circulaire
en consommation et en dépôt, c'est-à-dire :
- le producteur dépose les messages depuis la case 0 jusqu'à la case N-1, puis revient à la case 0
- le consommateur prélève les messages depuis la case 0 jusqu'à la case N-1, puis revient à la case 0.
Pour qu'aucun message ne soit perdu, les trois règles suivantes doivent être respectées :
- Un producteur ne doit pas produire si le tampon est plein
- Un consommateur ne doit pas faire de retrait si le tampon est vide
- Producteur et consommateur ne doivent jamais travailler dans une même case
2 Programmation du schéma producteur/consommateur
Dans ce problème deux types de
ressource
s distinctes peuvent être mises en avant :
- le producteur consomme des cases vides et fournit des cases pleines
- le consommateur consomme des cases pleines et fournit des cases vides
On a donc des ressources cases vides et des ressources cases pleines. Le problème peut maintenant se rapprocher d'un problème
d'allocation de ressources critiques tel que nous l'avons vu précédemment. On associe donc un sémaphore à chacune des ressources
identifiées et on initialise ce sémaphore au nombre de cases respectivement vides ou pleines initialement disponibles (N et
0). On a donc deux sémaphores VIDE initialisé à N et PLEIN initialisé à 0.
Un producteur va s'allouer une case vide par une opération P(VIDE), remplir cette case vide et de ce fait générer une case
pleine. Le producteur va signaler cette nouvelle case pleine par une opération V(PLEIN), cette opération réveillera éventuellement
le consommateur en attente d'une case pleine. Un consommateur va s'allouer une case pleine par une opération P(PLEIN), vider
cette case pleine et de ce fait générer une case vide. Le consommateur va signaler cette nouvelle case vide par une opération
V(VIDE), cette opération réveillera éventuellement le producteur en attente d'une case vide.
 |
Fig 7 : Schéma producteur / consommateur
|
|
3 Fonctionnement du schéma producteur/consommateur
Les deux figures ci-dessous illustrent le fonctionnement du schéma sur un tampon de deux cases.
 |
Fig 8 : Fonctionnement du schéma producteur / consommateur
|
|
 |
Fig 9 : Fonctionnement du schéma producteur / consommateur
|
|
Synchronisation entre processus
Le schéma producteur/consommateur
|