AlgoDist
Master 2 · Polytech UCAChapitre 1F. Baude

Algorithmique
distribuée :
élire un chef.

Plusieurs machines, aucune mémoire commune, aucune horloge commune, juste des messages. Comment se mettre d'accord sur qui commande ? On reprend tout, calmement, avec des animations.

Tu n'as rien compris en cours ? Normal, ça va vite et c'est abstrait. Ici chaque idée est illustrée par une animation que tu peux mettre en pause et faire tourner pas à pas. Objectif : réussir le QCM.
candidat message qui circule leader élu
En 30 secondes

Des processus sans mémoire ni horloge communes s'échangent des messages. Élire un leader, c'est casser la symétrie pour désigner un unique chef, et c'est un calcul par approximation : chacun propose sa valeur et l'affine. Quatre algos selon la topologie : Chang & Roberts (anneau, O(n²) au pire), Franklin (anneau bi-directionnel, O(log n) rounds), Probe-Echo (graphe quelconque), Bully (avec pannes). Ce qui coûte, ce sont les messages ; ce qui compte, c'est l'ordre de réception, pas l'heure.

01 — Le décor

C'est quoi un système distribué ?

Imagine plusieurs ordinateurs (on les appelle des processus, notés P0, P1, … Pn). Chacun est dans son coin avec sa propre mémoire. Ils ne peuvent faire qu'une chose pour coopérer : s'envoyer des messages.

L'exemple du cours

Le prof commence par un puzzle : LONGER + LARGER = MIDDLE où chaque lettre = un chiffre. Chaque processus gère quelques lettres et propose une valeur. Il ne voit pas le tableau entier : il devine une valeur, l'envoie aux autres, reçoit leurs contraintes, et affine peu à peu. Personne n'a la solution complète, elle émerge des échanges. C'est ça, un calcul distribué par approximation. Garde cette image : élire un leader, ce sera pareil.

Les 6 règles du jeu hypothèses

Tout le cours repose sur ces suppositions. Si tu les connais, la moitié du travail est faite.

Processus autonomes

P0…Pn, chacun avec sa mémoire locale et son propre programme. Principe MIMD : chacun exécute son code sur ses données.

Pas de mémoire partagée

Aucune variable globale, aucun tableau commun. La seule façon de partager une info, c'est de l'envoyer par message.

Pas d'horloge commune

Impossible de dire « il est 14h32 partout ». Chaque processus a son temps à lui. On ne peut donc pas ordonner les événements par l'heure.

Messages = canaux

Un processus parle à ses voisins (ceux dont il a la référence). Envoi le plus souvent asynchrone : on envoie et on continue, la réception arrive « plus tard ».

Canaux FIFO

First In First Out : sur un même canal, les messages arrivent dans l'ordre où ils ont été envoyés. On ne les double pas.

Processus fiables

Par défaut personne ne tombe en panne. On lèvera cette hypothèse à la fin (algo Bully), où le leader peut mourir.

02 — La langue du cours

Lire une « action gardée »

Tous les algorithmes du cours sont écrits pareil. Si tu sais lire cette notation, tu peux lire n'importe quel algo. C'est une liste de règles de la forme : { si cette condition }alors fais ça.

Deux types d'actions

Action interne Iₚ : déclenchée par une condition sur les variables locales seulement. Elle peut envoyer des messages.

Action de réception Mₚ : déclenchée par l'arrivée d'un message. La garde peut tester le contenu / le type du message.

Le mot-clé : non-déterminisme

Si plusieurs gardes sont vraies en même temps, l'algo en choisit une au hasard. On ne contrôle pas l'ordre. Un algo correct doit marcher quel que soit cet ordre.

// Action INTERNE sur le processus p
Iₚ : { garde : condition sur variables locales }
     x := ... ;              // calcul local
     envoie ⟨M⟩ à voisin ;
     ...

// Action de RÉCEPTION d'un message
Mₚ : { un message ⟨j⟩ est arrivé }
     reçois le message ;
     si M < j alors ...
Idée
Une action = une garde (le gardien vérifie la condition) → si vraie, on exécute le corps (calcul + envois). Le message ⟨j⟩ arrive, débloque la garde M<j, et le corps envoie ⟨M⟩ au voisin.
À retenir pour le QCM

Une action est atomique : une fois la garde vraie, tout le corps s'exécute d'un coup, sans être coupé. Et on ne reçoit un message que dans une action de type M, jamais au milieu d'un calcul interne.

03 — Temps & complexité

Ce qui compte vraiment : l'ordre, pas l'heure

Comme il n'y a pas d'horloge, deux exécutions qui reçoivent les messages dans le même ordre sont considérées identiques, même si les durées réelles diffèrent. Seul l'ordre de réception compte.

Comment on mesure le coût

  • Nombre de messages échangés, le critère principal, car un message coûte cher (bien plus qu'un calcul local).
  • Temps = profondeur du graphe des dépendances = plus longue chaîne de messages « l'un déclenche l'autre ». Unité : le délai d'un message.
  • Largeur = degré de parallélisme (combien de choses se passent en même temps).

On raisonne en meilleur cas, pire cas, ou cas moyen selon l'algo.

DIAGRAMME DE TEMPS
P2P1P0

Chaque flèche = un message. Ce qui définit l'exécution, c'est le graphe de ces flèches, pas leur durée.

04 — Le problème central

Élire un leader = casser la symétrie

Au départ tous les processus sont identiques et jouent le même rôle (« démocratie » pair-à-pair). Problème : parfois il faut qu'un seul prenne une décision (le coordinateur, le serveur). Il faut donc désigner un unique chef. C'est casser la symétrie.

POURQUOI UN LEADER

Coordonner

Certaines actions ne doivent être faites que par un seul processus : choisir la valeur finale d'une lettre dans le puzzle, jouer le rôle du serveur unique, orchestrer l'application.

LES PROPRIÉTÉS EXIGÉES

Un seul, et tout le monde d'accord

À la fin : un et un seul leader, et tous les processus non en panne connaissent son identité. Pas besoin que tous soient candidats, mais tous doivent participer et finir par savoir.

L'intuition clé de tout le chapitre

Une élection est un calcul par approximation. Chaque candidat propose sa valeur (son identité) comme approximation du résultat final. À tout instant, un processus ne connaît qu'approximativement qui gagne. Le cœur de chaque algorithme, c'est affiner cette approximation : (0) je propose ma valeur, (1) j'attends une valeur d'un autre, (2) je la combine avec la mienne pour trouver une meilleure approximation et si elle est meilleure je la diffuse, (3) je recommence. La topologie change juste la vitesse de convergence.

Les valeurs candidates

Ce sont des identifiants uniques et totalement ordonnés (souvent : l'id du processus, ex. son IP). Convention habituelle : le leader = la plus grande valeur. Mais attention…

Piège fréquent

On se fiche de qui est élu ! La seule chose qui compte : qu'il y en ait exactement un et que tous soient d'accord. On peut donc élire le plus petit, le premier arrivé, n'importe qui, c'est exactement ce que demande l'exo du serveur.

Quatre algorithmes (le plan du chapitre)

Sur un anneau unidirectionnel — Chang & Roberts

Les messages tournent dans un seul sens. Le plus grand id fait le tour complet et revient chez lui → il est leader. Exercice 1

Sur un anneau bidirectionnel, par rounds — Franklin

À chaque tour on élimine au moins la moitié des candidats. Beaucoup plus rapide : O(log n) tours.

Sur une topologie quelconque — Probe-Echo (généralisation de Tel)

On inonde le graphe puis on renvoie des accusés (echos). Sert aussi à collecter la topologie. Self-training

Avec pannes — Bully (Garcia-Molina)

Le leader peut mourir. Les processus détectent la panne par timeout et se « bagarrent » pour le remplacer.

05 — Algorithme 1 · Exercice 1

Chang & Roberts / anneau unidirectionnel

Les processus forment un anneau : chacun ne peut envoyer qu'à un seul voisin (le suivant, dans un seul sens). Idée : chaque candidat lance son identité ; une identité n'avance que si elle est plus grande que le processus qu'elle rencontre. Le maximum est le seul à faire le tour complet et à se revoir → il se déclare leader.

0 / 0
Prêt
Anneau de 6 processus, sens horaire. Un message ne circule que vers un plus grand. Lance la lecture.
candidat actif message ⟨id⟩ message absorbé leader

Version 1 (celle du cours)

// M = max vu jusqu'ici ; mon_numero = mon id
Iᵢ : { M = 0 }
     M := mon_numero ;
     envoie ⟨M⟩ au suivant

Mᵢ : { message ⟨j⟩ arrivé }
     si M < j alors
        M := j ;
        envoie ⟨M⟩ au suivant
     si j = i alors « je suis le leader »

Complexité (à connaître)

  • Pire cas : ids dans le mauvais ordre → le message de chaque Pᵢ voyage i fois avant de mourir. Total ≈ n(n+1)/2 = O(n²) messages.
  • Meilleur cas : ≈ 2n messages.
  • Cas moyen : O(n·log n) messages.
  • Temps : O(n), un tour d'anneau = le diamètre.
Détection de terminaison offerte

Quand le leader revoit sa propre valeur (echo), il est sûr que tous l'ont vue. Il envoie un message ⟨End⟩ qui fait le tour : la proclamation est gratuite.

06 — Algorithme 2

Franklin / anneau bidirectionnel, par rounds

Ici chaque processus voit ses deux voisins. À chaque round, un processus encore candidat (« blanc ») compare sa valeur à celle de ses deux voisins. S'il n'est pas le plus grand des trois, il abandonne (« noir »). Au moins la moitié des candidats disparaît à chaque tour → O(log n) rounds.

0 / 0
Prêt
8 processus, anneau bidirectionnel. À chaque round les candidats blancs s'éliminent. Lance la lecture.
blanc = encore candidat noir = éliminé (relais) leader

Le comportement d'un Pᵢ

si blanc :
   envoie ma valeur à mes 2 voisins ;
   compare avec les 2 valeurs reçues :
     si ma valeur < une des deux → noir
     si ma valeur > les deux → « leader »
   sinon → round suivant
si noir :
   je relaie seulement les messages
   (je transmets aux autres voisins)

Coût

  • Rounds : au plus O(log n) (au moins la moitié des blancs deviennent noirs à chaque round).
  • Messages/round : chaque processus reçoit 2 messages et les relaie → 2N par round.
  • Total : O(N·log N) messages au pire.
Exo du cours

« Sur un anneau unidirectionnel, quels sont les meilleur et pire cas ? » et « sur un graphe complet, spécialise l'algo (D=1) » → chaque processus attend un message de chacun, calcule le max localement : N·(N-1) messages.

07 — Algorithme 3 · Self-training Exo 1

Probe-Echo / topologie quelconque

Sur un graphe quelconque (pas juste un anneau), un initiateur inonde la topologie avec des messages « probe » (sonde). Le premier probe reçu désigne le père (on construit un arbre couvrant). Quand un processus a eu des nouvelles de tous ses voisins, il renvoie un « echo » (accusé) à son père. L'echo peut transporter des données collectées en chemin.

0 / 0
Prêt
C'est le graphe exact de l'exercice (6 nœuds A–F). A est l'initiateur : il veut collecter toute la topologie. Lance la lecture.
probe / arête de l'arbre echo (remonte les données) terminé

L'algorithme Echo (notation du poly)

// engage=faux, PRED=père, NI=nb voisins ok
Iᵢ : { initiateur }
     engage := vrai ; NI := 0 ;
     envoie ⟨info⟩ à tous les voisins

Xᵢ : { un message (info ou echo) arrivé de P }
     si ¬engage alors          // 1er probe
        engage := vrai ; NI := 0 ;
        PRED := P ;
        envoie ⟨info⟩ aux {voisins − PRED}
     NI := NI + 1 ;
     si NI = |voisins| alors   // tous ok
        si initiateur alors ⟨terminé⟩
        sinon envoie ⟨echo⟩ à PRED

Complexité & usages

  • Messages : au plus 2 par lien → chaque arête traversée par un aller + un retour.
  • Temps : au pire 2N.

Sert à : construire un arbre couvrant, synchroniser (maître/esclaves), faire de la détection de terminaison, et, comme dans l'exo, collecter la topologie. Il généralise Chang&Roberts à n'importe quel graphe.

Lien avec l'élection

Chaque candidat lance un probe-echo. Une seule vague se termine : celle du max. Les valeurs plus petites « meurent » car pas propagées. Le survivant est le leader.

08 — Algorithme 4 · avec pannes

Bully / Garcia-Molina, système fautif

On lève enfin l'hypothèse « pas de panne » : les processus peuvent tomber (y compris le leader). On suppose une topologie totalement connectée et que chacun connaît l'identité de tous. Grâce à un timeout, on détecte qu'un processus ne répond plus. « Bully » = la brute : le plus grand id vivant s'impose.

0 / 0
Prêt
5 processus P1–P5. P5 (le leader) tombe en panne. Regarde comment P4 finit par s'imposer.
message « Election » message « Reply » en panne nouveau leader

Les 4 phases

  1. Détection : le leader ne répond plus au ping.
  2. Préparation : Pᵢ envoie « Election » à tous les j > i (plus grands que lui).
  3. Élection : si aucun plus grand ne répond dans le timeout → Pᵢ devient leader. Si un Pⱼ (j>i) reçoit « Election », il répond « Reply » (« tu ne peux pas être leader ») et relance sa propre élection.
  4. Proclamation : le gagnant envoie « Leader » à tous les plus petits.

Coût & le bug « Bully »

  • Chaque Pᵢ envoie (n−i) « Election » → O(n²) messages.
  • Pire cas (n−1 pannes pendant l'élection) → O(n³).
Le comportement « brute »

Si un processus crashé redémarre avec le même id le plus grand, il relance l'algo et s'auto-proclame leader, même si une élection était en cours. On peut alors se retrouver 2 leaders temporairement et une vision incohérente. C'est l'objet de l'exo p1..p4 avec p4 en panne puis p3 qui tombe.

09 — Aide guidée

Les exercices, décortiqués

Ouvre chaque exercice pour la correction pas à pas. fait = déjà rendu (self-training, corrigé A+). Les autres sont la « List of annexed exercises ».

Exo 1

Chang & Roberts : 2 versions + réveil spontané

Comparer la version du cours et celle de Krakowiak, expliquer la différence de résultat.

L'énoncé donne deux écritures du même algo d'élection sur anneau unidirectionnel. La question : quelle différence quand tous se réveillent spontanément vs quand seuls certains se réveillent ?

Rappel Version 1 (cours) vs Version 2 (Krakowiak)

  • Version 1 : variable M (max vu), initialisée à 0. Chaque Pᵢ démarre en envoyant mon_numero. On relaie ⟨j⟩ si M<j. On est leader si on reçoit son propre numéro.
  • Version 2 : booléen participant (faux au départ). Un nœud « se réveille » spontanément OU à la réception. Règles : si j>mon_numero → participant:=vrai, relaie j ; si j<mon_numero ET non participant → participant:=vrai, envoie mon numéro ; si j=mon_numero → leader.

Réponse La différence : le réveil spontané

Les deux élisent bien le processus de plus grand id. La différence tient au cas où un nœud reçoit une valeur plus petite que la sienne alors qu'il ne s'est pas encore réveillé :

  • En Version 2, un nœud non participant qui reçoit un j < mon_numero ne se contente pas d'absorber : il devient participant et injecte sa propre (plus grande) valeur dans l'anneau. C'est prévu exprès pour le cas où tous ne démarrent pas d'eux-mêmes : un grand id « endormi » est ainsi réveillé et remis dans la course par un message plus petit qui passe.
  • En Version 1, l'initialisation {M=0} suppose que chaque processus s'est réveillé et a envoyé sa valeur au départ. Si seuls certains se réveillent, un grand id endormi ne participe pas → l'élu pourrait être le plus grand parmi les réveillés seulement, pas le plus grand absolu.
La phrase à écrire

Quand tous se réveillent spontanément, les deux versions élisent le même : le max global. Quand seuls certains se réveillent, la Version 2 (parce qu'un message réveille un dormeur et l'oblige à propager sa propre valeur) garantit toujours le max parmi les participants effectifs et gère proprement les réveils tardifs ; la Version 1 telle qu'écrite suppose un réveil général et n'a pas ce mécanisme de « relance par le bas ».

Va voir l'animation Chang & Roberts pour visualiser l'absorption des petites valeurs et le tour complet du max.

Exo 2

Tables de routage par calcul d'approximation

Décrire une exécution possible sur le graphe P0–P4 (messages, traitements, valeurs successives).

On calcule de façon distribuée les plus courts chemins (tables de routage de plus faible coût). C'est l'application directe du « calcul par approximation » : chaque nœud a une estimation de sa distance à une destination, et l'affine en recevant les estimations de ses voisins (il garde le min). C'est du Bellman-Ford distribué (distance-vector).

Le graphe arêtes et coûts

  • P0–P1 = 1, P1–P2 = 2, P0–P4 = 5, P1–P3 = 3, P3–P4 = 6, P2–P4 = 1.
0 / 0
But
On calcule la distance de chaque nœud vers P0. Chaque nœud commence à ∞ (sauf P0=0) et prend le min de (coût arête + estimation du voisin). Lance la lecture.

Valeurs ce que prend chaque table (distance vers P0)

  • P0 = 0 (lui-même). P1 = 1 (direct). P2 = 3 (P0→P1→P2 : 1+2). P3 = 4 (P0→P1→P3 : 1+3).
  • P4 = 4, le piège : le lien direct P0–P4 coûte 5, mais P0→P1→P2→P4 = 1+2+1 = 4 est meilleur. L'estimation de P4 passe donc de ∞ → 5 (direct) → 4 (via P2).
Ce que demande l'énoncé

« Quels messages, quels traitements, quelles valeurs successives ». → Chaque nœud envoie son estimation à ses voisins ; à la réception il fait min(actuel, coût_arête + estimation_reçue) ; s'il s'améliore, il rediffuse. Les valeurs de P4 illustrent bien l'affinage progressif (5 puis 4). Pas besoin de gérer la détection de terminaison (dit l'énoncé).

fait

Probe-Echo : collecter toute la topologie sur A

Self-training. A initie, veut récupérer tous les triplets (source, dest, perf) sans doublon.

Réseau 6 nœuds A–F, liens bidirectionnels, chaque nœud connaît ses voisins + la perf du lien. But : A collecte tous les triplets. L'echo doit transporter les données agrégées.

Q1 Le résultat attendu sur A

À la fin, A détient l'ensemble agrégé, sans doublon, de tous les triplets :

(A,B,1)(A,C,2) (B,A,2)(B,C,2)(B,D,4) (C,A,3)(C,B,3)(C,D,3)
(D,B,1)(D,C,1)(D,E,3)(D,F,2) (E,D,1) (F,D,2)

Q2 L'algorithme (actions gardées)

On reprend l'algo Echo, mais l'echo transporte un champ set_triples. Chaque nœud, quand il renvoie son echo, y met ses triplets locaux ∪ tout ce qu'il a reçu des echos de ses fils (union → pas de doublon).

// mes_triplets = triplets locaux connus au départ
// accu = ensemble accumulé (init = mes_triplets)
Cᵢ : { initiateur = vrai }
     engage:=vrai; NI:=0; accu:=mes_triplets;
     envoie ⟨probe⟩ à tous les voisins

REᵢ : { ⟨probe⟩ arrivé de P }
     si ¬engage alors
        engage:=vrai; PRED:=P; accu:=mes_triplets; NI:=0;
        envoie ⟨probe⟩ aux {voisins − P}
     NI:=NI+1;  si NI=|voisins| alors fin()

REᵢ : { ⟨echo, set_triples⟩ arrivé }
     accu := accu ∪ set_triples ;    // union = sans doublon
     NI := NI + 1 ;  si NI=|voisins| alors fin()

fin() : si initiateur alors RÉSULTAT := accu
        sinon envoie ⟨echo, accu⟩ à PRED

Q3 Une exécution possible

Regarde l'animation Probe-Echo : elle joue exactement ce graphe. Résumé :

  • A envoie probe à B et C. B prend A comme père, C prend A comme père.
  • B envoie probe à C et D ; C envoie probe à B et D. D reçoit en premier de B → père = B. Les probes B↔C et C→D « en trop » comptent juste comme voisins vus.
  • D envoie probe à E et F. E et F n'ont que D comme voisin → ils renvoient tout de suite echo avec leurs triplets.
  • D a fini → echo vers B, portant {D,E,F} agrégés.
  • B fini → echo vers A avec {B,D,E,F}. C fini → echo vers A avec {C}.
  • A a reçu de tous ses voisins → terminé, il a tout.

Q4 Chaque lien = 1 probe + 1 echo (en sens opposés) ?

Non. Seules les arêtes de l'arbre couvrant portent 1 probe (aller) + 1 echo (retour). Les arêtes hors arbre (ex. B–C, C–D) sont traversées par des probes dans les deux sens mais aucun echo : quand un nœud déjà engage reçoit un probe, il ne le prend pas comme père, il compte juste le voisin. Donc : arêtes d'arbre = 1 probe + 1 echo ; arêtes hors-arbre = 2 probes, 0 echo.

fait

Élection centralisée client-serveur (topologie étoile)

Self-training, corrigé A+. Un serveur infaillible héberge le service d'élection.

Topologie étoile : un serveur central (qui ne tombe jamais) au milieu, des clients autour. Le serveur ne sait pas combien de clients existent. On veut élire un leader parmi les clients candidats (pas forcément le plus grand id) et que tous soient d'accord. Un oracle détecte la panne du leader.

Q1 Détecter que le leader n'est plus valide

L'oracle pingue régulièrement le leader. Pas de réponse → il envoie ⟨start_election⟩ au serveur et aux clients. Tout le monde remet leader_id := null ; les clients redemandent alors au serveur (candidat, ou juste savoir qui est le nouveau leader).

Q2 Les deux algorithmes

// SERVEUR (ne tombe jamais)
I : { reçoit ⟨start_election⟩ de l'oracle }
    leader_id := null

RBC : { reçoit ⟨be_candidate⟩ de p }
    si leader_id = null alors
       leader_id := p    // 1er arrivé élu
    envoie ⟨set_leader, leader_id⟩ à p

RSL : { ⟨search_leader⟩ de p, leader_id≠null }
    envoie ⟨set_leader, leader_id⟩ à p
// CLIENT  (leader_id = null au départ)
I : { leader = null }
    si veut_être_candidat alors
       envoie ⟨be_candidate⟩ au serveur
    sinon envoie ⟨search_leader⟩ au serveur

RSE : { reçoit ⟨start_election⟩ de l'oracle }
    leader_id := null
    si veut_être_candidat alors ⟨be_candidate⟩→serveur
    sinon ⟨search_leader⟩→serveur

RSL : { reçoit ⟨set_leader, id⟩ du serveur }
    leader_id := id

Astuce clé : c'est premier arrivé, premier élu (first-come-first-elected). Le serveur répond toujours set_leader, donc même une requête arrivant pendant la proclamation est traitée correctement (on renvoie le leader déjà fixé).

Q3 Coût

Étoile + serveur central infaillible → pas vraiment de meilleur/pire cas, un seul cas. Temps parallèle = O(1) (un aller-retour client↔serveur). Messages : avec N clients tous candidats → N ⟨be_candidate⟩ + N ⟨set_leader⟩ = 2N = O(N).

Q4 Avantages / inconvénients

Avantages

Très simple (toute la logique côté serveur), très rapide (1 round), coût faible, accord garanti car le serveur est la source unique de vérité.

Inconvénients

Le serveur est un point de défaillance unique et un goulot d'étranglement (peut être submergé) → passe mal à l'échelle. Et on dépend d'un oracle externe pour détecter les pannes → moins autonome.

Note obtenue

Ce corrigé correspond à ta copie notée A+. Sers-t'en comme modèle de rédaction : énoncé des hypothèses, algos en actions gardées, complexité chiffrée, discussion honnête des limites.

10 — Entraînement

QCM d'entraînement

Teste-toi avant le QCM de la semaine. Pool de questions tirées au hasard, correction et explication immédiates. Ton meilleur score est gardé dans ton navigateur.

Prêt

Pool de 36 questions. Tire un échantillon au hasard, correction immédiate et explication à chaque réponse.

Cartes mémo / clique pour retourner

Lis la question, réponds dans ta tête, puis retourne la carte.

Modèle
Qu'est-ce qui remplace la mémoire partagée ?
clique pour la réponse ↻
Modèle
Rien de partagé : le seul moyen de communiquer est l'échange de messages. Chaque processus n'a que sa mémoire locale.
Modèle
Que garantit un canal FIFO ?
clique pour la réponse ↻
Modèle
Les messages arrivent dans l'ordre d'envoi sur un même canal. Pas de dépassement.
Actions gardées
Différence Iₚ vs Mₚ ?
clique pour la réponse ↻
Actions gardées
Iₚ = action interne, déclenchée par une condition sur les variables locales. Mₚ = déclenchée par l'arrivée d'un message.
Actions gardées
Que signifie le non-déterminisme ?
clique pour la réponse ↻
Actions gardées
Si plusieurs gardes sont vraies, l'algo en choisit une au hasard. Un algo correct marche quel que soit l'ordre.
Temps
Deux exécutions sont identiques quand… ?
clique pour la réponse ↻
Temps
…elles ont le même ordre de réception des messages, peu importe les durées réelles (pas d'horloge globale).
Élection
À quoi sert un leader ?
clique pour la réponse ↻
Élection
À casser la symétrie : désigner un unique processus pour coordonner / décider (rôle de serveur, choix final).
Élection
Doit-on élire le plus grand id ?
clique pour la réponse ↻
Élection
Non. On veut juste un seul élu et que tous soient d'accord. Le plus grand id est une convention pratique, pas une obligation.
Élection
« Élection = approximation », ça veut dire ?
clique pour la réponse ↻
Élection
Chaque valeur candidate est une approximation du résultat. L'algo affine : combiner, garder la meilleure, rediffuser.
Chang&Roberts
Comment le leader se reconnaît-il ?
clique pour la réponse ↻
Chang&Roberts
Il reçoit sa propre valeur de retour : preuve qu'elle a fait le tour complet de l'anneau → il est le max.
Chang&Roberts
Complexité en messages ?
clique pour la réponse ↻
Chang&Roberts
Pire cas O(n²) ≈ n(n+1)/2 ; meilleur ≈ 2n ; moyen O(n·log n) ; temps O(n).
Franklin
Pourquoi O(log n) rounds ?
clique pour la réponse ↻
Franklin
À chaque round, au moins la moitié des candidats blancs deviennent noirs → division par 2 à chaque tour.
Probe-Echo
Qui devient le père d'un nœud ?
clique pour la réponse ↻
Probe-Echo
Celui qui lui envoie son tout premier probe. Cela construit l'arbre couvrant.
Probe-Echo
Quand un nœud renvoie-t-il son echo ?
clique pour la réponse ↻
Probe-Echo
Quand il a eu des nouvelles (info ou echo) de tous ses voisins. Il envoie l'echo à son père.
Probe-Echo
Chaque lien = 1 probe + 1 echo ?
clique pour la réponse ↻
Probe-Echo
Non. Seules les arêtes de l'arbre. Les arêtes hors-arbre reçoivent 2 probes et 0 echo.
Bully
Comment détecte-t-on la panne du leader ?
clique pour la réponse ↻
Bully
Par timeout : pas de réponse au ping dans le délai borné (hypothèse synchrone bornée).
Bully
Que fait Pᵢ pour se porter candidat ?
clique pour la réponse ↻
Bully
Il envoie « Election » à tous les j > i. Si aucun ne répond avant le timeout → il devient leader.
Bully
Pire cas de complexité ?
clique pour la réponse ↻
Bully
O(n³) messages si n−1 pannes surviennent pendant l'élection (on recommence à chaque fois).
Serveur
Principe de l'élection client-serveur ?
clique pour la réponse ↻
Serveur
Premier arrivé, premier élu : le serveur fixe leader_id au 1ᵉʳ candidat, puis répond set_leader à tous. Temps O(1), 2N messages.