SETIT 007 th International Conference: Sciences of Electronic, Technologies of Information and Telecommunications March -, 007 TUNISIA Algorithme d Exclusion Mutuelle Distribué pour les Réseaux Ad Hoc Hamza DRID * et Hamamache KHEDDOUCI ** * Laboratoire LORIA. Université Nancy, France. Hamza.Drid@etudiant.univ-nancy.fr ** Laboratoire PRISMa. Université Claude Bernard Lyon, France. hkheddou@bat70.univ-lyon.fr Résumé: Le problème d exclusion mutuelle a été considérablement étudié dans les systèmes répartis. Les solutions proposées pour les réseaux ad hoc sont entièrement basées sur le principe du jeton. L algorithme que nous proposons dans ce papier utilise les deux approches de l exclusion mutuelle : l anneau à jeton et l approche des permissions. L algorithme s exécute sur une topologie logique dynamique sur laquelle on distingue deux classes de nœuds. La première classe est composée des nœuds formant l anneau qui s occupe de la gestion du jeton. La seconde contient les fils de la première classe. L objectif principal de cette solution vise à diminuer l impact de la mobilité et réduire le temps et le nombre de messages échangés pour accéder à la ressource critique lorsqu il y a une faible concurrence dans le réseau. Mots clés: Exclusion mutuelle, Réseaux ad hoc, Algorithmes distribués, Topologie dynamique. INTRODUCTION Au cours de ces dernières années le monde des réseaux sans fil est devenu l axe de recherche le plus important en réseaux. L'évolution récente des moyens de communication sans fil a permis la manipulation de l information à travers des unités de calcul portables ayant des caractéristiques particulières (une faible capacité de stockage, une source d énergie autonome...). Les réseaux mobiles sans fil peuvent être classés en deux catégories: les réseaux avec infrastructure qui utilisent généralement le modèle de la communication cellulaire et les réseaux sans infrastructure ou les réseaux ad hoc. Un réseau ad hoc est un réseau sans fil spontané, auto-organisé, ne reposant sur aucune infrastructure. Les éléments (nœuds) qui le composent sont généralement reliés par des ondes radio. Dans un environnement ad hoc, les mobiles se partagent les ressources du réseau sans arriver à des situations d interblocage ou de conflit. Un conflit peut se produire lorsque, à un instant donné, un noeud essaie d acquérir un nombre de ressources supérieur au nombre de ressources libres. Cependant, une situation d interblocage se caractérise par un état global du système dans lequel des noeuds demandent des ressources mais aucun ne parvient à les acquérir. L exclusion mutuelle dans les réseaux ad hoc est considérée comme l une des solutions de cette problématique. Pour maintenir l intégrité d une ressource partagée, un algorithme d exclusion mutuelle doit vérifier la propriété de vivacité ainsi que la propriété de la sûreté. Ces deux propriétés garantissent l absence des situations d interblocage ou de conflit dans un réseau ad hoc. Cet article est organisé comme suit, La section est consacrée à la description des solutions existantes du problème d exclusion mutuelle dans les réseaux ad hoc. Notre proposition est présentée dans la deuxième partie. Nous terminons par une conclusion et des perspectives de travaux futurs.. Algorithmes d exclusion mutuelle dans les réseaux Ad hoc Dans un environnement ad hoc, les mobiles se partagent les ressources présentes dans le réseau. L utilisation simultanée d'une ressource partagée par plusieurs noeuds peut produire une situation incohérente. En effet, une ressource partagée en exclusion mutuelle ne doit être accessible que par un seul processus. Cette ressource est appelée ressource critique. La partie de programme utilisant la ressource critique est appelée section critique SC. Un algorithme d exclusion mutuelle est donc nécessaire pour rendre exclusif l accès à la ressource critique. - -
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 0]. 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... Algorithme de J. Walter et S. Kini [WLT 7] L algorithme proposé par J. Walter and S. Kini [WLT 7] 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 8], ainsi que d autres algorithmes présentés dans [RYM 8] [CHG 0] [DHM ]. 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 8]. 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 8]. 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... Algorithme de J. Walter, J. Welch et Vaidya [WLT0] Une deuxième version de l algorithme précédent [WLT 7] a été proposée par J. Walter, J. Welch et Vaidya [MLP 0]. L algorithme utilise les mêmes hypothèses et le même principe, la différence principale avec l'algorithme présenté dans [WLT 7] se situe dans le traitement du déplacement des nœuds. En effet, dans l algorithme précédent [WLT 7], 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... Algorithme R. Baldoni et A. Virgillito [BLD 0] L algorithme proposé par R.Baldoni, A.Virgillito [BLD 0] 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 C 0 correspond au nœud P. 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é C k. 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- nœud, le coordinateur C k- n est pas - -
inclus. Le round commence par le coordinateur C k, par conséquent la structure de l'anneau est calculée au moment où le jeton se déplace entre les nœuds. Le noeud qui reçoit le jeton doit le transmettre vers son successeur qui doit être différent de C k- et n ayant pas reçu le jeton auparavant. Le dernier nœud de cet anneau logique transmet le jeton à C k provoquant ainsi la transition de l'algorithme vers l'état Idle. Le prochain coordinateur sera le premier processus dans la file d attente du coordinateur courant... Algorithme de N. Malpani, N. H. Vaidya et J. L. Welch [MLP 0] N. Malpani, N. H. Vaidya et J. L. Welch [MLP 0] ont proposé un algorithme paramétré avec plusieurs variantes. Il utilise un anneau logique dynamique de taille variable. La taille de l'anneau peut changer à chaque round. Un round est terminé quand tous les nœuds du réseau sont visités. L objectif de l algorithme est de trouver un round optimal, c'est-àdire un round qui passe une et une seule fois par chaque nœud du réseau. L'idée principale de cet algorithme se base sur la manière de choisir le prochain nœud qui va recevoir le jeton. Plusieurs politiques ont été appliquées pour déterminer le prochain nœud. Elles sont divisées en deux classes : les politiques qui utilisent que l'information locale du voisinage et les politiques qui utilisent les informations globales de tous les nœuds du réseau. Algorithme Fréquemment- Local (LF) : Le jeton est envoyé au voisin le moins fréquemment visité. Algorithme Récemment -Local (LF) : Le voisin le moins récemment visité est choisi comme prochain noeud. Algorithme Récemment - globale (GR) : Le jeton est envoyé vers le nœud le moins récemment visité. Algorithme Fréquemment - globale GF) : Le jeton est envoyé vers le nœud le moins fréquemment visité parmi tous les nœuds du réseau. Algorithme global avec Visité (GRV et GFV) : Dans ces variantes, tous les nœuds intermédiaires qui conduisent vers la destination sont visités par le jeton. Algorithme recherche Itérative : Un autre algorithme a été proposé dans [MLP0] afin d améliorer les performances futures de l'algorithme tout en tenant compte du passé. L algorithme cherche les chemins Hamiltonien (chaîne passant une et une seule fois par tous les nœuds du réseau) dans le réseau pour que le jeton puisse faire un round optimal.. Nouvel algorithme d exclusion mutuelle mixte basée sur une topologie dynamique Les différents algorithmes d exclusion mutuelle proposés dans les réseaux ad hoc sont entièrement basés sur le principe du jeton. Certaines solutions utilisent la topologie physique du réseau et réduisent le temps et les messages échangés pour entrer en SC. D'autres imposent une structure logique correspondant au réseau physique comme un anneau, un arbre, etc. Pour améliorer les performances, l algorithme proposé par Baldoni et Virgillito [BLD 0] ainsi que celui de Malpani, Vaidya, et Welch [WLT 0] proposent une solution pour trouver un round optimal, c est-à-dire un anneau logique qui passe une et une seule fois par chaque nœud du réseau. Un round optimal permet d optimiser le nombre de messages et le temps de réponse pour entrer en SC, il dépend de la topologie physique ainsi que du nombre de nœuds. L algorithme que nous proposons utilise les deux approches de l exclusion mutuelle : l approche du jeton et l approche des permissions. L algorithme s exécute sur une topologie logique dynamique. Dans ce cas, on distingue deux classes de nœuds : la première est composée des nœuds formant l anneau et s occupant de la gestion du jeton et la seconde contient les fils de la première classe. L objectif principal de cette solution vise à diminuer l impact de la mobilité ainsi que de réduire le temps et le nombre de messages pour accéder à la ressource critique lorsqu il y a une faible concurrence dans le réseau... Principe de l algorithme. Au début, le noeud possédant le jeton initie la construction de la topologie logique. A la fin de la construction, nous aurons deux classes de nœuds : les nœuds formant l anneau et les fils de ces derniers. Le jeton passe que par les nœuds de la première classe, il sauvegarde une table Père_Fils[] pour qu un nœud puisse connaître son fils, ainsi que les nœuds qui ne sont pas encore visités par le jeton.. Un noeud P i appartenant à la Classe_ ne peut entrer en SC que s il possède le jeton. En revanche, un noeud de la Classe_, doit envoyer une demande à son père et attendre la permission de ce dernier. P i ajoute la requête de son fils dans sa file d attente et lui envoie la permission dès qu il sort de sa SC. Pour que P i puisse envoyer le jeton au nœud suivant, il doit recevoir un message de libération de son fils.. Des liens peuvent disparaître à cause de la mobilité. Notre algorithme s intéresse seulement aux liens de type Père-Fils. Lorsqu un noeud P i reçoit le jeton et détecte que le lien avec son fils P j est rompu, il lui envoie la permission (ceci dans le cas où P j a demandé la SC) et ajoute une nouvelle entrée dans la table Père_Fils[] de façon à ce que P j devient un nœud de la Classe_.. Pour maintenir la structure de notre topologie (Père-Fils),, si un nœud P i (sans fils) reçoit le jeton et détecte que l un de ses voisins P j ne possède pas un fils, P i alors il envoie un message à P j pour lui proclamer qu il est son père. Dans la topologie logique illustrée dans la Fig. (b), nous distinguons deux classes de nœuds : les nœuds qui s occupent de la gestion du jeton,,, et les fils de ces derniers,,8,7. Cette figure met en évidence le fait que chaque nœud fils possède un nœud père mais le contraire n est pas vrai. - -
SETIT007 (a) Lien physique Lien Logique File d attente Fig. Topologie Logique Dynamique.. Modélisation du Système Notre système est composé de N noeuds indépendants (N ). Nous considérons les hypothèses suivantes : Le nombre N des noeuds est connu. Tous les nœuds exécutent le même protocole (notre algorithme). La communication est fiable. Un nœud ne tombe jamais en panne. Les ruptures sont causées seulement par le déplacement des nœuds. Les informations de voisinage sont fournit par le protocole de routage. Aucune partition dans le réseau ne peut apparaître... Variables et Messages échangés Variables locales : Chaque nœud P i dans le système maintient les variables locales suivantes: Père i : variable indiquant l identificateur du nœud Père. Si P i = Père i signifie que P i Classe_. Demande_SC : variable booléenne initialisée à faux, indiquant si Pi a demandé la ressource critique ou non. file i : file d attente du noeud P i contenant les requêtes venant du nœud fils. Messages échangés : P i communique avec les autres nœuds par l envoie de l un des messages suivants : Req_Sc(): message envoyé par P i à son Père pour demander la SC. Perm_SC(): message envoyé par P i à son fils pour qu il puisse entrer en SC. Libr_SC() : message envoyé par P i à son père dès qu il termine de la SC. Tu_Es_Pére(): message envoyé par P i à son Fils pour l informer que le lien Père-Fils est rompu. Tu_Mon_Fils() : message envoyé par P i à P j pour lui dire qu il est son fils tel que: P i, P j CLasse_. Jeton (Père_Fils[]): message envoyé par P i à P j de la même classe (classe_), pour donner le privilège à P j. Le message contient une table Père_Fils[] qui permet de faire la distinction entre les nœuds de la Classe_ et ceux de la Classe_ et qui permet aussi de savoir quels sont les nœuds visités par le jeton. (b) Pi possédant le jeton Pi Classe Pi Classe Structure de la table Père_Fils[] : Chaque entrée dans la table Père_Fils[] contient trois champs (Père ; Fils ; Visité) Pére : contient l identificateur du nœud Père. Un père doit impérativement appartenir à la Classe_. Fils : contient l identificateur du nœud fils. Un fils doit impérativement appartenir à la Classe_. Visité : indique si le nœud père est visité par le jeton ou non dans le round courant. Initialement, la valeur Visité de toutes les cases de la table Père_Fils[] est égale à. Père Fils 8 7 Null Visité Vrai Fig. Exemple de La Table Père_Fils[].. Algorithme générique A. Demande d entrée en SC par le nœud P i Pi classe_ P i entre en SC dès qu il reçoit le jeton. Pi classe_ P i envoie le message Req_Sc() à son père pour demander la SC. P i entre en SC dès qu il reçoit la permission Perm_Sc() de son père. B. P i reçoit une demande d accès en SC de son fils Pi classe_. P i insert la requête de son fils dans la file d attente.. P i envoie la permission Perm_SC() dès qu il termine de sa SC. C. Libération de la SC par Pi P i classe_. P i change la valeur de sa case Père_Fils[i]. Père_Fils[i] :=(P i,p i.fils, Vrai). P i envoie le jeton au prochain nœud dès qu il reçoit le message Libr_SC() de son fils et le prochain nœud est calculé à partir de la table Père_Fils[]. Pi classe_ : P i envoie Libr_SC() à son père. D. P i envoie le jeton P i classe_ Lorsque P i veut envoyer le jeton, il doit vérifier s il y a des noeuds qui ne sont pas encore visités, si ce n est pas le cas P i met la valeur Père_Fils[i] ->visité de toute les cases de la table Père_Fils[] à "" pour commencer un nouveau round (nouvel anneau logique) et envoie le jeton vers le premier nœud de cette table. E. Traitement des ruptures: Chaque nœud sait à quelle classe il appartient. Les liens sensibles dans notre algorithme sont ceux entre les nœuds de deux classes différentes et qui ont une relation de type Père-Fils. Le traitement suivant est - -
effectué lorsqu un nœud détecte que son lien Père- Fils est rompu : P i Classe_ Lorsque P i reçoit le jeton et termine de sa SC:. P i insère une nouvelle entrée dans la table Père_Fils[] portée avec le jeton (Père := P i.fils ; Fils := null ; Visité =vrai). P i envoie la permission à son fils si ce dernier a demandé la SC. P i Classe_ P i affecte à sa variable locale Père son propre identificateur lorsque il reçoit le message Tu_Es_Pére de son Père. P i devient un nœud de la Classe_... Description de l algorithme... lors de la réception du jeton Comme nous avons dit précédemment, le jeton visite que les nœuds de la Classe_. Par conséquent, quand P i reçoit le jeton, il rend la valeur de Père_Fils[i]->.visité à vrai (Fig ligne ), et attend jusqu à ce que la valeur Demande_SC devient Fausse (libération de la SC) (Fig ligne ) pour vérifier s il y a une requête dans la file d attente ou non, si c est le cas Pi envoie la permission à son fils(fig ligne,). Lorsque P i reçoit le jeton (Père_Fils[]) : ) Père_Fils[i]->visité = vrai ; ) Attendre jusqu a Demande_SC = faux ; ) Si File i Non vide Alors ) Envoyer Perm_SC à Père_Fils[i]->Fils ; ) Attendre jusqu a File i = vide ; ) Lien_rompu(Pi, Père_Fils[i]->Fils ) ; 7) Si Père_Fils[i]->visité = Alors 8) Envoyer le jeton vers le nœud : Père_Fils[i]->Pere.Suivant() Sinon \\ un nouvel anneau vient de commencer ) i, Père_Fils[i]->visité := faux 0) Envoyer jeton vers le premier nœud père dans la table Père_Fils[] ; ) si (Père i P i ) ) Père_fils[i]->supprimer ; Fig. Traitement effectué lors de la réception du jeton L étape suivante consiste à vérifier l existence du lien entre Pi et son fils. Après cette étape, Pi doit envoyer le jeton au nœud suivant. Pi consulte la table Pere_Fils[] pour voir s il y a un nœud qui n est pas encore visités afin de lui envoyer le jeton (Fig ligne,7). Si ce n est pas le cas, Pi met la valeur Père_Fils[i]->visité de toute les entrées de la table à faux pour commencer un nouveau round (nouvel anneau logique) (Fig ligne 8,). Quand P i reçoit le message Tu_Mon_Fils de l un de ses voisins, la valeur de la variable Père i devient différente de P i (Fig ligne,). Lorsque Pi reçoit le jeton, il supprime sa case de la table Père_fils[], pour qu il ne reçoit pas le jeton dans le prochain round (Fig ligne,)... lors de la réception d un message de Pi Lorsque Pi reçoit un message Tu_Mon_Fils (Pi Classe_) de son voisin Pj, Pi affecte à la variable Locale Pere i l identificateur du Pj (Fig ligne,). Lorsque Pi reçoit un message Tu_Es_Pére (Pi Classe_) de son Père Pj, Pi affecte à la variable Locale Pere i son identificateur est devient un nouveau Père (Fig ligne,). Lorsque Pi reçoit un message de type Req_SC (Pi Classe_) de son fils, Pi met dans sa file d attente l identificateur de son fils pour qu il lui envoie la permission (Fig ligne,7). Lorsque Pi reçoit un message de type Libr_SC (Pi Classe_) de son fils, Pi vide sa file d attente (Fig ligne 8,). Lorsque Pi reçoit un message de P j ) Si Pi Père i alors //(Pi Classe_) ) Cas : msg =Tu_Mon_fils ) Père i := Pj; ) Cas : msg =Tu_Es_Pere ) Père i := Pi; Sinon //(Pi Classe_) ) Cas : message = Req_SC 7) Insérer Pj dans File i ; 8) Cas : message = Libr_SC ) Vider File i Fig. Traitement effectué lors de la réception d un message... Description des fonctions... Demande_SC() Quand un nœud Pi demande la SC, il place la valeur Demande_SC à vrai (Fig ligne ), si Pi appartient à la Classe_, il entre en SC dès qu il reçoit le jeton (Fig ligne ), sinon il doit envoyer un message Req_SC() à son père et attend la permission Perm_SC() pour qu il puisse entrer en SC (Fig ligne,). Lorsque Pi termine de sa SC, il fixe la valeur Demande_SC à faux (Fig ligne 7,8) et envoie Perm_SC() à son père si Pi Classe_ (Fig ligne ).... Lien_rompu (P i, Fils ) Cette fonction est utilisée pour vérifier si le lien entre Pi et son Fils est rompu. Pi ajoute une nouvelle entrée (Fils, null, vrai) dans la table Père_fils[](Fig ligne ), ensuite, Pi envoie un message de type Tu_Es_Père à son ancien Fils pour l informer qu il est devenu un Père (Fig ligne ). La fonction Fusion () est appelée pour maintenir la topologie dynamique (Fig ligne ). - -
Demande_SC() ) Demande_SC:= Vrai; ) Si Pi Père i alors // Pi Class_ ) Envoyer Req_SC() à Père i ; ) Attend Perm_SC; Sinon // Pi Class_ ) Attend le jeton(); ) Exécuter SC 7) Demande_SC:= faux ; 8) Si Pi Père i alors // Pi Class_ ) Envoyer Libr_SC() vers Père i ; Fig. Demande la SC Lien_rompu(P i, Fils ) ) Si le lien entre Pi et Fils est rompu Alors ) Père_Fils[]->add (Fils, null, vrai) ; //Ajouté //une nouvelle case dont le champ //père égale à l id du nœud Fils. ) Envoie Tu_Es_Pere à Père_Fils[i]->Fils ; ) Fusion(Pi) // pour chercher un nouveau Fils Fig. Traitement des ruptures... Fusion (Pi) Pour maintenir la structure de la topologie la fonction Fusion (Pi) cherche dans la table Père_fils[] un nœud P j voisin de P i qui ne possède pas un Fils. P i envoie à P j Tu_Mon_Fils pour rendre ce dernier le Fils de P i (Fig7 ligne ). P i supprime la case de P j de la table Père_fils[] pour qu il ne reçoit pas le jeton dans le prochain round (Fig7 ligne ). Fusion (Pi) ) Père_fils[]->Premier ; ) Tantque (Père_fils[]->Suiv null) ) Si Père_fils[]->Fils=null, & Père_fils[].Père voisin de Pi Alors ) Pi envoie à Père_fils[].Père Tu_Mon_Fils ; ) Père_fils[]->fin ; ) Père_fils[]->Suiv ; Fig.7 Fusionner deux nœuds voisins.. Sûreté et vivacité Pour maintenir l intégrité d une ressource partagée, un algorithme d exclusion mutuelle doit vérifier les propriétés suivantes : Propriété (Sûreté) : À tout instant, il ne peut y avoir au plus qu un seul processus qui entre en SC. Propriété (Vivacité) : Tout processus désirant entrer en SC doit être sûr d y arriver en un temps fini. Dans le paragraphe suivant, nous allons vérifier que notre algorithme d exclusion mutuelle assure ces deux propriétés,... Sûreté Pour démontrer cette propriété, il faut montrer les deux points suivants :. deux nœuds qui ont une relation Père-fils ne peuvent pas être en SC en même temps.. à tout instant, un et un seul nœud peut avoir le jeton. Preuve Partie : Soient P i et P j deux nœud tels que : P i Classe_, P j Classe_ et P j est le fils de P i. P i entre en SC dès qu il reçoit le jeton (Fig. Ligne) par contre, P j doit recevoir la permission de son père P i pour qu il puisse entrer en SC (Fig. Ligne), la permission Perm_SC est envoyée par P i, si seulement si P i a sorti de sa SC (Fig Ligne,). A partir de ces observations on peut conclure que P i et P j ne peuvent pas être en SC en même temps. Partie : Pour le deuxième point, on doit démontrer que lorsque P i termine du jeton, il doit l envoyer vers un seul nœud de la Classe_. Quand P i reçoit le jeton nous avons deux cas possible : Cas : il y a des nœuds qui ne sont pas encore visités par le jeton (le round n est pas encore terminé (Fig. Ligne 7), dans ce cas Pi doit envoyer le jeton vers le nœud suivant dans la table Père_Fils[] ; Cas : dans ce cas tous les nœud du réseau sont visités (round terminé), alors un nouveau round vient de commencer, Pi remet à le champ Visité de toutes les cases de la table Père_Fils[] (Fig. Ligne ) et envoie le jeton vers le premier nœud père dans cette table (Fig. Ligne 0). Ce qui démontre qu à chaque fois le jeton est détenu par un seul nœud. A partir des deux démonstrations précédentes on peut conclure que notre algorithme vérifier bien la propriété de la sûreté.... Vivacité Notre algorithme assure la propriété de la vivacité car la structure de la table transmise dans le jeton permet d indiquer les nœuds visités ou non dans le round courant. Un nouveau round ne commence que si tous les nœuds du réseau sont visités. Donc il est évident que chaque nœud demandant la ressource critique finira certainement par l obtenir. - -
.7. Etudes des performances Nombre de messages échangés Afin d évaluer le nombre de messages échangés (Nbr_Msg) pour entrer en SC, nous considérons le scénario suivant : N : nombre de nœuds dans le réseau. M: nombre de nœuds appartenant à la Classe_. M est compris entre et N/ ( M N/), il est égal à N/ quand chaque père dans le réseau possède un fils. S : nombre de liens rompus avant que l anneau logique (round) soit terminé. ( S M). Chaque nœud Pi appartenant à la Classe_ a besoin de messages pour entrer en SC. : Req_Sc() : Demander la SC : Perm_SC() : Avoir la permission : Libr_SC() : Libération de la SC Le round ou l anneau logique est constitué de N-M nœuds. Ce qui fait que le nombre de messages nécessaires pour compléter le round est N - M messages. Le nombre total de messages échangés lors d une exécution de la SC est : Nbr_Msg = M + (N-M) + S Nombre de messages échangés lorsque il y a une faible concurrence : On suppose que M= N/. Dans cette situation un seul nœud demande la SC. On peut distinguer deux cas possibles : Cas : Le noeud demandeur appartient à la Classe_ donc le nombre de messages est : Nbr_Msg = (N-M) + S = N/+S. Cas : nœud demandeur appartient à la Classe_ donc le nombre de message est : Nbr_Msg = + (N-M) +S =+N/+S. Dans cette situation (faible concurrence) notre algorithme est très efficace comme le démontre l exemple suivant : 7 8 (a) (b) Fig.7 Comparaison de la topologie utilisée avec un simple anneau logique Dans cet exemple (Fig.7). Le nœud_ est le seul nœud qui veut entrer en SC. Dans le premier cas (Fig.7 (a) Anneau simple) le nœud_ doit attendre les nœuds,, 8,, 7, pour entrer en SC. En revanche, dans notre solution (Fig.7 (b)) le nœud_ va attendre seulement les nœuds ( et ) pour entrer en SC, ce qui a réduit considérablement le nombre de messages échangés ainsi que le temps de réponse.. Conclusion Dans ce papier nous avons traité le problème d exclusion mutuelle dans les réseaux ad hoc. En premier lieu nous avons présenté les différents algorithmes d exclusion mutuelle dans les réseaux ad hoc. Ces algorithmes se basent essentiellement sur le principe du jeton. Ils utilisent une topologie logique pour obtenir une meilleure organisation du réseau et pour diminuer l impact de la mobilité. Nous avons proposé par la ensuite un algorithme d exclusion mutuelle basé sur les deux approches à jeton et à permissions. Ce dernier utilise une topologie reposant sur deux catégorie de nœuds : les nœuds s occupant de la gestion du jeton et de la topologie et les fils de ces derniers. Finalement, nous avons comparé notre topologie à celle utilisée par les autres algorithmes proposés dans la littérature et nous avons mis en évidence ces principaux avantages. Comme perspective de travaux futurs, nous envisageons compléter cette contribution par des simulations. Nous envisageons aussi continuer à travailler sur les politiques de partage de ressources dans les réseaux ad hoc qui permettraient de diminuer l impact de la mobilité ainsi que le temps de réponse. REFERENCES [BLD 0] R.Baldoni, A.Virgillito, R.Petrassi, "A Distributed Mutual Exclusion Algorithm for Mobile Ad-Hoc Networks," Dans IEEE - ISCC 0, 00. [CHG 0] Y. Chang, M. Singhal, and M. Liu, "A fault tolerant algorithm for distributed mutual exclusion, In Proc. of th IEEE Syrup. on reliable dist. systems, 0. [DHM ] D.M. Dhamdhere and S.S. Kulkami, "A token based k-resilient mutual exclusion algorithm for distributed systems". Information Processing Letters, 0:-7,. [GFN 8] E. Gafni and D. Bertsekas, "Distributed algorithms for generating loop-free routes in networks with frequently changing topology". IEEE Transactions on Communications, C- ():-8, 8. [HSN 0]A. Housni "Introduction De La Priorité Dans Les Algorithmes D exclusion Mutuelle Repartis" école doctorale d informatique, d automatique et de productique, thése 00. [MLP 0] N. Malpani, N. H. Vaidya, J. L. Welch, "Distributed token circulation on mobile ad hoc networks". Technical report, Intel Corporation 0 E. Huntland Dr. Suite 0, Austin TX 787. [RYM 8] K. Raymond, "A tree-based algorithm for distributed mutual exclusion". ACM Transactions on Computer Systems, Vol. 7 N., Feb. 8, pp. -77. [WLT 7] J.E. Walter and S. Kini, "Mutual exclusion on multihop, mobile wireless networks". Texas A&M Univ., College Station, TX 778-, TR7-0, 7. [WLT 0] J.E. Walter, J. Welch, and N. Vaidya, "A Mutual exclusion algorithm for ad hoc mobile Networks". ACM and Wireless Networks Journal special issue on Dialm papers, 00. - 7 -