Olivier Lemer
Fin de la semaine dernière
Suppositions:
A
a un timestamp à 10,B
a un timestamp à 6,C
a un timestamp à 4.
A
au bout de 1 seconde,Ça fait beaucoup de messages...
Y a-t-il des messages qui peuvent être omis ?
Modifiez le pseudocode en conséquence.
Un ACK
peut être omis si le message le plus récemment envoyé par l'émetteur est un REQ
. En effet, Si un processus a envoyé un REQ
, alors il sait que tout ACK
qu'il enverra ensuite sera ignoré chez le destinataire, jusqu'à ce qu'il envoie un REL
.
L'algorithme peut donc être changé de manière à ce qu'un ACK
ne soit envoyé que si le tableau ne contient pas de REQ
dans la position self
.
Motivation et algorithme
3 types de messages
REL
"Si jamais, j'ai fini ma SC."
ACK
"Je note que tu veux entrer en SC."
REQ
"Si jamais, moi je veux entrer en SC."
Remarques ?
Significations assez indirectes par rapport au but : entrer en SC.
REQ
"Si jamais, moi je veux entrer en SC."
OK
"Pour moi, tu peux entrer en SC."
Simplifier et aller droit au but.
Suggestion
Quantité d'information par message sous-optimale.
→ "Quand j'ai tous les OK
, je peux entrer en SC."
App veut entrer en SC
App sort de SC
Réception d'un REQ
Réception d'un OK
J'envoie un REQ
à tout le monde
Si je suis en SC
OK
.Si je ne suis pas en SC
OK
.OK
.Je réponds par OK
à tous les REQ
en attente.
Je le comptabilise.
OK
de tout le monde, alors je peux entrer en SC.OK
Exemple
B
A
C
REQ 2
Je ne suis pas en SC,
je ne veux pas y entrer,
A
peut y aller.
t=1
t=1
t=1
OK 3
OK 3
OK
de tout le monde, je peux entrer
t=4
t=5
B
A
C
REQ 2
OK 3
OK 3
REQ 4
REQ 4
t=1
t=1
t=1
t=5
t=4
Je suis en SC, pas OK pour moi que B entre.
t=6
OK 5
OK 7
J'ai fini, B peut entrer.
J'ai tous les OK
, je peux entrer.
B
A
C
REQ 2
OK 3
REQ 4
REQ 4
t=1
t=4
t=1
t=1
t=5
OK 3
t=6
OK 5
t=6
OK 7
J'ai fini, B peut entrer.
J'ai tous les OK
, je peux entrer.
t=7
J'attends la SC et je suis prioritaire, je dis pas encore OK
.
B
A
C
REQ 2
REQ 2
OK 3
OK 4
t=1
t=1
t=1
REQ 2
J'attends la SC et je suis prioritaire, je dis pas encore OK
.
OK 5
J'attends la SC mais ne suis pas prioritaire, A
peut y aller.
OK 7
J'ai fini, B peut entrer.
J'ai tous les OK
, je peux entrer.
Propriétés
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
2(n-1
)
messages par processus souhaitant entrer en SC.
Pseudocode
Variables
n
entier, constant
nombre de processus
self
entier, entre 0 et n-1
mon numéro de processus
ts
entier, init 0
mon timestamp Lamport actuel
hasRequested
booléen, init false
ssi j'ai fait une demande de SC
selfRequestTs
entier
timestamp de cette demande
missingOKs
entier
nombre de OK
s que j'attends encore
waitingPs
ensemble d'entiers
numéros des processus qui attendent mon OK
.
Initialisation
Écouter infiniment les événements suivants:
Demande de SC de la couche applicative
Sortie de SC dans la couche applicative
Passage de missingOKs
à 0
Réception de {REQ, tsi}
du processus i
Réception de {OK, tsi}
du processus i
(Avec traitement séquentiel de chaque événement)
Traitement : Demande de SC de la couche applicative.
ts += 1
hasRequested ← true
selfRequestTs ← ts
missingOKs ← n-1
Envoi de {REQ, ts}
à tous les autres processus.
Traitement : Passage de missingOKs
à 0
.
Autorisation de la couche application d'entrer en SC.
Traitement : Sortie de SC par la couche applicative.
ts += 1
hasRequested ← false
Envoi de {OK, ts}
à tous les processus de waitingPs
Réinitialisation de waitingPs
Traitement : Réception {REQ, tsi}
du processus i
.
ts
← max(tsi
, ts
) + 1
Si hasRequested
et
(selfRequestTs < tsi
ou
(SelfRequestTs == tsi
et self < i))
Ajout de i
dans waitingPs
Sinon
Envoi de {OK, ts}
à i
Traitement : Réception {OK, tsi}
du processus i
.
ts
← max(tsi
, ts
) + 1
waitingOKs -= 1
Ricart et Agrawala
Suppositions:
A
a un timestamp à 2
,B
a un timestamp à 10
.
A
demandera la SC au bout d'une seconde, et B
au bout de 4s.
Suppositions:
Trois processus, et initialement
A
a un timestamp à 10,B
a un timestamp à 6,C
a un timestamp à 4.
Demandes de SC
A
au bout de 1 seconde,Voyez-vous une opportunité d'amélioration ?
Un scénario dans lequel on envoie plus de messages que nécessaire.
Observations
B
A
C
REQ
OK
REQ
OK
REQ
OK
REQ
OK
2 types de messages
REQ
"Si jamais, moi je veux entrer en SC"
OK
"Pour moi, tu peux entrer en SC"
Suggestion
Tant qu'on ne m'a rien dit depuis "tu peux entrer en SC", je me permets.
Remarque
C'est comme partager un "jeton de permission" unique avec son voisin
REQ
"Passe-moi le jeton de permission"
OK
"Tiens"
Si j'ai tous les jetons de tous mes voisins, je fais ce que je veux.
Avec des jetons ?
A
B
C
3 jetons :
A
↔︎ B
: A
A
↔︎ C
: A
B
↔︎ C
: B
A
a tous les jetons
A
est en SC
A
B
C
3 jetons :
A
↔︎ B
: A
A
↔︎ C
: A
B
↔︎ C
: B
REQ
"Je veux entrer en SC mais il me manque un jeton"
"J'ai encore besoin du jeton, B
attendra"
A
B
C
3 jetons :
A
↔︎ B
: B
A
↔︎ C
: A
B
↔︎ C
: B
OK
"J'ai fini ma SC, tiens"
"J'ai tous les jetons, je peux entrer en SC"
A
B
C
3 jetons :
A
↔︎ B
: B
A
↔︎ C
: A
B
↔︎ C
: B
"J'ai fini, personne n'a envie de mes jetons, je les garde."
A
B
C
3 jetons :
A
↔︎ B
: B
A
↔︎ C
: A
B
↔︎ C
: B
"Je veux entrer en SC,
j'ai encore tous les jetons,
je peux y aller."
A
B
C
A
B
C
"Je veux entrer en SC,
j'ai besoin du jeton de B
"
"Je veux entrer en SC,
j'ai besoin des deux jetons"
REQ
,4
REQ,2
REQ,2
"J'ai encore besoin des jetons,
ils attendront."
A
B
C
"Tu as la priorité sur moi, donc d'accord, prends"
REQ
,2
A
B
C
"Tu as la priorité sur moi, donc d'accord, prends"
OK,5
"Mais je le re-veux après"
REQ,4
Algorithme & Propriétés
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.
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
Entre 0 et 2(n-1
)
messages par processus souhaitant entrer en SC.
Pseudocode
Variables
n
entier, constant
nombre de processus
self
entier, entre 0 et n-1
mon numéro de processus
ts
entier, init 0
mon timestamp Lamport actuel
hasRequested
booléen, init false
ssi j'ai fait une demande de SC
selfRequestTs
entier
timestamp de cette demande
requesters
ensemble d'entiers
numéros des processus
qui attendent mon jeton.
jetons
ensemble d'entiers
numéros des processus
Initialement arbitraire.
dont j'ai le jeton.
Initialisation
Écouter infiniment les événements suivants:
Demande de SC de la couche applicative
Sortie de SC dans la couche applicative
Réception de {REQ, tsi}
du processus i
Réception de {OK, tsi}
du processus i
(Avec traitement séquentiel de chaque événement)
Traitement : Demande de SC de la couche applicative.
ts += 1
hasRequested ← true
selfRequestTs ← ts
Pour chaque processus i
qui n'est pas dans jetons
:
Envoi de {REQ, ts}
Si jetons
a une taille n
, entrer en SC
Traitement : Sortie de SC par la couche applicative.
ts += 1
hasRequested ← false
Pour tout i
dans requesters
:
Envoi de {OK, ts}
jetons.remove(i)
Réinitialisation de requesters
Traitement : Réception {REQ, tsi}
du processus i
.
ts
← max(tsi
, ts
) + 1
Si hasRequested
et
(selfRequestTs < tsi
ou
(SelfRequestTs == tsi
et self < i))
Ajout de i
dans requesters
Sinon
Envoi de {OK, ts}
à i
jetons.remove(i)
Si hasRequested
Envoi de {REQ, selfRequestTs}
à i
Traitement : Réception {OK, tsi}
du processus i
.
ts
← max(tsi
, ts
) + 1
jetons.add(i)
Si jetons
a une taille n
et hasRequested
:
Entrer en SC
Exercices
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 4s