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