SETIT2007
- 2 -
Plusieurs solutions ont été proposées pour les
réseaux filaires. Ces solutions peuvent être regroupées
en deux familles:
• les algorithmes basés sur le jeton : reposent sur
l’unicité du jeton. Le noeud qui le détient exécute sa
section critique.
• les algorithmes basés sur les permissions : pour
entrer en section critique, un processus doit avoir
toutes les permissions indispensables [HSN 02].
Les algorithmes d’exclusion mutuelle dans les
réseaux ad hoc sont obtenus à partir des algorithmes
proposés dans les réseaux filaires en prennent en
compte les caractéristiques de la mobilité. Dans cette
section nous présentons les différents algorithmes
d’exclusion mutuelle existants développés pour les
réseaux Ad hoc.
1.1. Algorithme de J. Walter et S. Kini [WLT 97]
L’algorithme proposé par J. Walter and S. Kini
[WLT 97] est basé sur le principe du jeton. Cet
algorithme utilise des méthodes et des techniques
développées par: Gafni, et. Bertsekas, dans « loop-free
routing protocol in ad hoc network » [GFN 81], ainsi
que d’autres algorithmes présentés dans [RYM 89]
[CHG 90] [DHM 94]. Une topologie logique DAG
(Graphe acyclique orienté) est construite à partir du
réseau physique. Cette dernière maintient la
propriété "orientée destination". Un DAG est orienté
destination si on peut trouver un chemin vers une
destination donnée [GFN 81]. Dans notre cas, la
destination est le nœud qui détient le jeton, ce noeud
est appelé Sink.
Initialement, le nœud possédant le jeton initie la
construction de la topologie logique DAG. Chaque
nœud de cette topologie lui est associé une valeur
appelée altitude. Cette valeur indique la hauteur d’un
noeud par apport à ses voisins. L’orientation des arcs
est définie selon les valeurs d’altitude. Une altitude est
un triplet (A, B, Id) où A et B sont des entiers et Id
représente l’identificateur du nœud [GFN 81]. Le
pointeur est orienté toujours du nœud qui a la plus
grande altitude vers le nœud qui la plus petite altitude.
Les altitude forment un ordre total. Chaque nœud qui
veut entrer en SC envoie une requête vers le nœud qui
détient le jeton. Un nœud intermédiaire maintient une
file d’attente pour enregistrer les requêtes de ses
voisins ainsi que la sienne. Un élément de la file est un
return_path. Le nœud qui reçoit le jeton entre en SC
s’il est à l’en tête de la file d’attente, sinon il transmet
le jeton au nœud voisin. Comme le jeton se déplace, le
nœud qui le reçoit devient le Sink. Par conséquent, ce
dernier doit modifier son altitude pour que sa valeur
soit la plus petite du DAG et que chaque nœud
possède un chemin vers lui.
Un ou plusieurs nœuds peuvent disparaître à cause
de la mobilité, alors les return_path qui s’y réfèrent ne
sont plus valides. Dans le cas normal, lorsqu’un nœud
sort de sa SC, il envoie le jeton au nœud demandeur à
travers return_path. Si le return_path n’est plus
valide, le Sink lance l’algorithme de recherche pour
repérer le nœud déplacé par l’envoie du message de
recherche sur tous ses liens. Chaque nœud qui reçoit
ce message pour la première fois le diffuse sur tous
ses liens entrants. Quand le nœud est trouvé, le jeton
lui est transmis.
1.2. Algorithme de J. Walter, J. Welch et Vaidya
[WLT01]
Une deuxième version de l’algorithme précédent
[WLT 97] a été proposée par J. Walter, J. Welch et
Vaidya [MLP 01]. L’algorithme utilise les mêmes
hypothèses et le même principe, la différence
principale avec l'algorithme présenté dans [WLT 97] se
situe dans le traitement du déplacement des nœuds. En
effet, dans l’algorithme précédent [WLT 97], si un
nœud voisin qui doit recevoir le jeton n’est plus
accessible, alors le nœud possédant le jeton doit lancer
la procédure de recherche du nœud disparu. En
revanche, dans le deuxième algorithme, le nœud non
accessible, en raison de sa mobilité, doit émettre de
nouveau la demande du jeton. Ceci élimine le coût
engendré par le processus de recherche.
1.3. Algorithme R. Baldoni et A. Virgillito [BLD 02]
L’algorithme proposé par R.Baldoni, A.Virgillito
[BLD 02] est basé sur le principe du jeton, il combine
les deux méthodes Token-Asking et la méthode
Circulating-Token. Dans la méthode Token-Asking, si
un nœud veut entrer en SC, il demande le jeton des
autres nœuds. Dans la seconde méthode, le jeton
circule autour d'un anneau logique. Lorsqu’un nœud
reçoit le jeton il entre en SC. L’algorithme utilise le
protocole de routage pour communiquer avec les
autres nœuds du réseau.
L'algorithme passe en permanence entre deux
états : Idle et Coordinator-Change. Au début,
l’algorithme se trouve dans l'état Idle et le
coordinateur C0 correspond au nœud P1. Par ailleurs,
cette information est connue par tous les nœuds. Un
noeud qui veut entrer en section critique doit envoyer
une requête au coordinateur et attendre le jeton. Le
coordinateur insère la demande dans sa file d’attente
PendingRequest (P) selon une discipline P(FIFO ou
avec Priorité ‘plus proche’, etc.). L'algorithme
s’exécute en séquence de rounds (anneau logique) où
il y a alternance des deux états.. Un nouveau round
commence quand l'état du système change vers
Coordinator-Change. Dans un round, un processus est
désigné pour être le coordinateur noté Ck. Le round est
terminé lorsque tous les nœuds du réseau sont visités.
Le nœud qui reçoit le jeton calcule dynamiquement
son successeur et lui envoie le jeton en utilisant la
table booléenne Receivedtoken[] transmise avec le
jeton. Cette table indique les noeuds qui ont déjà reçu
le jeton. Le successeur est calculé selon certains
critères déterministes, principalement la distance
(nombre de sauts) entre l'émetteur et le récepteur du
jeton.
Le rôle principal des états Coordinator-Change et
Idle est de déterminer le début et la fin du round
composé de n-1 nœud, le coordinateur Ck-1 n’est pas