M4102C - Algorithmique distribuée TD2 Asynchrone ? Probabiliste ? Atomique ? Complément de cours (synchrone versus asynchrone) 1. On parle de réseau synchrone (ou d’exécution synchrone) si les messages mettent un temps borné à être transmis. On peut donc découper l’exécution en périodes égales, appelées rondes, telles qu’à chaque ronde, les nœuds reçoivent les messages envoyés à la ronde précédente, et en envoient potentiellement de nouveaux (qui seront reçus à la ronde suivante, etc.). Cette propriété permet de faire des hypothèses très utiles, comme par exemple, la semaine dernière, supposer qu’une ronde après être entré dans l’arbre, un nœud connait ses enfants. 2. On parle de réseau asynchrone (ou d’exécution asynchrone) si un message peut prendre un temps arbitraire à être transmis, en supposant toutefois qu’il finira nécessairement par arriver (on parle de temps fini). Notez la différence entre temps fini et temps borné. Pour un temps fini, on sait juste que ça arrivera un jour ou l’autre (on ne sait pas quand), alors que dans le second on sait que ça arrivera avant une certaine date. Certains algorithmes ne fonctionnent que dans les réseaux synchrones. D’autres marchent dans les deux cas, mais parfois avec des performances différentes. En général, on étudie d’abord un problème sous l’angle synchrone, plus facile pour réfléchir, puis on adapte. 1 Diffusion dans une grille On considère que le réseau est une grille carrée qui comporte n nœuds (voir dessin, pour n = 25). Chaque nœud peut identifier localement la direction de ses liens (nord, sud, est, ouest) et utiliser les primitives correspondantes sendN(), sendS(), sendE(), sendW(). On considère un processus de diffusion à partir du sommet le plus en haut à gauche. E N E E W S N E N E E N W W S E E E N W E E E N W E E S N W S S N W S S N W S N W S E N W S W S N W S N W S E N E W S N W S N W S E N E W S N W S N E W S N W S 1. Combien de messages seront échangés si l’on utilise l’algorithme de diffusion basique vu la semaine dernière ? (“La première fois que je reçois le message (ou si je l’ai initialement), je le retransmets à tous mes voisins avec sendAll().”) Le fait que le réseau soit synchrone ou asynchrone a-t-il un impact sur ce nombre ? Si oui, lequel ? 2. On suppose maintenant que hormis le nœud initial, les nœuds ne connaissent ni leur position dans la grille, ni la liste de leurs voisins, ni la provenance d’un message. Écrivez un algorithme qui tient compte de la topologie en grille. Combien de messages sont maintenant envoyés ? (les messages envoyés à des voisins qui n’existent pas comptent aussi.) 3. On suppose maintenant que les nœuds peuvent connaître la provenance d’un message msg en utilisant msg.getOrigin() dont la réponse est parmi {N,S,E,W} et qu’ils peuvent tester s’ils ont un voisin dans une direction donnée (ex : hasNeighbor(N) ?). Donner un algorithme qui utilise ces informations pour n’envoyer que n − 1 messages. Peut-on espérer faire mieux ? Et dans une autre topologie que la grille, peut-on faire mieux ? 2 Élection 2.1 Borne inférieure ? Un collègue m’assure que dans les topologies arbitraires, aucun algorithme ne peut garantir une élection en utilisant moins de m messages (où m est le nombre d’arêtes). Il dit que cela est vrai quel que soit les hypothèses (anonyme ou avec identifiants, synchrone ou asynchrone, etc.). A-t-il raison ? Si oui pourquoi ? Si non quelle idée serait moins coûteuse ? 2.2 Élection dans les arbres On suppose maintenant que le réseau est un arbre et que chaque nœud connait la liste de ses voisins. Les nœuds ont également des identifiants uniques. Proposez un algorithme d’élection qui marche aussi bien en synchrone qu’en asynchrone. Combien de messages utilisez-vous ? 2.3 Élection probabiliste On considère l’algorithme d’élection probabiliste suivant dans un graphe complet, avec exécution synchrone. Initialement tous les sommets sont candidats. A chaque ronde, les sommets candidats tirent à pile ou face. Ceux qui tirent pile envoient un message à tout le monde. Les autres décident de ne plus être candidats. L’algorithme s’arrête quand il y a strictement moins de deux messages échangés (ce qui peut être détecté par tous les nœuds). À ce moment là, si un seul nœud est candidat, il est élu et l’algorithme a réussi. Sinon l’algorithme échoue. 1. 2. 3. 4. 3 Le temps d’exécution est-il borné ? est-il fini ? y a-t-il un risque qu’il soit infini ? Combien de temps cela prend-t-il en moyenne (donnez juste l’ordre de grandeur) ? Quel est la probabilité de succès si n = 2, si n = 3 ? Que proposez-vous en cas d’échec ? Interactions atomiques On considère un modèle plus abstrait (donc plus simple) que les messages, qui sera l’objet du TP d’aujourd’hui. Ici on néglige la façon dont les nœuds communiquent réellement, pour mieux Page 2 se concentrer sur le principe général des algorithmes. Un algorithme se définit donc par des règles d’interaction, qui spécifient directement comment l’état des nœuds doivent se transformer au cours du temps. Par exemple, la règle r1 ci-dessous nous dit que si un nœud gris interagit avec un voisin blanc (partie gauche), alors ce voisin devient gris lui-aussi et le lien devient épais et orienté (partie droite). On ne considère aucun message ici, chaque interaction étant atomique. → r1 : 1. Éxecutez cet algorithme sur le graphe ci-dessous, en répétant la règle r1 jusqu’à ce que vous ne puissiez plus le faire. Vous pouvez choisir arbitrairement les endroits où vous le faites. 2. Que fait cet algorithme ? 3. On considère maintenant une règle r2 plus complexe. Les accolades indiquent les exceptions où la règle ne doit pas être appliquée. En l’occurrence, la règle dit que si un nœud u est gris et a un parent gris, alors il prend un troisième couleur (gris avec une croix, que l’on conside comme différente du gris). Les exceptions nous disent de faire cela seulement si u n’a pas de voisin blanc et n’a pas non plus d’enfant gris. r2 : { } → → Exécutez cette règle par dessus le résultat obtenu à la question 1, en répétant la règle jusqu’à ce que vous ne puissiez plus le faire. 4. Que fait cette règle ? Page 3