Académique Documents
Professionnel Documents
Culture Documents
Conditions de Concurrence
Sections Critiques
Exclusion Mutuelle
Sémaphores
Producteurs et Consommateurs
L'accès simultané aux données partagées peut entraîner des incohérences de données. Le
maintien de la cohérence des données nécessite des mécanismes pour assurer l'exécution
ordonnée des processus coopérants.
Les processus concurrents doivent parfois partager des données (fichiers ou mémoire
commune) et ressources
1
5.2. Sections Critiques
Partie d’un programme dont l’exécution ne doit pas entrelacer avec autres
programmes
Une fois qu’un processus y entre, il faut lui permettre de terminer cette section sans
permettre à autres processus de jouer sur les mêmes données
Lorsqu’un processus manipule une donnée (ou ressource) partagée, nous disons qu’il
se trouve dans une section critique (SC) (associée à cette donnée)
L’exécution des sections critiques doit être mutuellement exclusive : à tout instant, un seul
processus peut exécuter une SC pour une variable donnée (même lorsqu’il y a plusieurs
processeurs).
Ceci peut être obtenu en plaçant des instructions spéciales dans les sections d`entrée et
sortie.
Chaque processus doit donc demander une permission avant d’entrer dans une section
critique (SC)
2
5.4. Sémaphores
Un sémaphore S est un entier qui, sauf pour l'Initialisation, est accessible seulement par ces 2
opérations atomiques et mutuellement exclusives:
– wait(S)
– signal(S)
Il est partagé entre tous les processus qui s`intéressent à la même section critique
On fait distinction aussi entre sémaphores compteurs (toute valeur numérique) et sémaphores
binaires (seulement 0 et 1).
Sémaphores standards :
3
Sémaphores complexes :
4
Implémentation :
L'implémentation d'un tel algorithme pose souvent de problème, surtout si la mémoire
partagée est de taille fixée, puisqu'il faut alors s'assurer que le producteur ne va pas ajouter
des données sur une file pleine et que le consommateur ne va pas essayer de retirer des
données d'une file vide3.
Différentes solutions peuvent être envisagées. Une solution courante est de modifier le
producteur afin qu'il retienne le nombre de places libres dans la file et se mettre en pause au
lieu d'écrire les données si la file est pleine.
Il faut alors que le consommateur réveille le producteur lorsqu'il a consommé des données et
que la file n'est plus pleine. On implémente également un comportement similaire pour le
consommateur, qui suspend son activité si la file est vide et est réveillé par le producteur si
elle ne l'est plus.
Cette solution peut être mise en place à l'aide de sémaphores ou de la communication inter-
processus.
Exemple
Soit un ensemble de producteurs, un consommateur et une file F . Le problème est de
synchroniser l'accès à une imprimante.
Le code exécuté par les producteurs est le suivant :
créer un document D
verrouiller F
ajouter D à la fin de la file F
déverrouiller F
envoyer un signal au consommateur
5
Le code exécuté par le consommateur :
répéter
attendre un signal de F
tant que F n'est pas vide
pour chaque élément E de F
verrouiller F
imprimer E
supprimer E de F
déverrouiller F
fin pour
fin tant que
attendre un signal d'un producteur
fin répéter