ASR2 - L3 Informatique - ENS Lyon Année 2014-2015 TP/TD 5 : Section critique et Interblocage R. Carpa, A. Cavelan et A.Lefray Compare and Swap - Lock-free Soit une implémentation de pile avec une liste chainée définie comme suit : E = {V val, E* next} et un pointeur de tête E* list_head. 1. Proposer une implémentation d une pile avec mutex (opérations lock/unlock). Pour cela, définir les fonctions Push et Pop. 2. Discuter des inconvénients de l utilisation d un mutex Soit le code suivant Push(E* elem) { do { E* old_first = list_head; elem->next = old_first; } } while (!CAS(&list_head, old_first, elem)) E* Pop() { } do { E* old_first = list_head; if(old_first == NULL) return NULL; E* second = old_first->next; } while (!CAS(&list_head, old_first, second)) return old_first; 3. Rappeler ce que fait la fonction CAS (Compare-And-Swap) bool CAS(T* memaddr, T compare, T update) compare la valeur à l adresse memaddr avec compare : si égale la remplace par update et retourne vrai, sinon retourne faux. 4. Que fait ce code? Comment se comporte-t-il en présence de Push/Pop concurrents? Implémentation lockf ree d une pile. Il permet donc des push/pop concurrents, cepant si le thread réalisant un pop/push est préempté par un autre thread réalisant un pop/push, il recommencera sa tentative (le CAS a échoué). Il n y a donc pas d attente bornée. 1
5. Supposons le scénario suivant : État de la pile : top A B C 1- Thread 1 exécute Pop et est préempté avant d exécuter l instruction CAS 2- Thread 2 exécute Pop deux fois et Push(A) 3- Thread 1 repr son exécution et réalise l opération CAS Donner l état de la pile et des threads après chaque étape et commenter le résultat final. Init : top A B C Après 1 : old_first = A, second = B, même pile Après 2 : Pop() = A : top B C, Pop() = B : top C, Push(A) : top A C Après 3 : L opération CAS(&A, A, B) réussi car l ancien A est bien égal au nouveau A inséré par le thread 2. On obtient donc top A B avec aucune garantie que B existe encore ou soit un emplacement mémoire valide. Ce problème s appelle ABA. Un solution classique pour éviter ce problème est de tagger les adresses (modifier les bits de points faibles non utilisés) lors d une suppression pour faire échouer la comparaison des adresses lors du CAS. 6. Conclure sur l intérêt de l opération CAS et ses dangers. CAS et assimilés sont très utiles pour implémenter des structures lockfree voir waitfree (avec un Double CAS par exemple) mais elles sont très difficiles à implémenter. Cours 1. Rappeler les 3 propriétés souhaitables pour la gestion des sections critiques. Exclusion mutuelle : 1 seul processus à la fois en section critique ; Attente bornée d un processus avant d entrer en section critique (conséquence : Absence de famine) ; Progression (conséquence : Absence d interblocage). 2. Rappeler les 4 conditions pour avoir un interblocage. Exclusion mutuelle : seulement un processus à la fois peut utiliser une ressource ; Tient-et-att : un processus qui tient au moins une ressource est en attente d autres ressources ; Pas de préemption : une ressource ne peut être relâchee qu intentionnellement par le processus qui la tient, une fois qu il a terminé ; Attente circulaire : il y a un ensemble P 1,..., P k de processus en attente, tels que P 1 att une ressource tenue par P 2,..., P i att une ressource tenue par P i+1,... et P k att une ressource tenue par P 1. 2
Interblocage - Prévention et Évitement Pour s assurer qu un interblocage ne peut se produire, le système peut soit prévenir (prévention de l interblocage) en s assurant qu au moins une des quatre conditions nécessaires ne peut se produire soit éviter (évitement de l interblocage) en gérant en avance les ressources qu une tâche doit utiliser pant son exécution. La stratégie d évitement consiste à autoriser l allocation d une ressource seulement lorsque cette allocation mène à un état "sûr", où l interblocage est impossible. 1. Un état est sûr si le système peut allouer les ressources à chaque processus (jusqu à son maximum) dans un certain ordre et finalement éviter un interblocage. Un état qui n est pas sûr sera qualifié d état aventureux. Quelles sont les relations entre états sûrs, aventureux et les interblocages? Interblocage Aventureux, ce qui implique : Sûr = Interblocage Aventureux = Interblocage Interblocage = Aventureux 2. Dans les algorithmes suivants, 3 processus utilisent de manière concurrente des ressources notées A...F : get(a); get(b); get(c); release(a); release(b); release(c); Algorithm 1: Processus 1 get(d); get(e); get(b); release(d); release(e); release(b); Algorithm 2: Processus 2 get(c); get(f); get(d); release(c); release(f); release(d); Algorithm 3: Processus 3 En utilisant un graphe d allocation de ressources, prouvez la possibilité d un interblocage. Prévention : Modifiez l ordre de demande des ressources pour éviter l interblocage. Justifier votre réponse. Évitement : Soit l état ci-dessous des 3 algorithmes. Utiliser le graphe d allocation de ressources pour trouver un état suivant qui est sûr. Quelles sont les demandes qui ne peuvent pas être satisfaites dans l état courent? Pourquoi? Processus Déjà allouées En cours de demande P 1 A,B C P 2 D,E B P 3 C 1) Si chaque processus prs les 2 premières ressources voulues, on se retrouve dans le cas suivant : A B C D E F P1 P2 P3 Cycle : P1->C->P3->D->P2->B(->P1) 3
2) Attente circulaire, ordre : A B C D E F Ordre P1 : A, B, C Ordre P2 : B, D, E Ordre P3 : C, D, F 3) État initial : A B C D E F P1 P2 P3 Le seul état sur est de donner C à P1. Si on donne C à P3, on engre un cycle : (C->P3->D->P2->B->P1->C) On ne peut pas donner B à P2, car B est détenu par P1. 3. Soit un système disposant de 9, 3 et 6 ressources de types respectivement R1, R2 et R3. La quantité de ressources demandées par chacun des 4 processus et l allocation actuelle est donnée dans le tableau suivant : Processus Demande max. Allouées R1 R2 R3 R1 R2 R3 P 1 3 2 2 1 0 0 P 2 6 1 3 5 1 1 l état, est-il sur? P2 demande une ressource de type R1 et une de type R3. La demande, peut-elle être satisfaite immédiatement? P1 demande une ressource de type R1 et une de type R3. La demande, peut-elle être satisfaite immédiatement? P1 2 2 2 P2 1 0 2 Dans l état initial la matrice Need est : P2 peut finir en utilisant (1 0 2) ressources. Étape 2 : Étape 3 : Étape 4 : P 1 3 2 2 1 0 0 P 1 0 0 0 0 0 0 P 1 0 0 0 0 0 0 P 3 0 0 0 0 0 0 P1 2 2 2 P1 0 0 0 P1 0 0 0 P3 0 0 0 et on a (1 1 2) ressources disponibles, (6 2 3) ressources disponibles finir P1, (7 2 3) ressources disponibles finir P3, (9 3 4) ressources disponibles finir P4 2) Oui. On attribue d abord les (1 0 1) ressources demandées à P2. Puis on teste qu on est dans un état sur. Le test est le même que dans la première partie (sauf la première étape) 4
3) Non, on se retrouve avec la matrice Need : P1 1 2 1 P2 1 0 2 et (0 1 1) ressources disponibles Interblocage - Détection et Récupération Soit n = 5 processus, m = 3 types de ressources, A, B et C avec une seule instance de chaque. On a l état suivant : Allocation Request P1 0 0 0 1 0 0 P2 0 1 0 1 0 0 P3 0 0 0 0 1 1 P4 1 0 0 0 0 1 P5 0 0 1 0 0 0 1. Y a-t-il interblocage? 1 seule instance de chaque ressource donc on va préférer le graphe d attente. soit P1 -> P4 -> P5, P3 -> P2 -> P4, P3 -> P5 Pas de cycle donc pas d interblocage 2. Et si P5 demande la ressource B? On a le cycle P2 -> P4 -> P5 (-> P2) donc interblocage! Soit n = 4 processus, m = 3 types de ressources, A (4 instances), B (4 instances), et C (7 instances). On a l état suivant : Allocation Request P1 1 1 1 1 1 1 P2 2 0 1 0 1 0 P3 1 2 2 2 0 1 P4 0 0 3 4 0 0 1. Y a-t-il interblocage? Utiliser la variante de l algo du banquier (avec REQUEST), réponse Non. Initialement Work = Available = (0 1 0). P2 : Work = (2 1 1) P1 + P3 : Work = (4 4 4) P4 ok donc pas d interblocage. 2. Et si P1 demande deux ressources de plus de C? Piège! Toujours bon :) L ordre devient P2, P3, P1, P4. 5