Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc. M. Benchaïba, M. Haddad et M.



Documents pareils
Introduction aux algorithmes répartis

Un algorithme équitable d exclusion mutuelle tolérant les fautes

Vers une approche Adaptative pour la Découverte et la Composition Dynamique des Services

L exclusion mutuelle distribuée

Windows Internet Name Service (WINS)

Chapitre 4 : Exclusion mutuelle

Cours de Systèmes d Exploitation

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Routage Statique. Protocoles de Routage et Concepts. Version Cisco Systems, Inc. All rights reserved. Cisco Public 1

THÈSE. présentée à TÉLÉCOM PARISTECH. pour obtenir le grade de. DOCTEUR de TÉLÉCOM PARISTECH. Mention Informatique et Réseaux. par.

Plan du Travail. 2014/2015 Cours TIC - 1ère année MI 30

Algorithmique des Systèmes Répartis Protocoles de Communications

Recherche dans un tableau

TD n o 8 - Domain Name System (DNS)

Ebauche Rapport finale

Ordonnancement temps réel

Revue d article : Dynamic Replica Placement for Scalable Content Delivery

Une méthode d apprentissage pour la composition de services web

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Principe de symétrisation pour la construction d un test adaptatif

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Genie Logiciel Avancé Projet :Gestion d une chaîne hotelier low cost

La couche réseau Le protocole X.25

Pré-conditions : Evénement déclencheur : le client souhaite un virement. Description du déroulement du cas : Description des Use cases

Conception des systèmes répartis

Algorithmique répartie

Un modèle générique de Garbage Collection pour les éditeurs collaboratifs basé sur l approche TO dans les environnements P2P et mobiles

Cours de Base de Données Cours n.12

DAns un système multi-utilisateurs à temps partagé, plusieurs processus

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

DHCP et NAT. Cyril Rabat Master 2 ASR - Info Architecture des réseaux d entreprise

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

TP redondance DHCP. Gillard Frédéric Page 1/17. Vue d ensemble du basculement DHCP

TD 2 Chapitre 4 : Support des Services et Serveurs. Objectifs : Maîtriser l'exploitation des tables de routage dynamique.

Définition des Webservices Ordre de paiement par . Version 1.0

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Arbres binaires de recherche

Réplication adaptative sur les réseaux P2P

Julien MATHEVET Alexandre BOISSY GSID 4. Rapport RE09. Load Balancing et migration

2 État de l art. Topologie Virtuelle pour Réseaux Hybrides

Réplication des données

Cisco Certified Network Associate Version 4

Flexible Identity. authentification multi-facteurs. authentification sans token. Version 1.0. Copyright Orange Business Services mai 2014.

Métriques de performance pour les algorithmes et programmes parallèles

Banque en ligne et sécurité : remarques importantes

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Le Multicast. A Guyancourt le

Le service IPv4 multicast pour les sites RAP

Encryptions, compression et partitionnement des données

Plateforme PAYZEN. Définition de Web-services

Application de K-means à la définition du nombre de VM optimal dans un cloud

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Structuration des décisions de jurisprudence basée sur une ontologie juridique en langue arabe

TP Bases de données réparties

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Introduction à la programmation concurrente

Techniques d interaction dans la visualisation de l information Séminaire DIVA

Protocole de configuration dynamique des hôtes pour IPv6 (DHCPv6)

BIG Data et R: opportunités et perspectives

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Bases de programmation. Cours 5. Structurer les données

Exclusion mutuelle de groupes dans les systèmes distribués

Erreurs les plus fréquentes Guide de dépannage

Unitt Zero Data Loss Service (ZDLS) La meilleure arme contre la perte de données

Réseaux grande distance

Qualité du logiciel: Méthodes de test

Classification Automatique de messages : une approche hybride

Les réseaux cellulaires

Differential Synchronization

Ré-ordonnancement adaptatif de messages dans un réseau ad hoc de véhicules

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Big Data et Graphes : Quelques pistes de recherche

Contrôle par commande prédictive d un procédé de cuisson sous infrarouge de peintures en poudre.

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Cours de Master Recherche

Administration Réseau sous Ubuntu SERVER Serveur DHCP

Efficace et ciblée : La surveillance des signaux de télévision numérique (2)

Définition et diffusion de signatures sémantiques dans les systèmes pair-à-pair

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Efficient Object Versioning for Object- Oriented Languages From Model to Language Integration

Chapitre 11 : Le Multicast sur IP

Configuration automatique

TP 2 Réseaux. Adresses IP, routage et sous-réseaux

Surveillance et maintenance prédictive : évaluation de la latence de fautes. Zineb SIMEU-ABAZI Univ. Joseph Fourier, LAG)

Sauvegarde collaborative entre pairs Ludovic Courtès LAAS-CNRS

Données Réparties. Thibault BERNARD.

Initiation à la Programmation en Logique avec SISCtus Prolog

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Dynamic Host Configuration Protocol

Principes de DHCP. Le mécanisme de délivrance d'une adresse IP à un client DHCP s'effectue en 4 étapes : COMMUTATEUR 1. DHCP DISCOVER 2.

Big Data et Graphes : Quelques pistes de recherche

Algorithmique & programmation

Mieux comprendre les certificats SSL THAWTE EST L UN DES PRINCIPAUX FOURNISSEURS DE CERTIFICATS SSL DANS LE MONDE

IPv6. Lab 1: Installation IPv6. Objectif: Installation sous Windows XP

Bases de données et sites WEB

Systèmes et algorithmes répartis

L annuaire et le Service DNS

Transcription:

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc M. Benchaïba, M. Haddad et M. Ahmed-Nacer LSI-TR00 Février 00

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc M. Benchaïba, M. Haddad et M. Ahmed-Nacer LSI-Département Informatique- USTHB- BP. N El-Alia, Bab Ezzouar, Alger Algérie Email: benchaiba@lsi-usthb.dz, anacer@mail.cerist.dz Laboratoire PRISMa - Université Claude Bernard Lyon, Bât. Nautibus (ex 0), 8, Bd. du nov. 98, 9 Villeurbanne Cedex France Email: mhaddad@bat0.univ-lyon.fr Résumé: Cet article propose un nouveau protocole d exclusion mutuelle pour les réseaux mobiles ad hoc utilisant une approche à jeton. Ce protocole ne repose pas sur la couche de routage et, pour la circulation du jeton, privilégie la satisfaction des demandes en même temps selon leurs anciennetés et leurs distances par rapport au jeton. Une requête d un processus est diffusée selon un rayon dynamique permettant d atteindre une proportion de nœuds dont une requête est présente localement. Par ailleurs, le protocole proposé pr en charge quelques caractéristiques des réseaux mobiles ad hoc telles que : le mouvement des nœuds et les formations de liens. En terme de tolérance aux fautes, le protocole pr en charge la panne de nœuds et de liens et des partitionnements temporaires du réseau. Le protocole introduit des mécanismes pour permettre la régénération du jeton en cas de perte. Abstract: In this paper, we describe a new token-based mutual exclusion protocol for mobile ad hoc networks. This protocol does neither use the routing layer nor a logical structure and agrees requests based on their distances away to the token and their olds. A request is broadcasted with a dynamical radius calculated so to reach a part of the nodes for which a request is present in the local queue. The protocol traits some characteristics of mobile ad hoc networks: node movements and create of links. Fail of links and nodes may also happen. The protocol supports temporary partitioning of the network and provides mechanisms to support the token loss. Mots-clés : réseau mobile ad hoc, exclusion mutuelle, section critique, jeton. Keywords: mobile ad hoc network, mutual exclusion, critical section, token.. Introduction L exclusion mutuelle (EM) est un problème fondamental dans les systèmes distribués. Ce problème est rencontré lorsqu on es t en présence d un ensemble de processus qui demandent, de façon simultanée, l accès à une même ressource à travers une parcelle de code appelée section critique (SC). Au plus, un processus peut entrer en SC à un moment donné. Toute solution au problème d EM doit garantir deux conditions essentielles : la sûreté impliquant l existence d un processus au plus au niveau de sa SC ; la vivacité, impliquant que pour toute exécution infinie du protocole, chaque processus pourra accéder à sa SC autant de fois qu il le souhaite. Le problème d EM a été largement traité dans les réseaux statiques distribués. Ainsi, plusieurs solutions ont été proposées [], selon deux approches essentielles : l approche à permission et l approche à jeton, dont quelques -unes ont été adaptées pour fonctionner dans les réseaux cellulaires ainsi que dans les réseaux mobiles ad hoc. Dans l approche à jeton, deux méthodes sont couramment utilisées et sont liées à la demande du jeton et à la circulation de jeton. Dans la première méthode, un nœud demandant la SC est amené à avoir le jeton ; le problème de base est comment l atteindre. Dans certains algorithmes, la requête est adressée à tous les nœuds du réseau []; dans d autres, une structure logique est définie pour désigner le détenteur du jeton, par exemple un DAG (Direct Acyclic Graph) []: la requête est envoyée le long d une branche du DAG en direction du nœud détenteur du jeton. Dans [], Ricart et Agrawala proposent un algorithme, sur une topologie complète de réseau, qui requiert au maximum N messages pour réaliser l EM. Suzuki et Kazami [8] proposent un algorithme, basé sur celui de Ricart et Agrawala, dans lequel la file de

LSI-TR-00 requêtes est transportée par le jeton. Singhal [] a amélioré les performances de l algorithme de Suzuki et Kazami jusqu au maximum N messages dans le cas des charges élevées en utilisant une heuristique pour déterminer l ensemble de nœuds qui peuvent posséder le jeton. Dans [], Raymond a développé un algorithme, basé sur une structure d arbre logique dont la racine est le nœud détenteur du jeton, qui requière au maximum O(Log N) messages pour entrer à la SC. Dans [], Chang et al ont développé un algorithme qui remédie aux insuffisances de celui de Raymond notamment par la tolérance aux pannes de liens et de nœuds en maintenant des chemins multiples pour atteindre le jeton. Dans (Dhamdhene et al, 99), Dhamdhene et Kulkarni ont développé un algorithme dont le but est de résoudre le problème du cycle resté encore non résolu dans l algorithme de Chang et al et il est k-résistant, c est à dire tolère k pannes de nœuds/liens. Dans la méthode de circulation de jeton, notons seulement la solution proposée par Le Lann [0]. Dans cette solution tous les nœuds sont logiquement organisés en un anneau unidirectionnel et le jeton circule selon cet anneau. Dans l approche à permission, pour entrer à sa SC, un nœud demandeur doit attre de recevoir les réponses de tous les autres nœuds (ou d un sous- ensemble dans certains algorithmes) du réseau. Dans l algorithme proposé par Lamport [9], quand un nœud veut entrer à sa SC, il envoi une requête à tous les autres nœuds et atts leurs réponses. A la sortie de sa SC, il envoi un message de libération à tous les autres nœuds. Cet algorithme requière (N-) messages par entrée en SC. Dans [], Ricart et Agrawala ont proposé un algorithme qui requière (N-) messages par entrée en SC. Quand un nœud veut entrer à sa SC, il envoi une requête à tous les autres nœuds et att leurs réponses. A la réception de l agrément de tous ces nœuds, il entre à sa SC. Dans [], un processus qui désire entrer en SC, n envoie un message estampillé qu aux processus qui ont accédés à la SC depuis sa dernière demande. Le nombre de messages requis est inférieur ou égal à (N -) Dans (Maekawa 98), Maekawa a développé un algorithme qui requière c( N) messages pour l accès à une CS. L algorithme se base sur les structures de quorums permettant d associer à chaque nœud un ensemble de nœuds desquels seulement la permis sion d accès à la SC est demandée. Les algorithmes initialement prévus pour les réseaux fixes ne peuvent pas s appliquer aux environnements mobiles [], mais en sont en général une adaptation.dans [], B. R. Badrinath et al ont proposé deux algorithmes distribués d EM pour les réseaux cellulaires. Le premier est une adaptation pour les réseaux cellulaires de l algorithme proposé par Lamport [9], le second est une adaptation de l algorithme proposé par Le Lann [0]. Dans [9], J. Walter et S. Kini ont proposé un algorithme distribué d EM pour les réseaux mobiles ad hoc orienté jeton dérivé de plusieurs autres algorithmes : le protocole de routage de Gafni et Bertsekas [8] basé sur un arbre, l algorithme présenté dans [], et d autres idées de [] et []. Cet algorithme défini une structure bâtie sur la topologie réelle du réseau qui est représentée par un DAG de pointeurs orientés jeton, maintenant plusieurs chemins menant vers le détenteur du jeton. Cet algorithme s adapte bien à l environnement mobile ad hoc puisque il requière aux nœuds de maintenir uniquement des informations sur les voisins immédiats. Quand un processus est amené à véhiculer le jeton au prochain, il trouve nécessairement un chemin de retour puisque le non partitionnement n est pas permis. Cela suppose que le chemin vers le détenteur du jeton est toujours entretenu à l avance. Dans [], R. Baldoni et A. Virgillito ont proposé un algorithme utilisant un anneau logique dynamique et combinant la méthode de recherche et celle de circulation de jeton. L algorithme essaye de réduire la consommation d énergie par la réduction du nombre de pas traversés pour l accès à une SC et évite d envoyer des messages de contrôle dans le cas d absence de requêtes. La mobilité est supportée à l aide de l utilisation de la couche de routage, cela permet de sélectionner le nœud le plus proche pour l envoi du jeton. Dans [], N. Malpani et al ont proposé un algorithme orienté jeton, paramétrable et avec plusieurs variantes. Le jeton circule continuellement sur un anneau logique dynamique de taille variable. Toutes les variantes ont le même squelette mais diffèrent sur la politique de sélection du prochain nœud à visiter. Dans cet article, nous proposons un nouveau protocole d EM pour les réseaux mobiles ad hoc basé sur l approche à jeton (qui est d ailleurs la tance actuelle). Le protocole est une version plus complète (i.e. produit des mécanismes pour la régénération du jeton en cas de perte) que celle définie dans []. Le protocole ne repose pas sur le routage, n utilise pas de structure logique de communication et qui, pour la circulation du jeton, privilégie la satisfaction des demandes en fonction d une part de leur ancienneté et d autre part de leur distance par rapport au jeton. Par ailleurs, le protocole proposé pr en charge quelques caractéristiques des réseaux mobiles ad hoc telles que : le mouvement des nœuds (i.e. les cassures et formations de liens) et les pannes de nœuds. Le protocole favorise la scalabilité du réseau et

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc considère un nombre indéterminé de nœuds. Une extension est faite pour permettre la régénération du jeton en cas de perte. Cet article est organisé comme suit : Après un bref aperçu sur quelques travaux antérieurs, dans la section nous présentons les idées de base du protocole, les structures de données et les messages utilisés. Ensuite dans la section, une description du protocole est donnée à travers les différents évènements qui le constituent. La section décrit les mécanismes utilisés pour rechercher et régénérer le jeton. Un simple exemple d exécution suivi d une discussion sur certains aspects cachés du protocole sont donnés dans la section. Et finalement, la section conclue l article.. Préliminaires.. Modèle du réseau Nous supposons un réseau composé d un nombre variable de nœuds mobiles, chaque nœud possède un identificateur unique. Les nœuds utilisent un support de communication sans fil, les liens physiques de communication sont bidirectionnels et fiables. Un nœud peut tomber en panne, quitter ou intégrer le réseau, à tout moment. Les mouvements des nœuds peuvent engrer des créations et / ou des pertes de liens. Cepant, seul le partitionnement bref est toléré. La couche de liaison permet aux nœuds de connaître leurs voisins à tout moment. Dans la suite de l article et afin de décrire notre protocole, nous nous plaçons au niveau du nœud désigné par l indice i... Idées de base du protocole Le protocole utilise l approche à jeton dont l unicité du jeton dans le réseau assure d une manière intrinsèque l EM dans celui-ci. Il combine la circulation et la demande de ce dernier. Le jeton est identifié de manière unique et transporte entre autres une file de requêtes récoltées lors de son parcourt. Le protocole se base sur la connaissance locale, celle du voisinage immédiat et ne pr en considération que les liens physiques pour acheminer de l information. Ce qui lui permet de favoriser la scalabilité du réseau et de considérer un nombre indéterminé de nœuds. D autre part, le protocole fait recours à un certain nombre de mécanismes qui sont :... Rayon de diffusion Puisque la détention du jeton conditionne l accès à la SC, la diffusion d une requête est un des moyens permettant de l acquérir. Afin de minimiser l impact de la diffusion, nous introduisons le concept du rayon de diffusion. Ce rayon est calculé de manière dynamique à partir des requêtes déjà reçues par i. Plus précisément, seuls la date de réception de la requête et le nombre de sauts séparant son émetteur de i servent à calculer ce rayon. Les nœuds se trouvant dans la zone délimitée par ce rayon vont recevoir cette demande. Dans la figure (a), admettons que le nœud désire émettre une requête, il doit donc calculer son rayon de diffusion R. Pour se faire, supposons que sa file Q contient les demandes valides des nœuds,, et avec leurs routes associées. Avec R =, il atteindra tous ces nœuds ou avec R =, il atteindra 0 % de ces nœuds. Cette méthode de calcul du rayon favorise la création d une cascade de chemins vers le détenteur du jeton. Puisque le jeton récolte les requêtes rencontrées sur son chemin, tous ces processus seront éventuellement satisfaits, en regardant la mobilité et les pannes de nœuds.

LSI-TR-00 8 0 9 Figure. (a) Rayon de diffusion (b) Situation de famine... Sélection du nœud privilégié Chaque nœud recevant une demande aura connaissance de l identité de son émetteur, ainsi que la route parcourue et l inscrit dans sa file d attente. Cette file peut être organisée suivant une politique qui privilégie les requêtes les plus proches. Cette politique induit des cas de famine. En effet, dans le cas d un groupe de nœuds proches les uns des autres qui demandent l entrée en SC fréquemment, le jeton ne cessera pas de circuler entre eux, ce qui prive les demandeurs les plus éloignés. Dans la figure (b), admettons que les nœuds, et sont demandeurs de SC, que le nœud est en SC et les nœuds, et demandent continuellement le jeton. En considérant uniquement le nombre de sauts, le jeton sera monopolisé par les nœuds, et et ainsi le nœud sera privé de sa SC. Afin d éviter ce problème, l ancienneté des requêtes est aussi considérée [9]. D où, la priorité d une requête d un nœud j, au niveau du nœud privilégié i est donnée par Pr j = (NS j + nb_hops, j), où nb_hops est le nombre de sauts séparant i de j. Comme la distance qui sépare deux nœuds est bornée, et que les estampilles des nœuds servis augmenteront rapidement, la priorité tournera donc en faveur des nœuds plus éloignés.... Verrouillage du jeton Quand un nœud est sélectionné comme prochain à être servi, le jeton lui est véhiculé sur le chemin enregistré avec la requête. Afin d éviter au jeton de faire éventuellement plusieurs sauts avant d atteindre son destinataire, et en conséquence améliorer le temps d attente d un nœud demandeur, des nœuds intermédiaires demandeurs de SC et se trouvant sur la route du jeton vers le destinataire peuvent être servis, puisque le jeton leur est parvenu mais sans influencer la trajectoire initiale du jeton. Néanmoins, la mobilité des nœuds peut causer des cassures de route ou leur rallonge, le fait que le jeton soit ralenti dans sa route peut créer des cas de famine. Pour remédier à ce problème, la notion de verrouillage du jeton est introduite. Puisqu un nœud demandeur non satisfait au bout d un temps fixé est amené à relancer sa demande un certain nombre de fois, un seuil dit de verrouillage (Lock_limit) est définit. Arrivant à ce seuil, le jeton est verrouillé pour sa destination ce qui implique que les nœuds intermédiaires ne peuvent pas entrer en SC.... Recherche de route Pant la circulation du jeton vers une destination donnée, la route peut être perdue. D où l association d un état au jeton, ONRoute s il suit normalement une route prédéfinie, NORoute dans le cas de perte de route et un nouveau destinataire n est pas encore trouvé. Un nœud i qui reçoit le jeton, s il est demandeur et le jeton lui est destiné ou il est non verrouillé ou avec un état NORoute, entre en SC, sinon son rôle se réduit à router le jeton suivant la route inscrite sur ce dernier. Dans le cas où cette route serait brisée, le nœud i tente de la recalculer d une manière locale, ceci en vérifiant la présence des nœuds suivants le saut brisé dans son voisinage. Si cette opération, échoue le jeton change de destinataire qui sera choisi selon la méthode de sélection du nœud privilégié. En cas d échec, il est envoyé à l un des voisins avec l état NORoute pour la recherche d un destinataire; la conséquence en est éventuellement la non satisfaction de certains nœuds demandeurs, ce problème peut être surmonté par la possibilité de redemande de SC après un délai fixé.... Recherche et régénération du jeton Le soupçon de perte de jeton est déclenché quand un nœud ne le reçoit pas après un nombre limité de tentatives de demande. Au-delà, une recherche dans toute la partition courante s impose. Pour

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc des raisons d optimisation, le message diffusé (i.e. IsThereToken (..)) est à triple objectif : demande de jeton, recherche de jeton et proposition de création de jeton en cas de perte. Sachant que plusieurs nœuds peuvent être en même temps en situation de recherche du jeton, en cas de perte de jeton (ou sa non présence dans la partition courante), un conflit lors de la création se produit. De ce fait, on fait recours à un mécanisme connu dans les protocoles d élection : seul le nœud ayant l identité la plus petite peut le créer... Structures... Structures de base locales à un nœud i. NS i : estampille locale générée par le nœud i - Request_NS i : estampille de la dernière requête, sert à garder la même date (i.e. même priorité) pour plusieurs tentatives de la même requête afin d éviter la famine - State i : (Idle, Requesting, InCS) : état du nœud i - Holder i : indique si le nœud i est détenteur du jeton ou non, initialement pour i=0 Holder i = True, autrement Holder i = False - Last_Holder i : désigne le dernier porteur du jeton - N i : ensemble des voisins de i - R i : rayon de diffusion de i - Nb_attempts i : nombre de tentatives d une même demande de CS - Ignored_Neighbors i : ensemble des voisins ignorés par i, lors de la phase du traitement des cassures de routes, afin d éviter un problème de boucle - Q i : file d attente de i, au format (j, Route j, NS j, Valid j, Nb_attemps j ). Ce format représente la demande d un nœud j, où Route j est une séquence des nœuds intermédiaires entre i et j, NS j est le numéro de séquence de la demande de j, Valid j représente la validité de la requête de j (sert uniquement dans le calcul du rayon de diffusion de i) et Nb_attemps j est le nombre de tentatives associées à cette requête.... Structures liées à la régénération du jeton. Token _ID_NS i : estampille associée au jeton - CandidateID i : identité du nœud candidat à la création d un jeton - Received_NS i : liste contenant les derniers numéros de séquence (NS) des demandes des autres nœuds déjà reçues par i - SearchingToken i : mise à True si le nœud i cherche l existence du jeton dans sa partition, sert à stopper l émission de messages de demande d entrée en SC et ceux de la circulation du jeton - BlockedState i : (Idle, Ask_For_CS, RequestTimer(i), VehiculeToken) : donne le motif de blocage du nœud lors de la recherche du jeton.... Les messages Le message de demande d entrer en SC : Request (i, NS i, R i, Route i, Nb_attempts i, aware i ), où NS i est l estampille de la demande ; R i est le rayon de propagation selon i associé à cette demande ; Route i est la route qui mène à i (elle sera construite au fur et à mesure que la demande de i passe par chaque nœud intermédiaire) ; Nb_attempts i est le nombre de tentatives d accès en SC qu a effectué le nœud i avec le même NS ; aware i est l ensemble des nœuds qui sont au courant de la demande de i le long de la branche de parcours. Cet attribut accompagne tous les messages destinés à la diffusion afin de minimiser le nombre de messages. Le message jeton : Token (Token_idNS, Token_State, Token_Route, Token_Req_Set, Token_NS, Token_Last_Holder, Locked), où Token_idNS est le numéro de séquence du jeton courant ; Token_State est l état du jeton, ONRoute si le jeton suit un chemin déterminé vers une destination donnée, NORoute dans le cas de perte de route ; Token_route est l ensemble des nœuds constituant la route que doit suivre le jeton pour atteindre une destination donnée ; Token_Req_Set est une vue partielle de l ensemble des demandeurs de SC dans la partition ; Token_NS est l ensemble des numéros de séquences de nœuds ; Token_Last_Holder est le dernier nœud porteur du jeton ; Locked indique si le jeton est verrouillé ou non pour un nœud destinataire. Le message de recherche du jeton : IsThereToken(i, Request_NS i, Route i, Nb_attempts i, aware i ), diffusé lorsque le nœud i soupçonne la perte du jeton. i signifie que ce nœud se porte volontaire pour la création d un nouveau jeton. Ce message possède les arguments suivants : Request_NS i représente le NS de la demande en cours (dont le nombre de tentatives a atteint le seuil Request_Threshold) ; Route i est une route qui mène à i ; Nb_attempts i représente le nombre de tentatives liées à cette demande.

LSI-TR-00 Le message de confirmation de l existence du jeton : ThereIsToken(aware i ), réponse au message précédant diffusé par le nœud porteur du jeton. Le message de contrôle : LinkInfo(k, SearchingToken i, [Request_NS i, Nb_attempts i, Route i, aware i ]), émis par le nœud i après la création d un nouveau lien. Ce message est composé des arguments suivants : k est l identité de i si SearchingToken i =faux, autrement celle d un autre nœud. Les autres arguments sont ceux du message IsThereToken si SearchingToken i = Vrai ou de la requête de i si SearchingToken i = Faux.. Description du protocole Le texte du protocole est formé d un ensemble de primitives liées aux différents événements le constituant. Les primitives et les routines du protocole sont décrites à l annexe. Au niveau de chaque nœud, les primitives s exécutent de manière atomique, cepant des événements peuvent se produire durant l exécution de la SC. Quand un nœud i désire accéder à sa SC, il y accède directement dans le cas de détention du jeton. Autrement, il diffuse une requête Request(..), estampillée selon les horloges de Lamport [9], dans son voisinage selon un rayon calculé en fonction des requêtes déjà reçues et dont les routes sont valides (voir l exemple de la figure ). La route d une requête est valide pant un délai ValidTimer à partir du moment de sa réception, en regardant la mobilité des nœuds du réseau. Dans le cas où la file de requêtes Q i serait vide ou toutes les routes des requêtes présentes sont invalides, le rayon est considéré à priori comme infini et c est aux récepteurs de la requête d en définir un selon l état de leurs files. Un délai de garde RequestTimer est associé à chaque requête émise. Au bout de ce délai, si le jeton ne parvient pas à ce nœud demandeur, la requête est relancée mais avec la même estampille pour lui assurer son ancienneté. Dans le cas échéant, ce processus est exécuté un nombre de fois limité (i.e. Request_Threshold) avant de soupçonner la perte du jeton (voir plus loin). Quand une requête d un nœud i est reçue au niveau de j, la fonction AddRequest l insère dans la file Q j si elle n y figure pas. Dans le cas contraire, seuls ses attributs sont met à jour mais à condition que la requête soit plus récente que celle existante ou sa route est meilleure. La structure Received_NS j permet d éviter d insérer une requête qui ne devrait pas l être (cette situation peut se produire dans le cas où la requête qui vient d être reçue a été déjà satisfaite après le dernier passage du jeton au niveau de j). Si le nœud j possède le jeton, alors il met à jour les informations qu il transporte pour y inclure éventuellement cette requête. De plus si le jeton était au repos, alors j le passe au prochain à travers la procédure VehicleToken() selon la stratégie de sélection du nœud privilégié. Dans le cas contraire (i.e. j ne possède pas le jeton, ou bien il le possède mais il est dans sa SC), il examine la possibilité de faire propager la requête à son voisinage non encore visité par la requête (selon la connaissance reçue avec celle-ci). Dans le cas où R j = (infini), un rayon local est calculé, de la même manière que lors de la demande d entrée en SC, suivant le contenu de Q j. Quand un nœud i reçoit le jeton Token(..), il met à jour ses données en l occurrence sa file d attente Q i en supprimant les requêtes déjà satisfaites et en insérant les nouvelles requêtes inscrites dans le jeton et qui ne lui sont pas parvenues, mais sans aucune information sur les routes correspondantes. Puis, le nœud i met à jour le jeton en lui intégrant les requêtes non encore inscrites. Ensuite, si le nœud i est dans un état Idle il réajuste son horloge dans le jeton pour permettre aux autres nœuds de supprimer les anciennes requêtes propres à ce nœud. Maintenant, deux cas se présentent : le jeton est dans l état ONRoute qui veut dire qu il circule normalement sur sa route, si le jeton est destiné à i ou possède l attribut Locked=Faux et i est demandeur alors il entre en SC, sinon il fait passer le jeton au prochain à travers VehicleToken(). L autre cas est que le jeton est dans l état NORoute, le nœud i ajoute l identité du nœud émetteur du jeton dans l ensemble Ignored_Neighbors i (ce qui permet d éviter au jeton de circuler en boucle). Dans ce cas, si i est demandeur il profite de cette situation pour exécuter sa SC, sinon il fait appel à VehicleToken(). Quand la procédure VehicleToken() est invoquée, le jeton doit être acheminé vers un prochain destinataire (sauf si le nœud i est isolé, auquel cas il att la réception de nouvelles requêtes ou s il est bloqué, dans ce cas il att l expiration du délai StabilisationTimer). Deux cas se présentent, soit le

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc jeton suivait une route déjà prédéfinie par un autre nœud et donc le nœud i doit poursuivre l acheminement du jeton sur cette route, soit le nœud i vient de sortir de la SC, et donc il sélectionne le prochain nœud à satisfaire. Dans le premier cas, le jeton est passé au destinataire s il est un voisin sinon il est transmis à un voisin proche du destinataire et figurant dans son chemin. Dans le cas d échec (i.e. perte totale de route), il sélectionne un prochain destinataire, s il y a lieu à partir de sa file Q i, selon la technique de sélection du nœud privilégié. Pour tous les cas précédents, le jeton est transmis avec l état ONRoute. En plus, le jeton est verrouillé s il s agit d un nouveau destinataire dont le nombre de tentatives a atteint le seuil Lock_Limit. Si un échec est observé après toutes ces tentatives, le jeton est affecté de l état NORoute et il est passé à un voisin qui est sélectionné, afin de rechercher un nouveau destinataire, en évitant les boucles. A la sortie d un nœud i de sa SC, il fait passer le jeton au prochain nœud demandeur (VehicleToken()) s il existe et s il n est pas bloqué (auquel cas il att l expiration du délai StabilisationTimer pour faire cette opération). Dans le cas où la file Q i serait vide alors le jeton est gardé au repos. Dès qu un nœud i détecte un nouveau voisin, il lui transmet un message LinkInfo(..) contenant des informations sur son état uniquement dans deux cas : s il est bloqué ou s il demande le jeton. Si le nœud i est bloqué, le message LinkInfo(..) contient les informations du message IsThereToken(..) traversant déjà i ; ceci pour remédier aux cas de déconnexions momentanées : le nœud correspondant peut être détenteur du jeton! Si i n est pas bloqué (i.e. ne recherche pas le jeton) mais demande le jeton, c est les informations de sa propre requête qui sont transmises. Quand un nœud j reçoit un message LinkInfo(..) de la part de i, si SearchingToken j = Vrai, alors j exécute un traitement équivalent à celui lors de la réception du message IsThereToken(..). Par contre si SearchingToken j = Faux, alors j tente d insérer la requête de i dans sa file d attente (i.e. AddRequest). Si l insertion réussit et le nœud j détient le jeton, celui-ci lui sera véhiculé à travers la fonction VehicleToken(). La perte de lien n engre de traitement significatif sauf la mise à jour de l ensemble de voisins.. Recherche et Régénération du jeton Dans le cas où le nombre de tentatives d un nœud i demandeur de jeton atteint sa limite, il commence à soupçonner la non présence de ce dernier (i.e. perte), et change la manière de demander la SC. En effet, aucun rayon de propagation n est calculé, sa demande va être diffusée sur tout le réseau, de plus cette dernière n est plus véhiculée par un message Request(..), mais par un message IsThereToken(..) qui, de part sa sémantique, véhicule : la demande d entrée en SC du nœud i, une recherche du jeton et une proposition de création d un nouveau jeton. Le nœud i se bloque (du point de vue génération de demandes) en attente de la réception d un message de retour ThereIsToken(..) pant une durée de temps limitée (i.e. SuspicionTimer ) au bout de laquelle la création d un nouveau jeton s impose. Si le message IsThereToken(..) rencontre le jeton au niveau d un nœud donné, celui-ci est amené à diffuser dans tout le réseau le message ThereIsToken(..) mais après un délai de stabilisation StabilisationTimer pour éviter le blocage de certains nœuds, après leur déblocage, par des messages IsThereToken(..) non éteints. Si avant la fin du délai SuspicionTimer, le message ThereIsToken(..) est reçu, le nœud i se débloque et continue la propagation de ce message. Par contre, si aucune réponse ThereIsToken(..) ne lui soit parvenue avant l expiration de ce délai, alors puisque sa demande sous-ent aussi une proposition de création d un nouveau jeton, le nœud i, s il est seul à avoir demandé la création d un jeton le crée et le protocole redémarre. En cas de propositions simultanées de création de jetons, seule celle du nœud de plus petit identificateur aboutit (cette méthode est similaire à certains mécanismes d élection), et le jeton créé aura un nouveau numéro de séquence. Quand un nœud j reçoit un message IsThereToken(..), il le traite comme une requête normale. Ensuite s il n est pas porteur du jeton, il le considère aussi comme une exploration pour l élection à la création d un jeton ce qui le mène à participer à cette élection en mettant à jour les variables appropriées, et continue éventuellement la propagation de ce message et se bloque (, en déclenchant son propre timer SuspicionTimer,) s il ne l était pas. Dans le cas où j serait porteur du jeton (i.e. pas de perte), il ne traitera que le premier message reçu. Ce traitement se résume à une attente (i.e. StabilisationTimer ) dans laquelle j s assure que les différentes diffusions simultanées de ce type de message se soient arrêtées 8

LSI-TR-00 (dans cette période d attente, j ne fait pas passer le jeton au prochain ). Ensuite il diffuse le message ThereIsToken(..) dans tout le réseau.. Exemple d exécution et discussion.. Exemple d exécution La figure montre un scénario d exécution du protocole d une manière qui permet de faciliter la présentation. Initialement (fig. (a)), le nœud est porteur du jeton et les nœuds et veulent entrer en SC. On suppose que leurs estampilles respectives sont égales, mais leurs rayons de diffusion respectifs sont R = et R = (on note que la requête du nœud atteint le nœud, donc ce dernier possède une route vers le nœud, mais l autre sens n est pas vérifié. Le nœud n a aucune connaissance de la demande du nœud, (ne possède aucune information sur la route qui mène à ce nœud) (fig. (b)). Puisque les deux requêtes arrivent simultanément avec la même estampille, c est le nombre de sauts qui va déterminer l ordre d entrée en SC. Le nœud étant le plus proche du nœud, ce dernier le choisit comme prochain, et lui passe le jeton (fig. (c)). Entre temps, le nœud sort de la portée du nœud et et entre dans la portée du nœud, tandis que le nœud entre dans la portée du nœud, mais sans sortir de la portée du nœud. Quand le nœud sort de sa SC, il veut faire passer le jeton au nœud, mais la route initialement construite (i.e.,, ) a été brisée, et donc le nœud tente de la recalculer, la nouvelle route (i.e., ) sera obtenue (fig. (d)), et le jeton sera véhiculé via cette route vers le nœud (fig. (e)). Q Q Route Q Route Q Route Q Route Q Route Q Route Q Route (a) (b) (c) (d) (e) (f) (g) : Nœud porteur du jeton : Nœud demandeur du jeton : Nœud en panne (h) (i) (j) Figure. Un simple exemple d exécution. Dans la figure (e) les nœuds, et sont demandeurs de jeton, supposons que R =, R = et R =. Leurs requêtes arrivent au jeton avec les routes respectives et,, et,,. Dans la figure (f), on suppose que le nœud est le prochain destinataire, le jeton lui est véhiculé via le nœud. Arrivant au 9

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc nœud et puisque il est demandeur (admettons que le nœud n a pas atteint le seuil de verrouillage), il profite de l arrivée du jeton et entre à sa SC et à sa sortie il fait passé le jeton à son destinataire déjà prévu (i.e le nœud ). Dans la figure (g), le nœud demande le jeton avec R = par exemple. A sa sortie de la SC, le nœud qui a déjà reçu la requête du nœud avec la route, n arrive pas à lui passer le jeton. Le jeton est donc envoyé au nœud (i.e Last_Holder ) avec l attribut NORoute qui à son tour l envoi au nœud (mais avec l attribut ONRoute) puisqu il a déjà reçu sa demande. Le nœud utilise le jeton pour exécuter sa SC. Dans la figure (h), le nœud est isolé temporairement ; à sa sortie de la SC, il garde le jeton à son niveau. Admettons que le nœud a atteint son seuil de redemande, donc il diffuse un message IsThereToken(..) qui sera reçu par les nœuds et. Entre-temps (fig. (i)), un lien est crée entre le nœud et, seul le nœud (SearchingToken =Vrai) envoi le message LinkInfo(..) au nœud ; ce dernier va donc constater la recherche du jeton. Après un délai de stabilisation StabilisationTimer, celui-ci envoi un message ThereIsToken(..) à tous les nœuds, afin de débloquer ceux qui étaient bloqués. Le nœud réémet sa demande après le délai RequestTimer déclenché lors de son déblocage ; Ainsi le jeton lui sera envoyé. Dans la figure (i), un partitionnement temporaire a eu lieu. Le nœud et le nœud, après plusieurs tentatives de demande, soupçonnent la perte du jeton. Dans la figure (j), les deux nœuds diffusent un message IsThereToken..() à tous les nœuds du réseau mais sans réponse puisque le nœud qui détient le jeton est tombé en panne. Au bout du délai SuspicionTimer au niveau du nœud (et puisque le message de recherche du jeton sous-ent aussi une proposition de création d un jeton), seule sa proposition aboutit (mécanisme d élection), donc le nœud crée le jeton. Tous les autres nœuds du réseau sont amenés à mettre à jour les informations sur le nouveau jeton suite à l expiration de leur même délai déclenché lors de la réception du message de recherche du jeton... Discussion Quelle est l utilité de la structure Received_NS i? Quand un nœud i sélectionne son prochain pour recevoir le jeton, celui-ci est supprimé de sa file de requêtes. Lors de la réception d une même requête de ce même nœud, il l insère dans sa file automatiquement sans savoir si elle est ancienne ; ceci peut engrer l envoi non nécessaire du jeton. D où l utilisation de la structure Received_NS j pour purger les requêtes tardives. Quelle est l utilité de l ensemble IgnoredNeighbors? Soit l exemple de la figure (a) : Le destinataire du jeton est le nœud avec le chemin. Arrivant au nœud, dans la figure (b), le lien avec le nœud est rompu. Le nœud ne peut plus router le jeton vers son destinataire. Supposons aussi qu il ne trouve pas de nouveau destinataire (i.e. file vide), il décide donc de le redonner à Last_Holder qui est, reçoit le jeton avec Token_State égal à NORoute, alors il choisit un nouveau destinataire qui est le nœud à partir de sa file Q. Il renvoi donc le jeton au nœud (qui est sur la route du nouveau destinataire) avec Token_State égal à ONRoute, ce qui implique que devient Last_Holder. n ayant toujours pas de route valide remet le jeton à, ainsi la boucle est formée et le jeton bouclera entre et. Donc, dès que r le jeton à, ce dernier met dans l ensemble IgnoredNeighbors i et devra choisir une autre destination. Q Route a Q Route (a) (b) Figure. Circulation en boucle du jeton. Pourquoi le détenteur du jeton att-il un moment avant de diffuser le message ThereIsToken? Le nœud possédant le jeton qui reçoit un message IsThereToken, s il réagit immédiatement et diffuse le message ThereIsToken, un nœud recevant ce message se débloque, mais si ce dernier nœud reçoit un 0

LSI-TR-00 autre message IsThereToken, peut se bloquer inutilement dans le cas où ce message n atteindrait pas le porteur. Pourquoi le message LinkInfo transporte-il dans certains cas les informations d un message IsThereToken? A partir du principe que les messages du type IsThereToken doivent être propagés dans tout le réseau, ce lien qui vient de se former avec un nœud peut être la seule liaison avec une partition et le reste du réseau, et donc nous assurons cette propagation en véhiculant dans le message LinkInfo les informations correspondantes à IsThereToken.. Conclusion Dans cet article, nous avons présenté une solution au problème d EM dans les réseaux mobiles ad hoc. Le protocole présenté se base sur les liens physiques, n utilise aucune structure logique. Les requêtes sont acheminées suivant un rayon dynamique de diffusion déterminé selon la connaissance locale afin de couvrir une proportion de nœuds demandeurs. Le jeton est géré selon une méthode qui combine la circulation et la demande. De plus, la politique de satisfaction des nœuds favorise en même temps les nœuds les plus proches et les requêtes les plus anciennes. La mobilité des nœuds (i.e. changement de liens) fait partie intégrante de la solution proposée grâce aux différents mécanismes présentés dans ce qui précédait. Aussi, le protocole pr en charge les pannes de nœuds, et propose des mécanismes pour la recherche et la régénération du jeton en cas de perte. Cepant, il ne tolère que des partitionnements temporaires. La comparaison de performances avec d autres protocoles nécessite un calcul de complexité qui est pratiquement délicat à réaliser (sans simulation) vu que le rayon de diffusion est dynamique (dépant de la charge de demande dans le réseau et du facteur temps). Remerciement Nous tenons à remercier Monsieur A. Lahmar pour sa collaboration quant à la réalisation de ce travail. Bibliographie [] Badrinath B. R., Acharya A., and Imielinski T., Structuring distributed algorithms for mobile hosts, Proc. of the th Intern. Conf. on Distr. Comp., p. 8, 99. [] Baldoni R., Virgillito A., Petrassi R., A distributed mutual exclusion algorithm for mobile ad-hoc networks, Proc. of the Seventh Inter. Symposium on Computers and Communications, p. 9 -, - July 00. [] Benchaïba M., Bouabdallah A., Badache N., Ahmed-Nacer M., Distributed mutual exclusion algorithms in mobile ad hoc networks : an overview, ACM SIGOPS Operating Systems Review, Vol. 8, Issue, p. 89, Jan. 00. [] Benchaïba M., Haddad M., Ahmed-Nacer M., Vers une solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc, A paraître dans les actes du colloque Gres 0 Bordeaux France, 9- Mai 00. [] Carvalho O., Roucairol G., On mutual exclusion in computer networks, Com. of the ACM, Vol., N, p. -, Feb. 98. [] Chang Y., Singhal M., and Liu M., A fault tolerant algorithm for distributed mutual exclusion, In Proc. of 9 th IEEE Symposium On Reliable Dist. Systems, p. -, 990. [] Dhamdhere D. M. and Kulkarni S. S., A token based k-resilient mutual exclusion algorithm for distributed systems, Information Processing Letters, vol. 0 N, p. -, 99. [8] Gafni E. and Bertsekas D., Distributed algorithms for generating loop-free routes in networks with frequently changing topology, IEEE Transactions on Communications, C - 9(), p. 8, 98. [9] Lamport L., Time, clocks, and the ordering of events in a distributed system, Communications of the ACM, Vol., N, p. 8 -, July 98. [0] Le Lann G., Distributed systems, towards a formal approach, IFIP Congress, Toronto, p. - 0, 9. [] Maekawa M., A N algorithm for mutual exclusion in decentralized systems, ACM Trans. on Comp. Systems, Vol., N, p. -9, May 98. [] Malpani N., Chen Yu, Vaidya N. H., Welch J. L., Distributed token circulation in mobile ad hoc networks, IEEE Transactions on Mobile Computing, Volume, Issue, p. -, March-April 00.

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc [] Raymond K., A tree-based algorithm for distributed mutual exclusion, ACM Transactions on Computer Systems, Vol. N, p. -, Feb. 989. [] Ricart G. and AgrawalaA. K., An optimal algorithm for mutual exclusion in computer networks, Comm. of the ACM, Vol., N, p. 9 -, Jan. 98. [] Ricart G., Agrawala A. K., Author response to on mutual exclusion in computer networks, by Carvalho and Roucairol, Communication of the ACM, vol., N, p.-8, Feb. 98. [] Singhal M., A heuristically-aided algorithm for mutual exclusion in distributed systems, IEEE Trans. On Computers, Vol. 8, N, p. -, May 989. [] Singhal M., A taxonomy of distributed mutual exclusion, Journal of Parallel and Distributed Computing, Vol. 8, N, pp. 9-0, 99. [8] Suzuki I., Kazami T., A distributed mutual exclusion algorithm, ACM Transactions Computer Systems, Vol., N, p. - 9, 98. [9] Walter J., Welch J., Vaidya N., Mutual Exclusion Algorithm for Ad Hoc Mobile Networks, Wireless Net., Vol. 9, No., p.8-00, Nov. 00.

LSI-TR-00 Annexe : Primitives et routines du protocole d exclusion mutuelle ########### Initialisation Init_node() if (i = 0) then { Holder i := True; Token_State := ONRoute; Token_Route := {}; Token_Req_Set := {}; Token_NS := {}; Token_Last_Holder := 0; Token_Locked := False; Token_idNS := 0; } else { Holder i := False; ; NS i := 0; Request_NS i := 0; State i := Idle; Nb_attempts i :=0; Last_Holder i := -; R i := -; N i := {}; Q i := {}; CandidateID i := 0; Token_ID_NS i := 0; Ignored_Neighbors i := {}; SearchingToken i := False; Received_NS i := {}; aware i := {}; BlockedState i := Idle; Les primitives: ########### Demander l'accès à la SC Event Ask_For_CS if (!SearchingToken i ) then { State i := Requesting; NS i := NS i + ; Request_NS i := NS i ; Nb_attempts i := ; if (Holder i ) then { Enter_CS( ) ; /* le jeton est au repos */ } else { /* calculer le rayon de diffusion */ R i := Calculate_Radius( );Route i := i; aware i := N i i; for each (j N i ) do { s Request(i, NS i, Route i, R i, Nb_attempts i, aware i ) to j; }done ; Set (RequestTimer i ); /* Déclencher timer demande de i */ } else { BlockedState i := Ask_For_CS; /* sauvegarder l état pour le déblocage*/ ########## Recevoir une requête Event Receive_Request: Request(j, NS j, Route j, R j, Nb_attempts j, aware j ) bool insert := False; insert := AddRequest(j, NS j, Route j, Nb_attempts j );/* insérer dans la file */ if (insert) then { NS i := max(ns i, NS j ); if (Holder i ) then { /* l inscrire dans le jeton */ Token_Req_Set := Token_Req_Set j; Token_NS := Token_NS + new_element(j); Token_NS(j) := NS j ; ; if ((!Holder i ) or (Holder i and State i = InCS)) then { if (R j = -) then {R j := Calculate_Radius( ); /* rayon indefini */ } else { R j := R j -; ; if (R j > 0) then { Route j := Route j i; /* suivre la diffusion de la requête de j */ for each (k (N i - aware j )) do {s Request(j, NS j, Route j, Nb_attemps j, Ni aware j ) to k; }done

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc } else { VehicleToken();/* passer le jeton au prochain */ ########### Recevoir le jeton Event Receive_Token : Token(Token_idNS, Token_State, Token_Route, Token_Req_Set, Token_NS, Token_Last_Holder, Token_Locked) if (Token_idNS = Token_ID_NS i ) then { Holder i := True; UpdateQueues(); /* maj files */ NS i := max(ns i, max(token_ns)); if(state i = Idle) then { Token_NS(i) := NS i + ; if (SearchingToken i ) then { Desactivate(SuspicionTimer i ); Set(StabilisationTimer i ) ; ; if (Token_State = ONRoute) then { /* le jeton est sur la route */ Last_Holder i := Token_Last_Holder; Ignored_Neighbors i := {}; Token_Last_Holder := i; if ( (State i = Requesting) and [(last(token_route) = i) or (!Token_Locked)]) then { if (last(token_route) = i) then { Token_Route := {}; ; Enter_CS( ); /* entrer en SC */ } else { VehicleToken( ); } else { /* Token_State = NORoute */ Ignored_Neighbors i := Ignored_Neighbors i Token_Last_Holder; Token_Last_Holder := i; if (State i = Requesting) then { Enter_CS( ); } else { VehicleToken( ); ########### Quitter la SC Event Leave_CS State i := Idle; if (Holder i ) then { Token_Req_Set := Token_Req_Set - i; Token_NS(i) := NS i + ; if (!Empty(Q i )) then { VehicleToken( ); ########### Fin de ValidTimer Event End_Timer ValidTimer i (j) Q i (j).valid := False; ########### Fin de RequestTimer Event End_Timer RequestTimer(i) if (!SearchingToken i ) then { Nb_attempts i := Nb_attempts i + ; aware i := N i i; if (Nb_attempts i modulo Request_Threshold) then { R i := Calculate_Radius( ); Route i := i; for each (j N i ) do { s Request(i, Request_NS i, Route i, R i, Nb_attempts i, aware i ) to j; }done; Set(RequestTimer i ); } else { SearchingToken i := True; Route i := i; CandidateID i :=i; for each (j N i ) do { s IsThereToken(i, Request_NS i, Route i,

LSI-TR-00 Nb_attempts i, aware i ) to j; }done; Set (SuspicionTimer i ); } else { BlockedState i := RequestTimer; ########### Recevoir IsThereToken Event Receive IsThereToken(j, Request_NS j, Route j, Nb_attempts j, aware j ) bool insert := False; insert := AddRequest(j, Request_NS j, Route j, Nb_attempts j ); if (insert) then { if (!Holder i ) then { Route j := Route j i; if (!SearchingToken i or (SearchingToken i )and( i> j)) then { if (!SearchingToken i ) then {SearchingToken i := True; Set (SuspicionTimer i ); ; CandidateID i := j ; for each (k (N i - aware j )) do { //continuer la propagation s IsThereToken(j, Request_NS j, Route j, Nb_attempts j, aware j N i ) to k; }done } _if } else { /* Holder i = True */ if (!SearchingToken i ) then { SearchingToken i := True; Set(StabilisationTimer); ########### Fin de SuspicionTimer Event End_Timer SuspicionTimer SearchingToken i := False; Q i := {}; Token_ID_NS i := Token_ID_NS i +; /* estampille du nouveau jeton connue de tous les nœuds */ if (CandidateTokenID i!= i) then { if (!(Nb_attempts i modulo Request_Threshold)) then { Set(RequestTimer i ); } else { CreateToken(); Holder i := True; EnterCS; //créer le jeton ; NB_attemps i := ; OnStopSearchingToken(); ########### Lien rompu Event Link_Down( i, j) N i := N i - j; ########### Lien établi Event Link_Up( j) N i := N i j; if (SearchingToken i ) then { aware i := N i i; if (i = CandidateID i ) then { ns := Request_NS i ; route := i; attempts := Nb_attempts i ; } else { k := CandidateTokenID i ; ns := Q i (k).ns; route := Q i (k).route; attempts := Q i (k).nb_attempts; } _if; s Link_Info(CandidateID i, SearchingToken i, ns, route, attempts, aware i ) to j;

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc } else { if (State i =requesting) then { s Link_Info(i, SearchingToken i, Request_NS i, i, Nb_attempts i, {}) to j ########### Fin de StabilisationTimer Event End_Timer StabilisationTimer SearchingToken i := False; for each (j N i ) do { s ThereIsToken(N i i) to j; }done OnStopSearchingToken(); ########### Recevoir ThereIsToken Event Receive ThereIsToken(aware j ) if (SearchingToken i ) then { SearchingToken i := False; Desactivate(SuspicionTimer); OnStopSearchingToken(); for each (j (N i - aware j )) do { s ThereIsToken (aware j N i ) to j; }done #### Recevoir Link_info Event Receive Link_Info(m, SearchingToken j, ns j, route j, NB_attempts j, aware j ) bool insert := False; insert := AddRequest(m, ns j, route j, Nb_attempts j ); if ( SearchingToken j ) then { if (insert) then { if (!Holder i ) then { Route j := Route j i; if (!SearchingToken i or (SearchingToken i and CandidateID i >m)) then{ if (!SearchingToken i ) then { SearchingToken i := True; Set (SuspicionTimer); } _if; CandidateID i := m: for each (k (N i - aware j )) do { s IsThereToken(m, ns j, route j, Nb_attempts j, aware j N i ) to k; }done } _if } else { /* Holder i = True */ if (!SearchingToken i ) then { SearchingToken i := True; Set(StabilisationTimer); } else { if (insert) then { NS i := max(ns i, ns j ); if (Holder i ) then { /* l inscrire dans le jeton */ Token_Req_Set := Token_Req_Set j; Token_NS := Token_NS + new_element(j); Token_NS(j) := ns j ; if ( State i!= InCS)) then {VehicleToken } _if Les méthodes et procédures: ####################### Calculer rayon integer Calculate_Radius( )

LSI-TR-00 list local_list := {}; integer R := -, pos; function Nb_Hops, Nb_elements; /* Supposés définies for each (j Q i ) do { if (Q i (j).valid) then { //insertion avec tri ocal_list := inset(local_list, Nb_Hops(Q i (j).route)); }done; if(!empty(local_list)) then { pos := round(p * Nb_elements(local_list)); R := local_list[pos]; }enf_if; return R; ####################### Entrer en SC Enter_CS( ) State i := InCS; Desactivate(RequestTimer); NB_attemps i := ; End ####################### Donner jeton au prochain VehicleToken( ) bool neighbor := False, Retreived := False, break := False; integer dest := -; if (!SearchingToken i ) then { if (!Empty(Token_Route)) then { /* faire suivre le jeton sur sa route */ if (Last(Token_Route) Ni) then { neighbor := True; Token_Route := Last(Token_Route); } else { Token_Route := Token_Route - i; neighbor := First(Token_Route) N i ; if (!neighbor) then { Retreived := Retreive_Route(Token_Route); } _if; if(neighbor or (!neighbor and Retreived)) then { Holder i := False; s Token(Token_idNS i, Token_State, Token_Route, Token_Req_Set, Token_NS, Token_Last_Holder, Token_Locked) to First(Token_Route); }enf_if ; if (Holder i ) then { /* choisir un autre nœud destinataire*/ for each (j Q i ) do { if (j N i ) then { Q i (j).route := j; Q i (j).valid := True; Set(ValidTimer(j)); }done; Sort(Q i ); for each ((j Q i ) and!break) do { neighbor := First((Q i (j).route (N i Ignored_Neighbors i )); if (!neighbor) then { Retreived := Retreive_Route(Q i (j).route); } _if; if (neighbor or(!neighbor and Retreived)) then { Token_Route := Q i (j).route; Token_State := ONRoute; Token_Last_Holder := i; if (Q i (j).nb_attempts > Lock_Limit) then { Token_Locked := True; } else { Token_Locked := False; ; Holder i := False; s Token( Token_idNS i, Token_State, Token_Route, Token_Req_Set, Token_NS, Token_Last_Holder, Token_Locked) to First(Q i (j).route);

Une approche de solution au problème d exclusion mutuelle dans les réseaux mobiles ad hoc break := True; }enf_if }done ; if (Holder i ) then { /* le jeton va être routé avec NORoute pour rechercher un nouveau destinataire*/ if (Last_Holder i N i ) then { dest := Last_Holder i ; Last_Holder i := -; } else if (Empty(N i - Ignored_Neighbors i )) then { Ignored_Neighbors i := {}; ; dest := k (N i - Ignored_Neighbors i ) / NS of k is MAX ; Token_State := NORoute; Token_Route := {}; Token_Locked := False; if (dest!= -) then { s Token(Token_idNS i, Token_State, Token_Route, Token_Req_Set, Token_NS, Token_Last_Holder, Token_Locked) to dest; } else { BlockedState i := VehiculeToken; ####################### Récupérer route bool Retreive_Route(Route) /* l'argument Route est entré par adresse */ set_j := {}; bool break := False; for each ((j := Last(Route); j!= First(Route); j := Previous(j, Route)) and!break) do { if (j (N i - Last(Ignored_Neighbors i ))) then { set_j := set_j + j; Route := Reverse( set_j ); break := True; } else { set_j := set_j + j; }done; return break; ####################### Ajouter demande bool AddRequest(j, NS j, Route j, Nb_attempts j ) bool insert := False; if (j Q i ) then { if ((NS j > Q i (j).ns) or [(NS j = Q i (j).ns) and (Nb_attempts j > Q i (j).nb_attempts )]) then { Q i (j).ns := NS j ; Q i (j).nb_attempts := Nb_attempts j ; Q i (j).route := Route j ; Q i (j).valid := True; Set(ValidTimer(j)); insert = True; Sort(Q i ); } else {if ((NS j = Q i.(j).ns) and (Nb_attempts j = Q i (j).nb_attempts)) then { if (Nb_Hops(Route j ) < Nb_Hops(Q i (j))) then { Q i (j).route := Route j ; Q i (j).valid := True; Set(ValidTimer(j)); Sort(Q i ); insert := True; } else { if (j Received_NS i ) then { if (Received_NS i (j) < NS j ) then { Received_NS i (j) := NS j ; CreateNewElement(j, Route j, NS j, True, Nb_attempts j ); Set(ValidTimer(j)); insert := True; Sort(Q i ); } _if 8

LSI-TR-00 }else { Received_NS i := Received_NS i + new_elementns (j); Received_NS i (j) := NS j : CreateNewElement(j, Route j, NS j, True, Nb_attempts j ); Set(ValidTimer(j)); insert := True; Sort(Q i ); ; return insert; ####################### UpdateQeueus UpdateQueues() for each (j Q i ) do { if (Exists(Token_NS(j)) then { if (Q i (j).ns < Token_NS(j)) then { /* maj de Qi */ Delete(Q i (j)); Desactivate(ValidTimer(j)); } else { /* (Q i (j).ns >= Token_NS(j)) donc maj jeton */ Token_Req_Set := Token_Req_Set j; Token_NS(j) := Q i (j).ns; } _if } else {Token_NS := Token_NS + new_element(j); Token_NS(j):= Q i (j).ns; } _if }done; for each (j Token_Req_Set) do { /* maj de Qi */ if (j Q i (j)) then { AddRequest(j, Token_NS(j),NULL, ); }done ####################### CreateToken( ) CreateToken() Begin Token_State := ONRoute; Token_Route := {}; Token_Req_Set := {}; Token_NS := {}; Token_Last_Holder := 0; Token_Locked := False End ####################### OnStopSearchingToken( ) OnStopSearchingToken(); Begin Case ( BlockedState i ) of { Ask_For_CS : Ask_For_CS(); break; RequestTimer : RequestTimer(i); break; VehiculeToken : VehiculeToken(); break; } _case; BlockedState i := Idle; End 9