3.2.5.2 Les messages utilisés
Dans cet algorithme, on utilise cinq types de
messages:
- Demande (Jeton, i) : envoyé par le site i
vers sa racine lors de la demande de la SC. - Libération (Jeton) :
envoyé par le site i vers sa racine après la
libération de sa SC.
- Accord (Jeton) : envoyé par une racine à
un site demandeur pour lui permettre d'utiliser la ressource critique
demandée.
- Requête (Jeton, i) : envoyé par une racine
i pour demander un jeton supplémentaire d'un
voisin.
- Aide (Jeton, i) : Réponse favorable à une
requête d'un voisin.
3.2.5.3 Les procédures de l'algorithme
Procédure 1: Demander la Section
Critique
1 Début
2
3
Etati ?-Demandeur;
Envoyer Demande (Jeton, i) à
Racinei;
4 Fin
Cette procédure est utilisée lorsqu'un site
simple appartenant à un arbre donné, désire d'entrer en
section critique.
Procédure 2: Réception de Accord
(Jeton)
1 Début
2
3
Etati ?-En SC;
< Entrer en Section Critique>
4 Fin
Lorsqu'un site de l'arbre a déjà
envoyé une demande d'entrer en section critique, il va
recevoir un message de type Accord si sa racine
possède au moins un jeton libre, lors de la réception de ce
message, le site va mettre son état EN SC, et entre à la section
critique.
Finsi
Procédure 3: Libérer la Section
Critique
1 Début
Etati ?-Dehors;
Envoyer Libération (Jeton) à
Racinei;
4 Fin
Cette procédure est utilisée si un site
veut libérer la section critique.
Procédure 4: Réception de Libération
(Jeton)
1 Début
2
|
Si Longueuri > 0
alors
|
3
|
Jeton Reçu ();
|
4
|
Sinon
|
5
|
Jetons_libresi ?-
Jetons_libresi + 1;
|
6
|
Finsi
|
7 Fin
lorsque la racine reçoit une libération
du jeton, elle va voir si sa file d'attente elle est vide, si c'est le cas elle
va incrémenter son compteur de jetons libres, sinon elle va appeler la
procédure Jeton_Reçu().
Procédure 5: Réception de Demande (Jeton,
j)
1 Début
Si Jetons_libresi > 0
alors
Envoyer Accord (Jeton) à j;
Jetons_libresi ?-
Jetons_libresi - 1;
2
3
Sinon
Si Jetons_presentsi = Longueuri
alors
Envoyer Requête (Jeton, i) à
voisin_droiti;
Finsi
Demandeursi ?- Demandeursi + {j};
Longueuri ?- Longueuri + 1;
2
3
4
5
6
7
8
9
10
11
12 Fin
Le site racine qui reçoit une demande d'un site
dans l'arbre, il va accorder cette demande en envoyant un jeton, s'il
détient des jetons libres. Dans le cas contraire, on a deux situations :
si le nombre de jetons utilisés dans l'arbre permet de satisfaire les
requêtes reçues au bout d'un temps fini, la racine va attendre la
libération d'un jeton, si non, le site racine va demander un jeton
supplémentaire d'un voisin dans l'anneau par l'envoi d'un message de
type Requête, dans les deux cas, la demande sera ajoutée à
la file d'attente.
Procédure 6: Réception de Requête
(Jeton, j)
1 Début
Si Jetons_libresi > 0
alors
Utiliser le plus court chemin (j);
Jetons_libresi +-
Jetons_libresi - 1;
Jetons_presentsi +- Jetons_presentsi -
1;
Sinon
Si Jetons_presentsi >
Longueuri alors
Demandeursi +- Demandeursi + {j};
Longueuri +- Longueuri + 1;
Sinon
Envoyer Requête (Jeton, j) à
voisin_droiti;
Finsi
Finsi
14 Fin
Lorsqu'un site racine reçoit une requête
d'un voisin, et il détient des jetons libres, il envoie un jeton vers le
voisin demandeur via le plus court chemin pour minimiser le nombre de messages
échangés. Si ce site ne détient pas des jetons libres,
mais le nombre de jetons dans l'arbre est suffisant pour satisfaire toutes les
requêtes au bout d'un temps fini, alors, la requête sera
ajoutée à la file d'attente. Si non, le site va simplement
propager la requête vers son voisin droit.
Procédure 7: Utiliser le plus court chemin(x :
noeud)
1 Début
Distance +- i - x;
Si Distance < 0
alors
Si Distance ~ -K / 2
alors
Envoyer Aide (Jeton, j) à
voisin_droiti;
2
3
4
5
6
7
8
9
10
11
12
13
Sinon
Envoyer Aide (Jeton, j) à
voisin_gauchei;
Finsi
Sinon
Si Distance > K /
2 alors
Envoyer Aide (Jeton, j) à
voisin_droiti;
Sinon
Envoyer Aide (Jeton, j) à
voisin_gauchei;
Finsi
Finsi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Fin
Cette procédure représente la
stratégie qui nous permet d'améliorer la complexité en
nombre de messages, cette procédure est utilisée pour envoyer le
jeton via le plus court chemin, le site racine qui va répondre
favorablement à la requête de son voisin, doit
calculer
la distance, qui est le nombre d'arêtes qui les
séparent, si cette distance est inférieure à
K/2, le jeton sera donc envoyé vers le voisin gauche
(retour en arrière), si non, le jeton sera envoyé vers le voisin
droit.
2
3
4
5
6
7
8
9
10
11
12
13
14
Procédure 8: Réception de Aide (Jeton,
j)
1 Début
2
|
Si i =6 j
alors
|
3
|
Utiliser le plus court chemin (j);
|
4
|
Sinon
|
5
|
|
Si Longueuri > 0
alors
|
6
|
|
|
Jetons_presentsi +-
Jetons_presentsi + 1;
|
7
|
|
|
Jeton Reçu ();
|
8
|
|
Sinon
|
9
|
|
|
Jetons_libresi +-
Jetons_libresi + 1;
|
10
|
|
|
Jetons_presentsi +-
Jetons_presentsi + 1;
|
11
|
|
Finsi
|
12
|
Finsi
|
13 Fin
|
Après l'envoi d'un jeton vers un voisin, le
jeton peut passer par plusieurs sites avant d'atteindre sa destination, ces
sites peuvent être aussi des sites demandeurs, pour cela, on doit
garantir que chaque jeton doit être utilisé par son demandeur. Le
message Aide désigne l'identité du demandeur, le site qui
reçoit ce message va comparer son identité avec celle de
demandeur qui se trouve dans le message, dans le cas où les
identités sont différentes, le site doit propager le jeton vers
le voisin adéquat en utilisant le plus court chemin.
Procédure 9: Jeton Reçu ()
1 Début
Q +-
la_tete_de_la_file_d'attente;
Supprimer la tête de la file d'attente; Longueuri +-
Longueuri - 1;
Si Q = Site_Racine
alors
Utiliser le plus court chemin (Q);
Jetons_presentsi +- Jetons_presentsi -
1;
Finsi
Si Q = Site_Simple
alors
Envoyer Accord (Jeton) à Q;
Finsi
Si Q = i
alors
Etati +-En SC;
< Entrer en Section Critique>
Finsi
15
16 Fin
Lorsqu'un site racine reçoit un jeton à
partir d'un voisin ou d'un site de l'arbre, il doit mettre à jour ses
variables locales. Si la file d'attente des sites demandeurs n'est pas vide, on
doit donc satisfaire la plus ancienne requête dans cette file en
appliquant la procédure Jeton_Reçu.
- 1er cas : la tête de la file est un
site racine, le site doit donc envoyer le jeton vers le site demandeur et doit
encore mettre à jour les deux variables : Jetons libres et Jetons
présents.
- 2ème cas : la tête de la file
d'attente est un site régulier dans l'arbre, la racine va envoyer le
jeton et mettre à jour la variable Jetons_libres.
- 3ème cas : le site demandeur est
la racine elle-même, cette situation nous amène à
décrire le comportement d'un site racine lorsqu'il désire entrer
en SC, donc il passe directement en SC.
2
3
4
5
6
7
8
9
10
11
Procédure 10: Demande de la Section Critique par
une racine
1 Début
Si Jetons_libresi > 0
alors
Jetons_libresi ?-
Jetons_libresi - 1; Etati ?-En
SC;
< Entrer en Section Critique>
Sinon
Si Jetons_presentsi = Longueuri
alors
Envoyer Requête (Jeton, i) à
voisin_droiti; Finsi
Demandeursi ?- Demandeursi + {i};
Longueuri ?- Longueuri + 1;
Finsi
12
13 Fin
Lorsqu'une racine veut entrer en SC.
Finsi
Procédure 11: Libération de la Section
Critique par une racine
1 Début
Etati +-Dehors;
Si Longueuri > 0
alors
Q +-
la_tete_de_la_file_d'attente;
Supprimer la tête de la file d'attente;
Longueuri +- Longueuri -
1;
Si Q = Site_Racine
alors
Utiliser le plus court chemin (Q);
Jetons_presentsi +-
Jetons_presentsi - 1;
Finsi
Si Q = Site_Simple
alors
Envoyer Accord (Jeton) à Q;
Finsi
Sinon
Jetons_libresi +-
Jetons_libresi + 1;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Fin
Si un site racine veut libérer la SC. 3.2.6 Preuve
de l'algorithme
|