Cours Algorithmique répartie Master 2 Université Paris-Diderot Devoir 1 (à rendre avant le 22 février 2010) Détection de la terminaison distribuée Généralités Π = {p0 , . . . , pn−1 } est l’ensemble des processus. Les processus communiquent par envoi-réception de messages. Un message de p à q transite par le canal de p à q. On suppose que les processus exécutent un algorithme tel que chaque processus a une variable locale T erp qui indique s’il a localement terminé, et tel que pour cet algorithme chaque processus p peut: • S’il est dans l’état ¬T erp envoyer un message à un autre processus • S’il est dans l’état ¬T erp finir son travail local et passer dans l’état T erp = T rue • S’il est dans l’état T erp et qu’il reçoit un message passer dans l’état T erp = F alse. On ne connaît pas l’algorithme exécuté (qu’on appellera l’algorithme sous-jacent) on sait seulement qu’il vérifie les règles précédentes. Soit P RED un prédicat (par exemple un prédicat correspondant à la terminaison distribuée). Étant donné une exécution de l’algorithme sous-jacent, on note P REDt la valeur de ce prédicat au temps t dans cette exécution. On dit qu’un prédicat P RED est stable si et seulement si ∀t(P REDt =⇒ ∀t0 > t : 0 P REDt ) 1. On suppose pour cette question que la communication est instantanée: il n’y a jamais de messages en transit dans les canaux de communication. Soit T ER = (∀p ∈ Π : T erp = T rue) montrer que T ER est stable. 2. On suppose maintenant que la communication n’est plus instantanée et que des messages peuvent être en transit dans les canaux. (a) T ER est-il stable? (Prouvez-le ou donnez un contre-exemple) (b) Soit CALV IDE = (∀pq ∈ Π×Π : le canal de p à q est vide). CALV IDE est-il stable? (Prouvezle ou donnez un contre-exemple) Soit T ERG = T ER∧CALV IDE. T ERG est-il stable? (Prouvez le ou donnez un contre-exemple) Un algorithme de détection d’un prédicat P RED doit détecter si le prédicat P RED est vrai; plus précisément, il s’agit d’un algorithme distribué (son code s’exécute sur chaque processus) et on dira qu’il détecte P RED si au cours de l’exécution au moins un des processus exécute l’action DET ECT E. Cet algorithme doit vérifier: • Non-interférence. L’algorithme de détection ne doit pas perturber l’algorithme que les processus exécutent. 1 • Sûreté. Si l’algorithme de détection détecte P RED alors P RED est vraie. • Vivacité. Si dans l’algorithme sous-jacent P RED est vrai alors il existe un instant pour lequel l’algorithme de détection détecte P RED. Un algorithme avec communication instantanée Dans toute cette section, on suppose que la communication est instantanée: les canaux de communications sont toujours vides. On va construire un algorithme de détection de la terminaison: c’est-à-dire un algorithme qui détecte le prédicat T ER précédent. Dans cet algorithme, p0 est l’initiateur de l’algorithme: initialement, uniquement T erp0 est false. Le principe de cet algorithme est de maintenir un arbre de calcul de racine p0 qui essentiellement contient les processus actifs (un processus p est actif si T erp = T rue) Plus précisément, cet arbre T =< ST , AT > a comme racine p0 et vérifie: • T est un arbre de racine p0 (ou T est vide) • A chaque instant ST contient exactement tous les processus actifs Pour assurer ces propriétés, quand p envoie un message m à q, si q n’était pas actif auparavant, p devient le père de q. Quand maintenant, q devient inactif et qu’il n’a pas de descendant dans l’arbre, q est supprimé de l’arbre. Si T a bien les propriétés précédentes, il est clair que si p0 est le seul élément de l’arbre et si T erp0 est vrai, alors T ER est vrai et on a bien détecté la terminaison. Plus précisément l’arbre T est réparti et le processus p correspond au sommet p de T . Chaque processus q maintient une variable pereq qui indique le processus père de q pour T (nil s’il n’a pas de père), chaque processus maintient aussi une variable N f ils qui compte le nombre de fils qu’il a dans T . L’algorithme est décrit Figure 1. Soit T =< ST , AT > l’arbre défini par: ST = {p|perep 6= nil} et AT = {(p, perep )|perep 6= nil} Soient: P1 ≡ ¬T erp =⇒ p ∈ ST P2 ≡ N F ilsp = |{q|(q, p) ∈ AT }| P3 ≡ T est un arbre de racine p0 P4 ≡ (T erp ∧ N f ilsp = 0) =⇒ p ∈ / ST Soit P = P1 ∧ P2 ∧ P3 ∧ P4 . 1. Montrer qu’initialement, P est vraie, et que si P est vraie alors si un processus exécute Envoi, Reception, Inactif et Fini (et possiblement un autre processus exécute les actions qui permettent l’une de ces actions) alors P reste vrai. En déduire que pour toutes les exécutions P est toujours vrai. 2. Montrer que l’algorithme vérifie bien la propriété de sûreté pour la détection de T ER 3. Montrer que l’algorithme vérifie bien la propriété de vivacité pour la détection de T ER 4. Est-ce que si initialement pour d’autres processus p que p0 , T erp est faux, l’algorithme est encore correct? Si non proposez succinctement des idées pour une solution. Un algorithme avec communication asynchrone Dans cette partie on suppose que la communication est asynchrone: des messages peuvent être en transit dans les canaux de communication. On cherche donc à détecter le prédicat T ERG. 2 Initialisations: 1 N f ilsp := 0; 2 if p = p0 then perep0 = p0 else perep = nil 3 if p = p0 then T erp = F alse else T erp = T rue Envoi: 4 {¬T erp } 5 send< m, p > to q 6 recevoir< P ERE, b > 7 if b then N f ils := N f ils + 1 Reception: 8 {message < m, q > présent } 9 recevoir< m, q >; T erp := F alse 10 if perep == nil then 11 perep = q; send < P ERE, true > to q 12 else send< P ERE, f alse > to q Inactif: 13 {¬T erp } 14 T erp := T rue 15 if N f ilsp = 0 then 16 if p = p0 then DET ECT E 17 else send< F IN I > to perep 18 perep = nil Fini: 19 {message < F IN I > présent } 20 recevoir < F IN I >; N f ilsp := N f ilsp − 1 21 if N f ilsp = 0 ∧ T erp then 22 if p = p0 then DET ECT E 23 else send< F IN I > to perep 24 perep = nil Figure 1: Algorithme de détection synchrone. 3 L’arbre T maintenant contient aussi les messages en transit: quand un processus p envoie un message m à q, le message est ajouté à l’arbre T (comme fils de p). Aussi, quand q reçoit m, le message m doit être retiré de T . Et quand un processus p devient inactif et (1) que tous les messages qu’il a émis ont été reçus et (2) qu’il n’est le père d’aucun processus (ce qui signifie que dans T , p est une feuille), il est aussi retiré de T . L’arbre sera donc représenté par la variable perep du processus p qui indique le processus père de p dans T et un compteur cp qui compte le nombre de fils de p. Pour résumé: • Quand un processus p reçoit un message de q, s’il n’a pas encore de père, q devient son père. Sinon il envoie un message SIG à q (pour l’informer que le message reçu n’est plus en transit). • Quand un processus p envoie un message à q, il incrémente cp • Quand p reçoit un SIG il décrémente cp • Quand p devient inactif et cp = 0 il envoie SIG à son père et se retire de T . L’algorithme se trouve Figure 2. Pour prouver l’algorithme on va montrer que l’arbre construit par l’algorithme correspond bien à ce que l’on suppose. Soit une configuration au cours d’une exécution de l’algorithme et T < ST , AT > le graphe défini par: ST = {p|perep 6= nil} ∪ {< m, p > est en transit } ∪ {< SIG, p > est en transit } AT = {(p, perep )|perep 6= nil} ∪ {(< m, p >, p)| < m, p > est en transit} ∪ {(< SIG, p >, p)| < SIG, p > est en transit} Soient: Q1 ≡ ¬T erp =⇒ p ∈ ST Q2 ≡ cp = |{q|(q, p) ∈ AT }| Q3 ≡ T est un arbre de racine p0 Q4 ≡ (T erp ∧ cp = 0) =⇒ p ∈ / ST Q5 ≡ (u, v) ∈ AT =⇒ u ∈ St ∧ v ∈ Π Soit Q = Q1 ∧ Q2 ∧ Q3 ∧ Q4 ∧ Q5 . 1. Prouver que Q est un invariant du programme (Q est vrai initialement et si Q est vrai et un processus exécute une des actions Envoi, Reception, Inactif ou SIG alors Q reste vrai. 2. En déduire que cet algorithme vérifie la propriété de sûreté pour la détection de T ERG . 3. Montrer que cet algorithme vérifie la propriété de vivacité pour la détection de T ERG. 4 Initialisations: 1 cp := 0; 2 if p = p0 then perep0 = p0 else perep = nil 3 if p = p0 then T erp = F alse else T erp = T rue Envoi: 4 {¬T erp } 5 send< m, p > to q 6 cp := cp + 1 Reception: 7 {message < m, q > disponible} 8 recevoir< m, q >; T erp := F alse 9 if perep == nil then perep = q 10 else send< SIG, p > to q Inactif: 11 {¬T erp } 12 T erp := T rue 13 if cp = 0 then 14 if p = p0 then DET ECT E 15 else send< SIG, perep > to perep 16 perep = nil SIG: 17 {message < SIG, q > disponible} 18 recevoir < SIG, q >; cp := cp − 1 19 if cp = 0 then 20 if p = p0 then DET ECT E 21 else send< SIG, perep > to perep 22 perep = nil Figure 2: Algorithm de détection. 5