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 Π = {p 0,..., p n 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 er p qui indique s il a localement terminé, et tel que pour cet algorithme chaque processus p peut: S il est dans l état T er p envoyer un message à un autre processus S il est dans l état T er p finir son travail local et passer dans l état T er p = T rue S il est dans l état T er p et qu il reçoit un message passer dans l état T er p = 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 RED t 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 RED t = t > t : P RED t ) 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 er p = 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, p 0 est l initiateur de l algorithme: initialement, uniquement T er p0 est false. Le principe de cet algorithme est de maintenir un arbre de calcul de racine p 0 qui essentiellement contient les processus actifs (un processus p est actif si T er p = T rue) Plus précisément, cet arbre T =< S T, A T > a comme racine p 0 et vérifie: T est un arbre de racine p 0 (ou T est vide) A chaque instant S T 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 p 0 est le seul élément de l arbre et si T er p0 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 pere q 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 Nfils qui compte le nombre de fils qu il a dans T. L algorithme est décrit Figure 1. Soit T =< S T, A T > l arbre défini par: S T = {p pere p nil} et A T = {(p, pere p ) pere p nil} Soient: P 1 T er p = p S T P 2 NF ils p = {q (q, p) A T } P 3 T est un arbre de racine p 0 P 4 (T er p Nfils p = 0) = p / S T Soit P = P 1 P 2 P 3 P 4. 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 p 0, T er p 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 Nfils p := 0; 2 if p = p 0 then pere p0 = p 0 else pere p = nil 3 if p = p 0 then T er p = F alse else T er p = T rue Envoi: 4 { T er p } 5 send< m, p > to q 6 recevoir< P ERE, b > 7 if b then Nfils := Nfils + 1 Reception: 8 {message < m, q > présent } 9 recevoir< m, q >; T er p := F alse 10 if pere p == nil then 11 pere p = q; send < P ERE, true > to q 12 else send< P ERE, false > to q Inactif: 13 { T er p } 14 T er p := T rue 15 if Nfils p = 0 then 16 if p = p 0 then DET ECT E 17 else send< F INI > to pere p 18 pere p = nil Fini: 19 {message < F INI > présent } 20 recevoir < F INI >; Nfils p := Nfils p 1 21 if Nfils p = 0 T er p then 22 if p = p 0 then DET ECT E 23 else send< F INI > to pere p 24 pere p = 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 pere p du processus p qui indique le processus père de p dans T et un compteur c p 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 c p Quand p reçoit un SIG il décrémente c p Quand p devient inactif et c p = 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 < S T, A T > le graphe défini par: S T = {p pere p nil} {< m, p > est en transit } {< SIG, p > est en transit } A T = {(p, pere p ) pere p nil} {(< m, p >, p) < m, p > est en transit} {(< SIG, p >, p) < SIG, p > est en transit} Soient: Soit Q = Q 1 Q 2 Q 3 Q 4 Q 5. Q 1 T er p = p S T Q 2 c p = {q (q, p) A T } Q 3 T est un arbre de racine p 0 Q 4 (T er p c p = 0) = p / S T Q 5 (u, v) A T = u S t v Π 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 c p := 0; 2 if p = p 0 then pere p0 = p 0 else pere p = nil 3 if p = p 0 then T er p = F alse else T er p = T rue Envoi: 4 { T er p } 5 send< m, p > to q 6 c p := c p + 1 Reception: 7 {message < m, q > disponible} 8 recevoir< m, q >; T er p := F alse 9 if pere p == nil then pere p = q 10 else send< SIG, p > to q Inactif: 11 { T er p } 12 T er p := T rue 13 if c p = 0 then 14 if p = p 0 then DET ECT E 15 else send< SIG, pere p > to pere p 16 pere p = nil SIG: 17 {message < SIG, q > disponible} 18 recevoir < SIG, q >; c p := c p 1 19 if c p = 0 then 20 if p = p 0 then DET ECT E 21 else send< SIG, pere p > to pere p 22 pere p = nil Figure 2: Algorithm de détection. 5