Olivier Lemer
Pas de duplication de message
Pas de perte de message
Pas de changement d'ordre de message
Pas de panne de processus
Heure virtuelle donnée à tout évènement, tel qu'un ordre strict existe.
Un seul processus à la fois ne peut être dans l'état SC.
"Si ma requête est le plus ancien message que j'aie reçu, je peux entrer en SC"
"Si tout le monde est OK que je le fasse, je peux entrer en SC"
"Si j'ai les jeton de tout le monde, je peux entrer en SC"
"Je suis responsable de maintenir une idée de l'état des autres."
"Je ne suis responsable que de dire quand c'est bon pour moi qu'un autre soit en SC."
"Je ne suis responsable que de donner mon jeton si je n'en ai pas besoin"
App veut entrer en SC
App sort de SC
Réception d'un REQ
Réception d'un OK
J'envoie un REQ
à ceux qui ont le jeton.
Si je suis en SC
Si je ne suis pas en SC
REQ.
Je passe mon jeton à tous les demandeurs.
Je note avoir reçu le jeton.
Le req initial est renvoyé, avec son timestamp d'origine.
Si j'ai tous les jetons
Je peux entrer en SC quand je veux.
Suppositions:
Trois processus dans le système, et initialement
A
a un timestamp à 5
, et possède les jetons de B
et C
,B
a un timestamp à 2
, et possède le jeton de C
,C
a un timestamp à 8
.
Les demandes d'entrée en section critiques sont faites :
A
: au bout de 4sB
: au bout de 1sC
: au bout de 4sAlgorithme par jetons
Un jeton par paire de voisins.
"Il me faut le jeton de tout le monde
pour avoir le droit d'être en SC."
Algorithme par jetons
Un jeton, tout court.
"Il me faut le jeton
pour avoir le droit d'être en SC."
Unicité (Correctness)
Transmission
Progrès
Assurer que le jeton ne sera pas dupliqué ni perdu
Gérer le transit du jeton d'un demandeur à un autre
Assurer que tout demandeur aura le jeton un jour
En général, trouver un protocole de transmission assurant unicité et progrès.
Idée
Jeton transite sur la boucle infiniment
Jeton transite sur la boucle infiniment
Jeton transite sur la boucle infiniment
Un demandeur attend que le jeton lui arrive
Jeton transite sur la boucle infiniment
Un demandeur attend que le jeton lui arrive
Jeton transite sur la boucle infiniment
Un demandeur attend que le jeton lui arrive
Jeton transite sur la boucle infiniment
Un demandeur attend que le jeton lui arrive
Il garde alors le jeton pendant sa SC
Jeton transite sur la boucle infiniment
Un demandeur attend que le jeton lui arrive
Il garde alors le jeton pendant sa SC
Jusqu'à avoir fini, puis le fait passer plus loin
Complexe si pannes autorisées
Risque de perte de jeton et de famine.
Besoin de protocole de régénération.
Mais
Inefficace
Temps d'attente linéaire après requête.
Avantages
Correctness évidente
Un seul jeton, donc une seule SC
Progrès évident
Jeton passe chez tout le monde périodiquement
Inhérent à tout algo à jeton unique
Inévitable
Évitable
Idée
Efficacité
S'il est équilibré, distances logarithmiques.
Simplicité
Un seul chemin entre tous deux points.
Réalisme
Les vrais réseaux sont rarement des cliques.
(Pourra être intégré sur un réseau plus complet)
Trouver où se trouve le jeton
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"E
m'a fait la demande"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
"B
m'a fait la demande"
Transmettre les requêtes via ces liens.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"E
m'a fait la demande"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
"B
m'a fait la demande"
Transmettre les requêtes via ces liens.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
A
B
C
D
E
F
"E
m'a fait la demande"
Les maintenir ainsi.
"tiens"
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
Les maintenir ainsi.
"tiens"
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"D
demande le jeton"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
"B demande le jeton"
Les maintenir ainsi.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"D
demande le jeton"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
sous forme de FIFO
"A
demande le jeton"
"B demande le jeton"
Les maintenir ainsi.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"D
demande le jeton"
"A
demande le jeton"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
sous forme de FIFO
Les maintenir ainsi.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"A
demande le jeton"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
sous forme de FIFO
Les maintenir ainsi.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"A
demande le jeton"
"B
demande le jeton"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
sous forme de FIFO
Et envoyer une requête après le jeton s'il y en a d'autres dans la queue
Les maintenir ainsi.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
"A demande le jeton"
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
sous forme de FIFO
Et envoyer une requête après le jeton s'il y en a d'autres dans la queue
Les maintenir ainsi.
Repasser à un système de requêtes
REQ
"Donne-moi le jeton"
OK
"Tiens"
Trouver où se trouve le jeton
Rendre les liens dirigés
vers le voisin le plus proche du jeton.
A
B
C
D
E
F
Se souvenir d'où la requête vient
Se souvenir de "qui m'a demandé le jeton"
sous forme de FIFO
Et envoyer une requête après le jeton s'il y en a d'autres dans la queue
Les maintenir ainsi.
Résumé
Deux messages
REQ
"Donne-moi le jeton"
OK
"Tiens"
Une file d'attente par processus
Des liens toujours dirigés vers le jeton
Maintenu à jour quand le jeton bouge.
Permet de savoir où envoyer une requête.
Maintient la liste des demandes de jeton.
Permet de savoir à qui renvoyer le jeton.
Renvoi d'une requête après le jeton si besoin
Permet d'informer le nouveau possesseur qu'il s'appelle "reviens".
App veut entrer en SC
App sort de SC
Réception d'un REQ
Réception d'un OK
Envoie d'un REQ
à moi-même
Si ma file est vide, ne rien faire
Si c'est moi
Décider quoi faire du jeton
Décider quoi faire du jeton
Si c'est un autre processus p
p
REQ
à p
Décider quoi faire du jeton
Push l'envoyeur dans ma file
Si je n'ai pas le jeton
Si j'ai le jeton
REQ
en attenteREQ
à mon parentOn push le voisin qui nous a fait le requête, pas le processus qui en est à l'origine
Sinon, pop la tête de ma file
Exemple
A
B
C
D
F
E
[]
[]
[]
[]
[]
[]
A
B
C
D
F
E
[]
[]
[]
[]
[]
[]
A
B
C
D
F
E
REQ
[A]
[B]
[D]
[A]
[]
[]
REQ
REQ
A
B
C
D
F
E
[A]
[B,C]
[D]
[A]
[C]
[]
REQ
"Déjà envoyé une requête à F
"
A
B
C
D
F
E
[A]
[B,C,D]
[D]
[A]
[C]
[]
"Déjà envoyé une requête à F
"
A
B
C
D
F
E
[A]
[B,C,D]
[]
[A]
[C]
[]
OK
A
B
C
D
F
E
[A]
[C,D]
[]
[A]
[C]
[]
OK
"B
est pop, je lui passe, mais il doit me le rendre"
REQ
A
B
C
D
F
E
[]
[C,D]
[]
[A]
[C]
[]
OK
REQ
"Je forward le jeton"
A
B
C
D
F
E
[D]
[C,D]
[]
[]
[C]
[]
REQ
"Je reçois une requête,
je la passe plus loin"
A
B
C
D
F
E
[D]
[C,D]
[]
[B]
[C]
[]
REQ
A
B
C
D
F
E
[D]
[C,D]
[]
[]
[C]
[]
OK
A
B
C
D
F
E
[]
[C,D]
[]
[]
[C]
[]
OK
A
B
C
D
F
E
[]
[D]
[]
[]
[]
[]
OK
REQ
A
B
C
D
F
E
[]
[D]
[]
[]
[D]
[]
A
B
C
D
F
E
[]
[]
[]
[]
[]
[]
REQ
A
B
C
D
F
E
[]
[]
[]
[]
[]
[]
B
A
C
D
E
F
[A]
[A]
[B]
[D]
[C]
[B,C]
[]
[C,D]
[]
[]
[B]
[D]
[]
[]
[D]
[B,C,D]
REQ
REQ
REQ
REQ
REQ
OK
OK
REQ
OK
REQ
OK
OK
OK
REQ
[]
[D]
[]
OK
[]
Propriétés & Pseudocode
Correctness Jamais plus d'un processus sera en SC à un instant T.
Progrès Toute demande d'entrée en SC sera autorisée un jour.
Complexité de communication
2log(n)
par demande d'entrée en SC si l'arbre est équilibré.
Variables
self
entier, constant
mon numéro de processus
hasRequested
booléen, init false
ssi j'ai fait une demande de SC
parent
entier
id du processus parent dans l'arbre
queue
FIFO
Processus ayant fait une requête
inSC
booléen, init false
ssi je suis actuellement en SC
Note : on appelle parent le processus dans la direction duquel aller pour se diriger vers le jeton.
Ainsi, si parent
est n
il
, alors on peut dire qu'on a le jeton.
Initialisation
Écouter infiniment les événements suivants :
Demande d'entrée en SC
Réception de REQ
Réception de OK
Sortie de SC
Traitement : Demande de SC de la couche applicative
Envoi de REQ
à self
hasRequested
← true
Traitement : Réception de REQ
de la part de i
Push i
dans queue
Si parent
est nil
Exécuter handleJeton
Sinon, si hasRequested
est false
Envoyer REQ
à parent
Traitement : Réception de OK
de la part de i
Exécuter handleJeton
Traitement : Sortie de SC de la couche applicative
Exécuter handleJeton
Fonction handleJeton
Si queue
est vide, sortir de cette fonction.
p ←
queue.pop()
Si p
vaut self
parent ← nil
Entrer en SC
hasRequested ← false
Sinon
Envoyer OK
à p
parent ← p
Si queue
n'est pas vide
Envoyer REQ
à p
Graphe initial ci-contre.
Durées :
Deux événements arrivant au même moment sont traités dans l'ordre suivant :
demande de SC, fin de SC, message (dans l'ordre des IDs de l'émetteur).
D
, E
, B
demandent la SC après 1sA
demande la SC après 2sA
B
C
D
[]
[]
[]
[]
E
[]
Un processus qui a fait une demande de SC peut être forcé de faire passer le jeton à sa tête de file, puis envoyer une requête pour qu'on le lui rende ensuite.
Ceci rend l'algorithme équitable, mais est sous-optimal en terme de communication.
Proposez une solution qui réduise le nombre de déplacements du jeton dans ce genre de situation, sans risquer la famine (qu'un demandeur ne puisse jamais entrer en SC).