Académique Documents
Professionnel Documents
Culture Documents
5
Exemples de problèmes de synchronisation : Critique des sémaphores :
- Pour réaliser les sémaphores, on masque les
1- Le diner des philosophes (Voir en TD) interruptions dans un environnement
2- Le problème du coiffeur endormi (Voir en TD) multiprocessus ou on utilise l’instruction TAS :
Void wait (Sempahore S){ Void signal (Sempahore S){
3- Le problème des lecteurs-rédacteurs : Dans un Masquer les Interruptions ; Masquer les Interruptions ;
système de BDD, plusieurs processus veulent lire (1) (2)
ou écrire des informations. Plusieurs processus Démasquer les interruptions ; Démasquer les interruptions ;
peuvent lire en même temps, mais si un } }
processus est en train d’écrire, alors aucun autre
n’est autorisé à écrire ou même lire. Donc, l’attente active n’est pas complètement
éliminée, mais elle est réduite au minimum.
4- Le problème du producteur/consommateur :
un processus produit des informations qu’il - Les opérations wait et signal sont distribués
stocke dans un tampon (buffer) que d’autres dans plusieurs processus ce qui rend difficile la
processus viennent retirer. Le buffer est de taille programmation et la compréhension des
programmes. Il y’a aussi risque d’interblocage,
N.
exemple :
****************************************
semaphore S1=1, S2=1 ;
Exercice d’application 2 : Résoudre le problème P1 : P2 :
du producteur/consommateur : . .
. Wait(S2) ;
Processus consommateur : Wait(S1) ; .
Processus producteur :
. .
While (1){ While (1){ .
.
………………… ………………… . .
………………… ………………… Wait(S2) ; .
Produire_objet() ; Retirer_objet() ; . Wait(S1) ;
. .
………………… …………………
. .
………………… …………………
Déposer_objet() ; Consommer_objet() ;
- Il y’a aussi risque de violer l’accès en EM si on
………………… …………………
oublie un wait et un risque de blocage si on
………………… …………………
oublie un signal dans un programme.
} }
7. Les moniteurs (Hoare 1974, Brinch Hansen
1975)
Exercice d’application 3 : Résoudre le problème Un moniteur est une structure de variables et de
des lecteurs-rédacteurs : procédures pouvant être paramétrée et partagée
Processus lecteur : par plusieurs processus. Le type moniteur existe
Processus rédacteur :
While (1){ dans certains langages de programmation tel
While (1){
………………… ……………… que : Concurrent Pascal, Java et C#.
Ecrire() ; Lire() ; Le corps d’un moniteur est exécuté dès que le
………………… ………………… programme est lancé pour initialiser les variables
} } du moniteur.
6
- La seule manière pour un processus d’accéder à 7.1 Implémentation des moniteurs
une variable moniteur est d’appeler une On va considérer une possible implémentation du
procédure moniteur. moniteur en utilisant les sémaphores :
- Si un processus est actif dans le moniteur et - Un sémaphore mutex est utilisé pour
qu’un autre demande à entrer dans le moniteur, assurer l’accès en EM au moniteur. La file
alors ce dernier est mis en attente. d’attente de mutex sera donc la file
d’attente du moniteur.
- L’EM est assurée par le moniteur, l’utilisateur
- Un sémaphore next est utilisé pour
n’est plus en charge de la programmer. mémoriser tout les processus qui ont
- La synchronisation des processus est réalisée via cédé le moniteur à un autre processus
l’utilisation de variables de condition (Qui sont dans le cas d’un appel à csignal. La file
des variables booléennes) au moyen des d’attente de next sera la file d’attente
opérations : d’urgence. next_count est le compteur
du nombre de processus dans la file
- cwait(c) : Suspend le processus appelant (Le d’attente de next.
mettre en attente de c, et en même temps, - Pour chaque variable de condition x du
autoriser un autre processus en attente du moniteur, on a :
moniteur à y entrer. • Un sémaphore x_sem initialisé à
0.
- csignal(c) : Débloque un processus en
• Une file d’attente de x_sem.
attente de la condition c, Si plusieurs sont en
• Un compteur x_count qui compte
attente de c, alors un seul processus est
le nombre de processus en
débloqué, et si aucun n’est en attente alors ne
attente sur x.
rien faire.
7
Avant compilation Après compilation
monitor mon_moniteur semaphore mutex=1 ; //générés automatiquement
semaphore next=0 ;
int next_count0 ;
condition x; Semaphore x_sem=0;
Int x_count=0;
void F(…){ void F(…){
Corps de la fct; wait(mutex);
} Corps de la fct;
if (next_count >0)
signal(next);
else
signal(mutex);
}
cwait(x) x_count++;
if (next_count >0)
signal(next);
else
signal(mutex)
wait(x_sem);
x_count-- ;
csignal(x) if (x_count >0)
signal(x_sem);
next_count++;
wait(next);
next_count--;
}