Académique Documents
Professionnel Documents
Culture Documents
Chapitre IV :
Coordination
Amine DHRAIEF
1ère année Master Pro Data Science
Contexte : Le temps
●
Depuis 1967, la seconde n’est plus définit par rapport à
l’année (1/86400ème partie du jour solaire moyen) mais
par rapport à une propriété de la matière
– « La seconde est la durée de 9 192 631 770 périodes de la
radiation correspondant à la transition entre les deux niveaux
hyperfins de l’état fondamental de l’atome de césium 133 »
●
Les horloges ne sont pas forcément synchronisées.
– Peut poser de grave problèmes pour la localisation GPS par
exemple
● Nom / tdépart
●
Localisation
d= Distance(satellite → homme) ?
d=vitesse * temps de parcours =
c * (tarrviée - tdépart) =
30/11/2018 Terre
Systèmes Répartis 8
Contexte : Le temps
exemple : trilatération GPS
30/11/2018 Terre
Systèmes Répartis 9
Contexte : Le temps
exemple : trilatération GPS
Localisation OK !
30/11/2018 Terre
Systèmes Répartis 10
Contexte : Le temps
exemple : trilatération GPS
Serveur
Client #1 Client #2
●
Il n’y a pas d’horloge globale pour mesurer
le temps à travers les systèmes répartis,
étant donné le délai pour envoyer par
réseau une lecture de temps.
●
En matière de coordination, l’objectif est de gérer les
interactions et les dépendances entre les activités d’un
système distribué.
– De ce point de vue, on pourrait affirmer que la coordination englobe la
synchronisation.
●
Normalement, sous Unix, les programmes volumineux sont divisés en
plusieurs fichiers source, de sorte qu'une modification apportée à un
fichier source ne nécessite la recompilation d'un seul fichier, pas tous
les fichiers.
●
Si un programme contient 100 fichiers, on n’a pas à tout recompiler car
un fichier a été modifié
→ cela augmente considérablement la vitesse à laquelle les
programmeurs peuvent travaille
●
Si le fichier source input.c a été modifié à l'heure 21 :51 et que le
fichier objet correspondant input.o a été modifié à l'heure 21 :50, make
sait que input.c a été modifié depuis la création de input.o et que
input.c doit donc être recompilé.
●
D'autre part, si output.c a été modifié à l'heure 21:44 et que output.o a
été modifié à l'heure 21 :45, aucune compilation n'est nécessaire.
● Ainsi, make parcourt tous les fichiers source pour déterminer ceux qui
doivent être recompilés et appelle le compilateur pour les recompiler.
30/11/2018 Systèmes Répartis 21
La synchronisation de l’horloge
●
Maintenant, imaginez ce qui pourrait arriver dans un système
distribué dans lequel il n’y a pas un consensus/accord sur un
temps global.
●
Supposons que output.o ait l'heure 21 :44 et que peu après,
output.c soit modifié mais que l'heure 21 :43 lui soit affectée,
car l'horloge de sa machine est légèrement en retard.
●
Bien que la fréquence à laquelle un
oscillateur à cristal fonctionne soit
généralement relativement stable, il est
impossible de garantir que les cristaux de
différents ordinateurs fonctionnent
exactement à la même fréquence.
●
Cette différence de temps est appelée décalage/dérive
d'horloge. En raison de ce décalage d'horloge, les
programmes qui s'attendent à ce que le temps associé à un
fichier, à un objet, à un processus ou à un message soient
corrects et indépendants de la machine sur laquelle il a été
généré (c'est-à-dire quelle horloge il a utilisée) peuvent
échouer (comme dans l’exemple de make).
●
Plusieurs satellites de la Terre offrent également un service UTC. Le satellite géostationnaire
peut fournir le temps UTC avec précision à 0,5 ms, et certains autres satellites obtiennent
même de meilleurs résultats.
– En combinant les réceptions de plusieurs satellites, il est possible de construire des serveurs d’heure au
sol offrant une précision de 50 nsec.
●
Les récepteurs UTC sont disponibles dans le commerce et de nombreux ordinateurs en sont
équipés.
●
L'horloge est obtenue par un calcul d'un temps initial (heure lue
mémorisé avec une pile): temps lu au démarrage+ nombre de
tics depuis ce temps initial * durée d’un tic.
●
Les cristaux diffèrent d'un ordinateur à l'autre, ce qui cause une
désynchronisation entre les systèmes multi-ordinateurs,
appelée dérive/décalage des horloges (clock skew).
●
Si aucune machine ne dispose de récepteurs UTC,
chaque machine garde une trace de son propre temps
et le but est de synchroniser ces machines.
●
De nombreux algorithmes ont été proposés pour
effectuer cette synchronisation.
●
Les horloges matérielles de la plupart des ordinateurs
utilisent un oscillateur à cristal (le quartz), également
capable de produire une fréquence très élevée et stable,
bien que moins stable que celle des horloges atomiques.
●
L’horloge matérielle provoque une interruption f fois par
seconde.
– Lorsque cette minuterie est désactivée, le gestionnaire
d'interruptions ajoute 1 à un compteur qui enregistre le nombre
de tics (interruptions) depuis une certaine heure convenue dans
le passé.
– Ce compteur agit comme une horloge logicielle C, résonnant
à la fréquence F.
●
Les algorithmes de synchronisation d'horloge
ont pour objectif de conserver l'écart entre les
horloges respectives de deux machines
quelconques d'un système distribué, dans une
limite spécifiée, appelée précision (precision) π:
→ ∀t, ∀p, q: | Cp(t) - Cq(t) | ≤ π
●
Quand on considère un point de référence
externe, comme UTC, on parle d’exactitude
(accuracy), dans le but de la maintenir inférieur
à une valeur α:
→ ∀ t, ∀ p: | Cp(t) - t | ≤ α
|C p (t )−t|≤α
|C q (t )−t|≤ α
|C p (t )−C q (t )|≤2∗α = π
●
Cependant, être précis ne nous permet pas de
conclure sur l'exactitude des horloges.
●
Malheureusement, les horloges matérielles, et donc aussi les horloges
logicielles, sont soumises à une dérive d'horloge:
– en raison de leur fréquence qui n’est pas parfaite et affecté par des sources
externes (telles que la température), les horloges de différentes machines
commencent à afficher progressivement des valeurs différentes pour le temps.
→ C'est ce que l'on appelle le taux de dérive d'horloge: la différence par unité
de temps d'une horloge de référence parfaite.
●
Une horloge matérielle typique à quartz a un taux de dérive de l’ordre
de 10-6 secondes par seconde, ou environ 31,5 secondes par an. Il
existe des horloges de matériel informatique dont les taux de dérive
sont beaucoup plus faibles.
30/11/2018 Systèmes Répartis 40
Objectif des algorithmes de synchronisation
d’horloges
●
Les spécifications d'une horloge matérielle incluent
son taux de dérive d'horloge maximal ρ.
●
Si F (t) indique la fréquence réelle de l’oscillateur de
l’horloge matérielle à l’instant t et F sa fréquence
idéale (constante), une horloge matérielle est
conforme à ses spécifications si :
F (t )
∀ t ,1−ρ≤ ≤1+ ρ
F
●
ce qui nous amène à notre objectif ultime, à savoir garder la
dérive de l'horloge logicielle à taux également inférieur à ρ
dCp(t )
∀ t : 1−ρ≤ ≤1+ ρ
dt
30/11/2018 Systèmes Répartis 42
Objectif des algorithmes de synchronisation
d’horloges
●
Si les concepteurs de système veulent garantir une précision
π, c'est-à-dire qu'aucune horloge ne diffère de plus de π
secondes, les horloges doivent être resynchronisées (au
moyen d'un logiciel) au moins toutes les π / (2ρ) secondes.
●
Les différents algorithmes diffèrent par la manière dont cette
resynchronisation est effectuée.
●
Ce dernier peut fournir avec précision l’heure actuelle, en
l’équipant d’un récepteur UTC ou d’une horloge atomique.
●
Le problème, bien sûr, est que lorsqu’un client contacte un
serveur de temps, les retards de messages auront dépassé la
date indiquée. L'astuce consiste à trouver une bonne
estimation de ces retards.
30/11/2018 Systèmes Répartis 45
Network Time Protocol (NTP)
●
Considérez la situation présenté par la figure ci-dessous
●
Dans ce cas, A enverra une requête à B, horodatée avec la
valeur T1. B, à son tour, enregistrera l'heure de réception T 2
(extraite de sa propre horloge locale), et retournera une
réponse horodatée avec la valeur T3, en y insérant la valeur
précédemment enregistrée T2. Enfin, A enregistre l’heure de
l’arrivée de la réponse, T4.
●
Ceci n'est pas autorisé car cela pourrait
entraîner de graves problèmes, tels qu'un
fichier objet compilé juste après le changement
d'horloge ayant une heure antérieure à celle de
la source qui a été modifiée juste avant le
changement d'horloge.
●
Supposons que le minuteur soit configuré pour générer 100
interruptions par seconde.
●
Normalement, chaque interruption ajoute 10 ms à l’heure.
– Lors du ralentissement, la routine d’interruption n’ajoute que 9 ms à
chaque fois que la correction est effectuée.
– De la même manière, l'horloge peut être avancée progressivement en
ajoutant 11 ms à chaque interruption au lieu de la faire avancer d'un
coup.
●
Les paires de valeurs (θ, δ) sont mises en
mémoire tampon, prenant finalement la
valeur minimale trouvée pour δ comme
meilleure estimation du délai entre les deux
serveurs, puis la valeur associée θ comme
estimation la plus fiable du décalage.
●
Toutefois, si l’horloge de B est réputée être plus précise, un tel ajustement
serait alors ridicule.
●
Pour résoudre ce problème, NTP divise les serveurs en strates.
– Un serveur avec une horloge de référence, telle qu'un récepteur UTC ou une
horloge atomique, est connu pour être un serveur de strate-1 (on dit que l'horloge
elle-même fonctionne à la strate 0).
– Lorsque A contacte B, il ajuste uniquement son heure si son propre niveau de
strate est supérieur à celui de B.
– En outre, après la synchronisation, le niveau de strate de A devient supérieur à
celui de B.
– En d'autres termes, si B est une strate -k serveur, alors A deviendra une strate- (k +
1) serveur si son niveau de strate d'origine était déjà supérieur à k.
– En raison de la symétrie du NTP, si le niveau de la strate de A était inférieur à celui
de B, B s’ajustera à A.
30/11/2018 Systèmes Répartis 55
Network Time Protocol (NTP)
●
Dans de nombreux algorithmes de synchronisation
d'horloge, le serveur de temps est passif. D'autres
machines lui demandent périodiquement l'heure.
Tout ce qu'il fait est de répondre à leurs questions.
●
Dans le système Unix de Berkley, l'approche
exactement opposée est adoptée.
●
Ici, le serveur de temps (en fait, un démon de temps)
est actif, interrogeant chaque machine de temps à
autre pour lui demander quelle heure il est là.
30/11/2018 Systèmes Répartis 57
L’algorithme de Berkley
●
Sur la base des réponses,
– il calcule une durée moyenne
– et demande à toutes les autres machines d’avancer leurs horloges vers
la nouvelle heure
– ou de ralentir leur horloge jusqu’à ce qu’une réduction spécifiée soit
atteinte.
●
Cette méthode convient aux systèmes dans lesquels aucune
machine n’est équipée d’un récepteur UTC.
●
L’heure du démon de temps doit être définie manuellement par
l’opérateur périodiquement.
●
Si, dans notre exemple, l’horloge du démon de temps ne serait jamais
calibrée manuellement, aucun dommage n’est causé si aucun des
autres nœuds ne communique avec des ordinateurs externes.
●
Tout le monde sera simplement d’accord sur une heure actuelle, sans
que cette valeur n’ait aucun rapport avec la réalité.
●
L'algorithme de Berkeley est donc typiquement un algorithme de
synchronisation d'horloge interne.
30/11/2018 Systèmes Répartis 60
Les horloges logiques
● Nous pouvons aller plus loin. Pour exécuter make, il suffit que deux
nœuds s'accordent sur le fait que input.o est obsolète avec une
nouvelle version de input.c, par exemple.
●
Dans ce cas, il est important de garder une trace des événements de
chacun (telle que la production d’une nouvelle version de input.c).
Pour ces algorithmes, il est classique de parler d'horloges comme
des horloges logiques
●
Les événement peuvent prendre trois formes
– Calcul locaux (mise à jours d’une variable,...)
– Émission d’un message à destination d’un autre processus
– Réception d’un message émis par un autre processus
●
La communication entre les processus ne se fait
que par transmission de messages.
Si S’i
– Calcul local
– Envoie d’un message
– Réception d’un message
e 11 e 12 e 13 e 14
P1
P2
e 21 e22 e 23
P3
e 31 e 32
e 11 e 12 e 13 e 14
P1
P2
e 21 e 22 e 23
P3
e 31 e 32
Des événement locaux
e 11 e 12 e 13 e 14
P1
P2
e 21 e 22 e 23
P3
e 31 e 32
Des réceptions de messages
e 11 e 12 e 13 e 14
P1
P2
e 21 e 22 e 23
P3
e 31 e 32
Des émissions de messages
●
L’ordre total unique des évènements est noté : →
– e → e’ si et seulement si l’événement e est survenu avant e’
dans Pi
●
Définition CNRTL : « Rapport de la cause à son effet.
Principe de causalité en vertu duquel tout phénomène a
une cause. »
●
Wikipédia : « En physique, le principe de causalité
affirme que si un phénomène (nommé cause) produit un
autre phénomène (nommé effet), alors la cause précède
l'effet (ordre temporel) »
●
Si deux processus n'interagissent pas, il n'est pas nécessaire que
leurs horloges soient synchronisées car le manque de
synchronisation ne serait pas observable et ne pourrait donc pas
causer de problèmes.
●
En outre, il a souligné que l’important n’est généralement pas que tous
les processus s’accordent sur l’heure exacte, mais plutôt sur l’ordre
dans lequel les événements se produisent.
– Dans l'exemple de création, ce qui compte est de savoir si input.c est plus ancien ou
plus récent que input.o, et non leurs temps de création absolus respectifs.
Leslie Lamport. 1978. Time, clocks, and the ordering of events in a distributed system.
Commun. ACM 21, 7 (July 1978), 558-565. DOI=http://dx.doi.org/10.1145/359545.359563
30/11/2018 Systèmes Répartis 72
Les horloges logiques de Lamport
●
Pour synchroniser les horloges logiques, Lamport a défini une relation
appelée se produit-avant (happens before).
●
L'expression a → b est lue «l'événement a se produit avant l'événement b» et
signifie que tous les processus conviennent que le premier événement a se
produit, puis l'événement b se produit. La relation se produit-avant peut être
observée directement dans deux situations:
●
Si deux événements, x et y, se produisent dans des
processus différents qui n'échangent pas de messages
(même indirectement via des tiers), alors x → y n'est ni
vrai ni fausse
– Ces événements sont dits concurrent, ce qui signifie
simplement que rien ne peut être dit (ou n'a pas besoin
d'être dit) sur le moment où les événements se sont produits
ou quel événement est survenu en premier.
∃ un message m /
a→b a : émission(m) & b : réception(m)
∃ un évnement c /
a→c&c→b
e 11 e 12 e 13 e 14 e 1 1 → e1 2
P1
e 2 1 → e2 2
P2 e21 → e12
e2 1
e2 2
e 3 e 2 2 → e1 2
2
P3 e13→ e31
e 31 e 32
●
Ces valeurs de temps doivent avoir la
propriété que si a → b, alors C (a) < C (b).
●
De même, si a est l'envoi d'un message par un processus et que b est
la réception de ce message par un autre processus, alors C (a) et C
(b) doivent être attribués de manière à ce que tout le monde s'accorde
sur les valeurs de C (a) et C (b) avec C (a) <C (b).
●
De plus, le temps d'horloge, C, doit toujours avancer (augmenter),
jamais reculer (diminuer).
– Des corrections au temps peuvent être apportées en ajoutant une valeur
positive, jamais en soustrayant une.
●
Si le message porte l'heure de début, le processus P2 en conclura qu'il lui a fallu
10 tics pour effectuer le trajet.
– Cette valeur est certainement possible.
●
Selon ce raisonnement, le message m2 de P2 à P3 prend 16 tics, encore une
valeur plausible.
●
De même, le message m4 de P2 à P1 part de 64 et arrive à 54.
●
Ces valeurs sont clairement impossibles.
●
Lorsqu'un message arrive et que l'horloge du destinataire indique une
valeur antérieure à l'heure d'envoi du message, le destinataire avance
rapidement son horloge à une heure de plus que l'heure d'envoi.
– Dans la figure ci-dessous, nous voyons que m3 arrive maintenant à 61. De même,
m4 arrive à 70.
●
Réception d’un message m ayant l’estampille ts(m) (m, ts(m))
– Mets à jours son horloge Cpi = max( Cpi , ts(m)) +1
– Utilise cette horloge pour estampiller l’événement C(e) ← Cpi
e 11 e 12
P1
P2
e 21 e 22 e 23
P3
e 31 e 32
1 m(2) 3
0 2
P2
e 21 e 22 e 23
m(4)
1 5
P3 0
e 31 e 32
●
Pour atteindre cet objectif, nous utilisons
également l'identificateur de processus
unique (PID) pour utiliser des paires au lieu
des valeurs du compteur.
●
Si nous avons également un événement (40, j) et i < j , alors
(40, i) < (40,j).
1 m(2) 3
0 2
P2
e 21 e 22 e 23
m(4)
1 5
P3 0
e 31 e 32
●
Cependant, avec les horloges Lamport, rien ne peut être dit sur
la relation entre deux événements (a) et (b) en comparant
simplement leurs valeurs temporelles C(a) et C(b).
●
En d'autres termes, si C(a) < C(b), cela n'implique pas
nécessairement que (a) a bien eu lieu avant (b).
●
Par construction, nous savons
que pour chaque message,
Tsnd(mi) <Trcv(mi).
30/11/2018 Systèmes Répartis 95
Les horloges vectorielles
●
Nous savons que ces valeurs
correspondent à des
événements survenus au
processus P2, ce qui signifie
que m3 a bien été envoyé
après la réception du
message m1
●
Cela peut indiquer que l'envoi
du message m3 dépend de ce
qui a été reçu via le message
m1.
30/11/2018 Systèmes Répartis 97
Les horloges vectorielles
●
Dans le même temps,
nous savons
également que
Trcv(m1) =16 < Tsnd(m2)
= 20.
●
Cependant, l'envoi
de m2 n'a rien à voir
avec la réception de
m1.
●
Le problème est que les horloges de
Lamport ne capturent pas la causalité.
●
En pratique, la causalité est capturée au
moyen d'horloges vectorielles.
●
Le problème se résume alors à garder trace de histoires
causales.
●
Par exemple, si deux événements locaux se sont
produits au processus P, l'historique de causalité H(p2)
de l'événement p2 est {p1, p2}.
●
Supposons maintenant que le processus P
envoie un message au processus Q
– qui est un événement chez P et est donc
enregistré comme pk
●
Supposons qu’au moment de l’arrivée,
l’historique de causalité le plus récent de Q
était {q1}.
H ( p)⊂H (q)
●
il doit s'agir d’une inclusion stricte (excluant le cas
d'égalité)
●
En fait, avec cette notation, il suffit même de vérifier si p
∈ H (q), en supposant que q est toujours le dernier H (q), en supposant que q est toujours le dernier
événement local de H (q).
●
Si, par la suite, nous attribuons un index à chaque
processus, nous pouvons représenter un historique de
causalité sous forme de vecteur, dans lequel la jème
entrée représente le nombre d'événements survenus
au processus Pj.
●
Lorsque le processus i reçoit un vecteur dans un message, il prend pour
chaque entrée de son vecteur le maximum entre l'entrée présente et celle
reçue (fusion des vecteurs).
●
Chaque entrée dans le vecteur du processus i indique le dernier événement
dans un autre processus qui peut avoir influencé le processus i (lien de
causalité).
●
La deuxième propriété est maintenue en
envoyant des vecteurs avec les messages
●
Les étapes suivantes sont effectuées :
●
3) A la réception d’un message m, le
processus Pj ajuste son propre vecteur en
régler VCj[k] ← max {VCj[k], ts(m)[k]} pour
chaque k (ce qui est équivalent fusionner
des historiques de causalité), après quoi il
exécute la première étape (enregistrement).
réception du message) puis remet le
message à l’application.
●
En d'autres termes, l'horodatage ts(m) indique
au destinataire combien d'événements dans
d'autres processus ont précédé l'envoi de m et
dont peut dépendre de la causalité de m.
●
Dans l’exemple 2 (en rouge), nous avons différé l’envoi du
message m2 jusqu’à ce que le message m3 ait été envoyé et après
que l’événement ait eu lieu. Il n’est pas difficile de voir que ts (m 2)
= (4, 1, 0), alors que ts(m4) = (2, 3, 0)
●
Notez en passant que sans connaître les informations
contenues dans les messages, il n’est pas possible d’affirmer
avec certitude qu’il existe bien un lien de causalité, voire un
conflit.
●
L’observation d’un état global permet :
– de détecter des propriétés caractérisant l’exécution (interblocage,
terminaison,...)
– d’effectuer des mesures de performances
– de capter des états pouvant servir de points de reprise en cas de
défaillance
●
Nous commençons par donner les exemples :
– distributed garbage collection (Ramasse-miettes distribuée),
– détection d’interblocage,
– détection de terminaison
– débogage.
●
Pour vérifier qu'un objet est ‘garbage’, nous
devons vérifier qu'il n'y a aucune référence à
celui-ci dans le système.
●
Les processus p1 et p2 attendent chacun un message de
l’autre, de sorte que ce système ne progressera jamais.
●
La détection de la terminaison est un
problème qui a l'air d'une simplicité
trompeuse: il semble tout d'abord nécessaire
de vérifier si chaque processus s'est arrêté.
●
Instantanément, nous pouvons constater
qu’un processus est soit actif, soit passif:
– un processus passif n’est pas engagé dans une
activité propre mais est prêt à répondre avec une
valeur demandée par l’autre.
●
Premièrement, un interblocage ne peut affecter qu'un sous-
ensemble des processus d'un système, alors que tous les
processus doivent être terminés.
●
Deuxièmement, la passivité du processus n’est pas la même
chose que l’attente dans un cycle d’interblocage: un processus
bloqué tente d’exécuter une action supplémentaire pour laquelle
un autre processus attend; un processus passif n'est engagé
dans aucune activité.
●
Par exemple, supposons que vous avez écrit une
application dans laquelle chaque processus Pi contient
une variable xi (i = 1,2,….,N).
●
Les variables changent au fur et à mesure de l'exécution
du programme, mais elles doivent toujours respecter la
contraintes |xi -xj| < d
●
Le problème est que cette relation doit être
évaluée pour les valeurs des variables qui
se produisent en même temps.
●
Le problème essentiel est l'absence de temps global. Si
tous les processus avaient des horloges parfaitement
synchronisées, nous pourrions nous mettre d'accord sur
une heure à laquelle chaque processus enregistrerait son
état - le résultat serait un état global réel du système.
●
De même, nous pouvons considérer n’importe quel
préfixe fini de l’historique du processus:
hik = <ei0 , ei1 , ei2 , …, eik >
●
Chaque événement est :
– soit une action interne du processus (par exemple,
la mise à jour d'une de ses variables),
– soit l'envoi ou la réception d'un message sur les
canaux de communication qui connectent les
processus.
●
Chaque processus peut enregistrer les événements qui
s'y déroulent et la succession d'états par lesquels il
passe.
●
Plutôt que d'introduire un nouveau type d'état, nous faisons
en sorte que les processus enregistrent l'envoi ou la
réception de tous les messages dans le cadre de leur état.
●
Mathématiquement, on peut prendre n'importe
quel ensemble d'états des processus individuels
pour former un état global S = (s1 ,s2,...sN ).
●
Une coupure (cut) de l'exécution du
système : est un sous-ensemble de son
historique global qui est une union de
préfixes d'historique de processus
C= h1c1 U h2c2 U….U hNcN
●
Coupe ⇐ ⇒ coupure ⇒ e coupure ⇐ ⇒ coupure ⇒ e Cliché
●
Plus intuitivement, une coupure C est un
sous-ensemble de l’état global
– une coupure C de l’histoire globale d’un
système est un n-uplet dont chaque
composante est un préfixe de l’histoire locale
du processus correspondant :
C=<c1,c2,….,cN> où cj =<ej1,ej2,ej3,…,ejn>
●
Elle inclut à la fois l’envoi et la réception du message
m1 et l’envoi mais pas la réception du message m2.
∀ e∈C , f →e ⇒ f ∈C
●
On peut caractériser l'exécution d'un système distribué comme une série de
transitions entre des états globaux du système:
S1 → S2 → S3 → S4
●
Dans chaque transition, un événement se produit précisément dans un
processus unique du système.
– Cet événement est l’envoi d’un message, la réception d’un message ou un
événement interne.
– Si deux événements se produisent simultanément, nous pouvons néanmoins
considérer qu'ils se sont produits dans un ordre défini - par exemple, en fonction de
l’identificateur des processus (PID).
●
Un système évolue de la sorte à travers des états globaux cohérents.
30/11/2018 Systèmes Répartis 148
Les snapshots
●
Ces processus communiquent entre eux via des canaux.
●
Un cliché (ou snapshot) capture les états locaux de
chaque processus (par exemple, les variables de
programme) ainsi que l'état de chaque canal de
communication.
C12
X X
Y P1 P2 Y
Z Z
C21
30/11/2018 Systèmes Répartis 151
Cliché (ou snapshot)
●
Au départ les canaux sont vides et les variables
X,Y et Z ont les valeurs ci-dessous
●
Il s’agit d’un snapshot !
C12 [Vide]
X1 = 0 X2 = 1
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [Vide]
30/11/2018 Systèmes Répartis 152
Cliché (ou snapshot)
●
P1 demande à P2 de modifier sa variable X2 de
1à4
●
Il s’agit d’un snapshot !
C12 [X2 → 4]
X1 = 0 X2 = 1
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [Vide]
30/11/2018 Systèmes Répartis 153
Cliché (ou snapshot)
●
P2 reçoit le message de P1
●
Il s’agit d’un snapshot !
X2 → 4
C12 [Vide]
X1 = 0 X2 = 1
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [Vide]
30/11/2018 Systèmes Répartis 154
Cliché (ou snapshot)
● P2 change sa variable X2 de 1 à 4
●
Il s’agit d’un snapshot !
C12 [Vide]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [Vide]
30/11/2018 Systèmes Répartis 155
Obtention d’un cliché cohérent
Algorithme de Chandy & Lamport
●
Chandy et Lamport décrivent un algorithme « de cliché
ou snapshot» permettant de déterminer les états des
systèmes distribués.
●
L’algorithme a pour but d’enregistrer un ensemble d’états
de processus et de canaux (un «cliché instantané») pour
un ensemble de processus tels que, même si la
combinaison d'états enregistrés peut ne jamais s'être
produite en même temps, l'état global enregistré est
cohérent.
●
L'algorithme enregistre l'état localement au
niveau des processus; il ne donne pas de
méthode pour collecter l'état global sur un site.
●
Une méthode évidente de collecte de l'état
consiste pour tous les processus à envoyer
l'état qu'ils ont enregistré à un processus de
collecteur désigné.
– Le graphe des processus et des canaux est fortement connecté (il existe un
chemin entre deux processus quelconques).
●
L'idée essentielle de l'algorithme est la suivante :
– Chaque processus enregistre son état et, pour chaque canal entrant, l’ensemble de messages qui
lui sont envoyés.
– Le processus enregistre, pour chaque canal, tous les messages arrivés après que son état ait été
enregistré et avant que l'expéditeur ait enregistré son propre état.
– Cette disposition nous permet d’enregistrer les états des processus à des moments différents tout
en prenant compte des différences entre les états de processus en termes de messages transmis
mais pas encore reçus.
● Si le processus Pi a envoyé un message (m) au processus P j, mais que Pj ne l'a pas reçu,
alors nous considérons que (m) appartient à l'état du canal entre eux.
●
Le marqueur a un double rôle:
– inviter le destinataire à enregistrer son propre état, s'il
ne l’a pas déjà fait;
– et comme moyen de déterminer quels messages inclure
dans l'état du canal.
●
Il agit comme s'il avait reçu un marqueur (sur un canal
inexistant) et suit la règle de réception du marqueur.
●
Ainsi, il enregistre son état et commence à enregistrer les
messages arrivant sur tous ses canaux entrants.
●
De cette manière, plusieurs processus peuvent lancer
l’enregistrement simultanément (à condition de pouvoir
distinguer les marqueurs qu’ils utilisent).
●
L'état enregistré pour Pj est composé de
– Son état local (variable, données ...)
– Les états de tous ses canaux entrants
●
For j=1 to N (except i)
– Pi envoie le marqueur sur le canal sortant (i→j) Cij
START RECORDING :
●
For j=1 to N (except i)
– Pi enregistre tous les messages des canaux entrants (j → i) Cji
●
Sinon :
– Enregistrer l’état du canal Cji : Les messages qui sont arrivées sur le canal Cji depuis
l’enregistrement a commencé sur le canal Cji
●
Tous les processus ont reçu un marqueur sur tous les
N-1 canaux entrants (et enregistré leur États)
●
Plus tard, un serveur central peut rassembler les
données partielles pour construire un snapshot
global...
C12 [Vide]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [Vide]
30/11/2018 Systèmes Répartis 168
Exemple#1: P1 enregistre sont état
C12 [Vide]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [Vide]
30/11/2018 Systèmes Répartis 169
Exemple#1: P1 propage un
snapshot
●
Ensuite, P1 envoie un message marqueur à P2 et
commence à enregistrer tous les messages sur les
canaux entrants.
C12 [marqueur]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
C21 [M1]
30/11/2018 Systèmes Répartis 170
Exemple#1: P1 propage un
snapshot
●
P2 reçoit un message de marqueur pour la première
fois, enregistre donc son état
●
P2 envoie ensuite un message marqueur à P1
marqueur
C12 [vide]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
M1
C21 [marqueur]
30/11/2018 Systèmes Répartis 171
Exemple#1: P1 terminaison d’un
snapshot
●
P1 a déjà envoyé un message marqueur, il
enregistre donc tous les messages reçus sur les
canaux entrants dans l'état du canal approprié.
C12 [vide]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
M1
C21 [vide]
30/11/2018 Systèmes Répartis 172
Exemple#1: P1 terminaison d’un
snapshot
●
Les deux processus ont enregistré leur état et tous
les états de tous les canaux entrants.
●
Le snapshot est mis en surbrillance en rouge
C12 [vide]
X1 = 0 X2 = 4
Y1 = 0
P1 P2 Y2 = 2
Z1 = 0 Z2 = 3
M1
C21 [vide]
30/11/2018 Systèmes Répartis 173
Exemple#2
source :https://courses.engr.illinois.edu/cs425/fa2015/L3.FA15.pdf