LP RGI Prog. système TD3 Le problème de l'exclusion mutuelle et les mutexes I U T d ' A m i e n s, d é p a r t e m e n t I n f o r m a t i q u e a n n é e u n i v e r s i t a i r e 2 0 1 4 / 2 0 1 5 L P R G I
Plan A. L'exclusion mutuelle B. Une solution (trop) simple... C. Une solution logicielle : l'algo de Dekker D. Les sémaphores 05/10/14 LP RGI : TD2 T2
A. L'exclusion mutuelle Unix est multi-taches et multi-utilisateurs : Donc plusieurs processus en compétition peuvent accéder en même temps à une même ressource Ceci peut impliquer des problèmes de cohérence! P. ex. si un processus lit dans un fichier pendant qu un autre écrit 05/10/14 LP RGI : TD2 T3
Exemple Un compte en banque doit être crédité de 10 000 euros et débité de 30 euros Un processus est chargé d'ajouter 10 000 euros solde=lire(compte) solde = solde + 10000 Ecrire(solde,compte) Un autre est chargé de soustraire 30 euros solde=lire(compte) solde = solde - 30 Ecrire(solde,compte) 05/10/14 LP RGI : TD2 T4
Exemple scénario 1 Le processus créditeur s exécute avant le processus débiteur solde=lire(compte) solde=250 solde=solde+10000 solde=250+10000=10250 Écrire(solde,compte) compte=10250 solde=lire(compte) solde=10250 solde=solde 30 solde=10250 30=10220 Écrire(solde,compte) compte=10220 250 10250 10220 compte 05/10/14 LP RGI : TD2 T5
Exemple scénario 2 Les processus créditeur et débiteur s exécutent «en même temps» solde=lire(compte) solde=250 solde=solde 30 solde=250 30=220 i=lire(compte) i=250 i=i+10000 i=250+10000=10250 Écrire(i,compte) compte=10250 250 10250 220 compte A l'issue du premier scénario, le compte valait 10220 euros!!! Écrire(solde,compte) compte=220 05/10/14 LP RGI : TD2 T6
Conclusion Il aurait fallu que le premier processus interdise au second d accéder au fichier pendant qu il calculait le nouveau solde C'est un problème d'exclusion mutuelle Usage exclusif... au maximum un processus à un instant donné... d'une ressource critique ici, le fichier contenant le compte en banque 05/10/14 LP RGI : TD2 T7
Les propriétés de l'em (Dijkstra) P1 : exclusion mutuelle. A tout instant, un seul processus peut avoir accès à la section critique. P2 : progression. Si aucun processus n'est en section critique, un processus en attente entre en section critique au bout d'un temps fini. 05/10/14 LP RGI : TD2 T8
Les propriétés de l'em P3. Si un processus est bloqué en dehors d'une section critique, ce blocage ne doit pas empêcher l'entrée d'un autre processus en section critique. P4. Aucun processus ne doit être privilégié pas d'hypothèse de priorité ou de vitesse 05/10/14 LP RGI : TD2 T9
Les propriétés de l'em P5. Equité : un processus en attente d'entrer en SC y accédera en un temps fini P6. Tolérance aux défaillances. Si un processus en SC se termine brutalement, le système ne doit pas devenir instable 05/10/14 LP RGI : TD2 T10
Les propriétés de l'em Symétrie : l'algorithme d'em doit être le même pour tous les processus 05/10/14 LP RGI : TD2 T11
Les problèmes liés à l'exclusion mutuelle Interblocage : deux processus concurrents s'attendent mutuellement. Famine. Un processus peut ne jamais accéder à la ressource critique 05/10/14 LP RGI : TD2 T12
Plan A. L'exclusion mutuelle B. Une solution (trop) simple... C. Une solution logicielle : l'algo de Dekker D. Les sémaphores 05/10/14 LP RGI : TD2 T13
B. Une solution (trop) simple... Libre : variable partagée booléenne associée à la ressource critique et initialisée à vrai Cas de deux processus P0 et P1 P0 TantQue Libre = faux faire attendre FinTantQue Libre faux Libre vrai P1 TantQue Libre = faux faire attendre FinTantQue Libre faux Libre vrai 05/10/14 LP RGI : TD2 T14
Un scénario d'exécution TantQue Libre = faux faire attendre FinTantQue TantQue Libre = faux faire attendre FinTantQue Libre faux... Libre faux Libre vaut vrai Libre vaut faux Libre vaut faux Pas d'exclusion mutuelle!!! 05/10/14 LP RGI : TD2 T15
Plan A. L'exclusion mutuelle B. Une solution (trop) simple... C. Une solution logicielle : l'algo de Dekker D. Les sémaphores 05/10/14 LP RGI : TD2 T16
C. Les solutions logicielles : algo de Dekker Hypothèse : l'accès aux variables est atomique... C'est à dire non interruptible, indivisible 05/10/14 LP RGI : TD2 T17
Première version Tour : désigne le processus autorisé à accéder en ressource critique P0 TantQue Tour = 1 faire attendre FinTantQue Tour 1 P1 TantQue Tour = 0 faire attendre FinTantQue Tour 0 P3 non vérifiée : comme l'accès à la RC a lieu en alternance, si PO est bloqué hors de la SC alors que c'est à son tour d'accéder à la RC, P1 est bloqué en attente d'accéder à la RC 05/10/14 LP RGI : TD2 T18
Deuxième version Deux variables booléennes C0 et C1 : Ci est vrai si Pi est en SC Ci est faux si Pi est hors de sa SC P0 TantQue C1 = vrai faire attendre FinTantQue C0 vrai C0 faux P1 TantQue C0 = vrai faire attendre FinTantQue C1 vrai C1 faux 05/10/14 LP RGI : TD2 T19
Deuxième version TantQue C1 = vrai faire attendre FinTantQue C0 vrai TantQue C0 = vrai faire attendre FinTantQue C1 vrai... C0 faux faux faux vrai vrai vrai vrai C1 faux faux faux faux vrai vrai vrai Pas d'exclusion mutuelle!!! 05/10/14 LP RGI : TD2 T20
Troisième version Deux variables booléennes C0 et C1 : Ci est vrai si Pi est en SC ou demande à y entrer Ci est faux si Pi est hors de sa SC P0 C0 vrai TantQue C1 = vrai faire attendre FinTantQue C0 faux P1 C1 vrai TantQue C0 = vrai faire attendre FinTantQue C1 faux 05/10/14 LP RGI : TD2 T21
Troisième version C0 vrai C1 vrai TantQue C1 = vrai faire attendre FinTantQue TantQue C0 = vrai faire attendre FinTantQue C0 faux vrai vrai C1 faux faux vrai interblocage!!! 05/10/14 LP RGI : TD2 T22
Quatrième version : algo de Dekker (1965) Deux variables booléennes C0 et C1 Tour valant 0 ou 1 P0 C0 vrai TantQue C1 = vrai faire Si Tour = 1 alors C0 faux FinSi TantQue Tour = 1 faire attendre FinTantQue C0 vrai FinTantQue Tour 1 C0 faux P0 veut rentrer en SC P1 veut aussi rentrer en SC Si c est le tour de P1 Alors P0 laisse la place P0 attend P0 redemande à rentrer en SC P0 passe le tour à P1 05/10/14 LP RGI : TD2 T23
Quatrième version : algo de Dekker (1965) Théorème : L algo. de Dekker résout le problème de l exclusion mutuelle, sans interblocage, sans famine et de manière équitable. Cet algo a été amélioré en 1981 par Peterson 05/10/14 LP RGI : TD2 T24
5. Les problèmes des algo de Dekker et Peterson Problème 1 : attente active coûteuse en ressource machine C0 vrai TantQue C1 = vrai faire Si Tour = 1 alors C0 faux FinSi TantQue Tour = 1 faire attendre FinTantQue C0 vrai FinTantQue Tour 1 C0 faux Généralement : sleep(1)... Artisanal et coûteux!!! 05/10/14 LP RGI : TD2 T25
Les problèmes des algo de Dekker et Peterson Problème 2 : contrairement à l'hypothèse de départ, les opérations de manipulation de variables ne sont pas atomiques Exemple 1 : N N+1 LDA N ADA #1 STA N Exemple 2 : N=M LDA N LDB M EQ A B Conclusion : Les algorithmes basés sur des solutions logicielles sont rarement utilisés. On se tourne vers des solutions avec blocage passif. 05/10/14 LP RGI : TD2 T26
Plan A. L'exclusion mutuelle B. Une solution (trop) simple... C. Une solution logicielle : l'algo de Dekker D. Les sémaphores 05/10/14 LP RGI : TD2 T27
C. Les sémaphores de Dijkstra Une solution pour résoudre les problèmes d'exclusion mutuelle A une ressource critique est associé un sémaphore Dr. Edsger Wybe Dijkstra (1930 2002) 05/10/14 LP RGI : TD2 T28
2. Le principe Sémaphore : entier valant 0 ou 1et muni de deux opérations atomiques Opération P : abaisser le sémaphore Si le sémaphore vaut 1, il est décrémenté. S il vaut 0, le processus est mis en sommeil. Opération V : lever le sémaphore Le sémaphore est mis à 1. S il valait 0, les processus endormis en attente de son incrémentation sont réveillés. 05/10/14 LP RGI : TD2 T29
3. L'algorithme Algorithme d accès exclusif à une ressource critique On associe un sémaphore à la ressource critique Initialisé à 1 Puis chaque processus adopte l'algorithme suivant : Opération P Accès exclusif Opération V Démonstration : les deux bricoleurs et le marteau 05/10/14 LP RGI : TD2 T30
Exemple S : 1 P(S) V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T31
Exemple S : 0 P(S) V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T32
Exemple S : 0 P(S) SOMMEIL V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T33
Exemple S : 0 P(S) SOMMEIL V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T34
Exemple S : 1 P(S) SOMMEIL V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T35
Exemple S : 0 P(S) V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T36
Exemple S : 0 P(S) V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T37
Exemple S : 1 P(S) V(S) P(S) V(S) 05/10/14 LP RGI : TD2 T38
4. Exercices Exercice 1. Soient deux RC R1 et R2 protégées par S1 et S2 Processus P1 P(S1) /* Action sur la ressource R1 */ P(S2) V(S1) /* Action sur la ressource R2 */ V(S2) Processus P2 P(S2) /* Action sur la ressource R2 */ P(S1) V(S2) /* Action sur la ressource R1 */ V(S1) Ceci conduit à un interblocage!!! Pour éviter cela, ne pas imbriquer les opérations P et V 05/10/14 LP RGI : TD2 T39
4. Exercices Exercice 2. Soient trois processus parallèles P1, P2 et P3. Compléter pour que la séquence d exécution soit toujours : A1-A2-A3-A1-A2-A3-A1 05/10/14 LP RGI : TD2 T40
5. L'implémentation thread : les mutexes Sous Unix. Création d'un mutex Adresse où récupérer l identifiant du mutex #include <pthread.h> int pthread_mutex_init (pthread_mutex_t *mutex_pt, pthread_mutexattr_t *attr) ; NULL 05/10/14 LP RGI : TD2 T41
5. L'implémentation Pthread : les mutexes Opération P sur un mutex Identifiant du mutex renvoyé par pthread_mutex_init #include <pthread.h> int pthread_mutex_lock(pthread_mutex_t *mutex_pt); Baisser le mutex S il est déjà baissé : mise en sommeil de l'activité appelante 05/10/14 LP RGI : TD2 T42
5. L'implémentation Pthread : les mutexes Création d un mutex Opération V pour un mutex Identifiant du mutex renvoyé par pthread_mutex_init #include <pthread.h> int pthread_mutex_unlock(pthread_mutex_t *mutex_pt); Lever le mutex S il était baissé : réveil des activités endormies 05/10/14 LP RGI : TD2 T43
5. L'implémentation Pthread : les mutexes Destruction d'un mutex Identifiant du mutex renvoyé par pthread_mutex_init #include <pthread.h> int pthread_mutex_destroy(pthread_mutex_t *mutex_pt) ; 05/10/14 LP RGI : TD2 T44
5. L'implémentation Pthread : les mutexes Sous Microsoft Windows Les mutexes sont des objets de la classe mutex Voir TP3! 05/10/14 LP RGI : TD2 T45