Problema dels productors i consumidors

De la Viquipèdia, l'enciclopèdia lliure

El problema dels productors i consumidors és un cas concret en informàtica de sincronització de recursos que podem trobar en entorns de programació concurrent. Es tracta de compartir entre dos processos (el productor i el consumidor) una àrea de memòria buffer utilitzada com a cua on el productor genera missatges de dades i el consumidor els rep[1] de forma segura.

Aquest problema es pot generalitzar en diversos productors o consumidors[2] o plataformes comunicades a través de la xarxa. La cua pot estar a memòria o suportada per un sistema d'emmagatzematge persistent.

Implementació[modifica]

La implementació d'aquest algorisme sovint planteja un problema, sobretot si la memòria compartida és de mida fixa, ja que llavors s'ha d'assegurar que el productor no afegirà dades a una cua completa i que el consumidor no intentarà extreure dades d'una cua buida.

Es poden plantejar diferents solucions. Una solució habitual és modificar el productor de manera que conservi el nombre de llocs lliures a la cua i fer que s'aturi en lloc d'escriure les dades si la cua està plena. Aleshores, el consumidor ha d'avisar el productor quan ha consumit dades i la cua ja no està plena. També podríem implementar un comportament invers, on el productor avisa el consumidor quan afegeix elements a la cua. Aquesta solució es pot implementar mitjançant semàfors[3] o comunicació entre processos.

Exemple[modifica]

Considereu un conjunt de productors, un consumidor i una cua. El problema és sincronitzar l'accés a una impressora.

El codi executat pels productors és el següent:

crear un document D
blocar F
afegir D al final de la fila F
desblocar F
enviar un senyal al consumidor

El codi executat pel consumidor:

repetir

 esperar un senyal d'F
 mentre F no és buit
   per cada element E d'F
     blocar F
     imprimir E
     supprimir E d'F
     desblocarr F
   fi per
 fi mentre
 esperar un senyal d'un productor

fi repetir

La implementació està inspirada en fils POSIX (pthreads). Tingueu en compte que l'espera de senyal és una operació que desbloqueja el mutex associat, espera un senyal d'un altre fil i, a continuació, torna a bloquejar el mutex un cop rebut el senyal.

Notes i referències[modifica]

  1. «How to: Implement Various Producer-Consumer Patterns» (en anglès). Microsoft, 08-03-2021. [Consulta: 23 febrer 2023].
  2. «Multiple Consumers and Producers» (en anglès). BlackBerry® QNX®. [Consulta: 12 febrer 2023].
  3. «Exemple : le producteur-consommateur» (en francès). Universitat de Lila. [Consulta: 23 febrer 2023].