Simulation d'algorithmes distribués Guide Utilisateur Sommaire Section 1 3 Introduction Section 2 Construction de graphes 4 La grammaire de graphe 6 Création du fichier XML 7 Exemples Section 3 Ecrire des algorithmes 8 Les classes java à implémenter 9 Exemples Section 4 Organiser des simulations 12 SAD en un coup d'oeil 13 Chargement d'un graphe et la trace 13 Manipulation du graphe 14 Autorun & gestion manuelle d'une simulation 15 Affichage des données d'un noeud ou d'un lien 16 Activation/désactivation d'un noeud ou d'un lien 17 A propos du scheduler Section 5 A propos 3 Configuration minimale 3 Utilisation 2 Section 1 SAD Introduction SAD ou Simulation d'Algorithmes distribués est un logiciel opensource graphique utilisé pour exécuter des simulations d'algorithmes distribués. En offrant la puissance de la bibliothèque Java Jung (http://jung.sourceforge.net) dans une interface graphique efficace, le comportement des algorithmes est visualisé à l'utilisateur. Nécessitant des algorithmes écrits en Java, SAD est dirigé vers un public de développeurs et d'enseignants. Configuration Minimale La configuration minimale requise pour exécuter SAD est un ordinateur capable d'exécuter Java Runtime Environment et un IDE Java (Netbeans est fortement recommandé). Tout système d'exploitation pris en charge par Java peut faire tourner SAD. Utilisation La simulation se décompose en trois parties : -création des algorithmes répartis en implémentant les classes java fournies -création du fichier de configuration du graphe et sa transformation au format XML -chargement du fichier XML dans le logiciel et simulation 3 Section 2 Construction de graphes La grammaire de graphe La construction de graphe est réalisé avec une grammaire de nœud et de lien. Il ya deux étapes menant à la construction d'un graphe, chacunes utilisant un vocabulaire spécifique. IMPORTANT :les noms de classe et de noeud ne peuvent pas commencer par un chiffre Etape 1: Ouvrer votre éditeur favori et créer un nouveau fichier Etape 2 : Création de chaque programme associé à son algorithme Syntaxe : id_prog = prog(Class) • id_prog : id de l'algorithme (DOIT ETRE UNIQUE) • prog() : déclaration de l'algorithme • Class : nom de la classe java Etape 3 : Création de chaque noeud associé à son programme Syntaxe : node_name = node(id_prog(param)) • node_name : le nom du noeud (DOIT ETRE UNIQUE) • node() : déclaration du noeud • id_prog() : id du programme associé au noeud param : les paramètres utilisés pour instantier la classe java 4 Tous les paramètres possibles et leur type: "toto" : string 42 : int (int)42 : int (long)42 : long (short)42 : short (byte)42 : byte 42.0 : float (float)42.0 : float (double)42.0 : double true : boolean false : boolean 'r' : char '\u0066' : char Class1("params") : Class1 object (string)null : null (type String) (Class1)null : null (type Class1) Etape 4 : Liaison des noeuds IMPORTANT : un lien entre deux noeuds requiert l'existence des deux noeuds Syntaxe : edge(node1,node2) créer un lien orienté de node1 vers node2 edge(node2,node1) est nécessaire pour que node2 envoi des messages vers node1 5 Etape 5 : Ajout des classes java utilisées comme algorithmes Deux choix possibles : Créer un arbre jar DANS le fichier du graphe Syntaxe : jar ("../path/to/jar/fileJar.jar", jar ("path", jar ( "path", id_prog=prog(Class1) ) ), jar (... ) ) Ou/Et ajouter l'option -classpath au lancement de l'application exemple : java MyApps.jar -classpath "../path/to/jar/fileJar.jar" IMPORTANT : - les jar() doivent contenir 1 et 1 seule chaine pour le path - les jar() peuvent contenir d'autres jar() - Les identifiants de programme peuvent avoir le même nom que la classe - L'arbre de jars doit avoir des id_prog pour feuilles 6 Exemple jar("path/to/jar/fichierJar1.jar", jar("path/to/jar/fichierJar2.jar", Prog_id1=prog(Prog1))) Prog_id2=prog(Prog2) node1=node(Prog_id1("foo", "bar")) node2=node(Prog_id2(Class1((double)2.0, 42, (short)42))) edge(node1, node2) Création du fichier XML Une fois le fichier créé, il doit être traité par l'analyseur OCAML ./parser input_file output_file.xml 7 Section 3 Ecrire des algorithmes Les classes java à implémenter Écrire un algorithme nécessite d'implémenter la classe abstraite NodeGUI pour l'algorithme etMessageGUI pour les messages entre les nœuds. implémentation de das.engine.gui.NodeGUI • NodeGUI contient deux méthodes abstraites qui doivent implémenter afin d'obtenir des informations sur les nœuds. java.lang.String[] être variableName() retourne un tableau contenant le titre de toutes les variables faisant parties du protocole qui doivent être affichées. java.lang.Object[] variableValue() retourne un tableau contenant les nom des variables internes devant être affichées void loopit() contient l'algorithme lui-même java.awt.Color String • String getColor() retourne la couleur du noeud toString() doit être redéfini implémentation de das.engine.gui.MessageGUI toString() doit être redéfini java.awt.Color 8 getColor() retourne la couleur du message Exemple : Election de leader dans un anneau Algorithme : Les nœuds sont liés dans une topologie en anneau et sont chacun affecté un numéro unique. Chaque nœud envoie son numéro vers le nœud suivant. Si le nombre est plus grand que ceux déjà reçus par le nœud ainsi que son numéro, le nœud envoie ce nombre au prochain noeud dans le graphe. Sinon, le noeud ne fait rien. Quand un nœud reçoit son propre numéro, il est le leader. La classe MyNodeGUI.java implémentant NodeGUI package test; import das.engine.gui.MessageGUI; import das.engine.gui.NodeGUI; public class MyNodeGUI extends NodeGUI { //the inner variables that can be displayed private boolean firsttime = true; private int localid; private int curentmax; private static String varname[] = {"never started", "id", "curent max"}; public TestNodeGui(int localid) { this.localid = localid; curentmax = localid; } //array with the variable names @Override public String[] variableName() { return varname; } //array with the inner variables @Override public Object[] variableValue() { Object tab[] = new Object[3]; tab[0] = firsttime; tab[1] = localid; tab[2] = curentmax; return tab; } 9 //the algorithm @Override public void loopit() { if (firsttime) {//if first awakening firsttime = false; setAntiScrutening(true);//polling mode sendAll(new TestMessageGui(localid));//id sent on the exit writeTrace("init");//write a trace to confirm start } else { MessageGUI message = receive();//look for awaiting message if (message != null) {//safe test, should never be false if (message instanceof TestMessageGui) {//safe test, should never be false TestMessageGui testmessage = (TestMessageGui) message; writeTrace("receive " + testmessage.getId());//message written if (curentmax < testmessage.getId()) { curentmax = testmessage.getId(); sendAll(message); writeTrace("I pass"); } else { if (localid == testmessage.getId()) { writeTrace("I'm the leader"); } else {//sinon writeTrace("I don't pass"); } } } else { writeTrace("Message pas la bonne instance!"); } } else { writeTrace("Message null!"); } } } //describe the node state @Override public String toString(){ return "id local: "+localid + " curent max: " +curentmax; } } 10 La classe MyMessageGUI.java implémentant MessageGUI package test; import das.engine.gui.MessageGUI; public class MyMessageGUI extends MessageGUI { private int id; public TestMessageGui(int id) { this.id = id; } public int getId() { return id; } @Override public String toString(){ return "id: "+id; } } 11 Section 4 Organiser des Simulations SAD en un coup d'oeil 12 Chargement d'un graphe et la trace Load ouvre une boîte de dialogue pour choisir le fichier XML produit par l'analyseur OCAML qui a traité le fichier constitué dans la section 2. “Save trace” doit être cochée pour enregistrer la trace dans un fichier qui est sélectionné dans “Trace option”. Un fichier de trace existant peut être utilisé car la nouvelle trace sera ajouté à la fin du fichier. La trace contient des informations sur le graphe courant et est accessible au développeur des algorithmes. Manipulation du graphe Deux modes permettent de réorganiser le graphe. TransformingMode: • MouseButtonOne+drag pour translater le graphe • MouseButtonOne+Shift+drag pour pivoter le graphe • MouseButtonOne+ctrl(or Command)+drag pour cisailler le graphe 13 Picking Mode: • MouseButtonOne sur un noeud ou un lien pour le sélectionner • MouseButtonOne+Shift sélection multiple • MouseButtonOne+drag sur un noeud pour déplacer tout les noeud sélectionnés • MouseButtonOne+drag pour sélectionner des noeuds dans un rectangle • MouseButtonOne+Shift+drag pour ajouter des noeuds à la sélection dans un rectangle Picking Mode + run on selection: • MouseButtonOne sur un noeud pour effectuer un pas Autorun & gestion manuelle d'une simulation Step: Exécuter une étape sur un nœud en fonction de l'ordonnanceur aléatoire. Multiple steps: Ouvre une boîte de dialogue pour indiquer un nombre d'étapes à effectuer (selon l'ordonnanceur) Autorun: Execute la simulation en fonction de l'ordonnanceur Autorun option: Défini le nombre de noeuds lancer par étape et le lapse de temps entre chque étape. 14 Affichage des données d'un noeud et d'un lien Les données d'un noeud et d'un lien sont affichées dans des fenêtres popup accessible par un clic droit sur la zone du graphique. Les nœuds ou des liens affichées sont ceux choisis dans le Picking mode. Les fenêtres sont rafraîchies en temps réel. De plus les messages entre noeuds apparaissent sur le lien les reliant. Celui-ci héritant alors de la couleur du neud messager. Les couleurs des noeuds sont modifiables par le développeur des algorithmes. Exemple d'affichage des données d'un noeud 15 Exemple d'affichage des données d'un lien Activation/désactivation d'un noeud ou d'un lien Activation et arrêter les nœuds et les liens se fait via un clic droit sur le graphique ou la zone de table noeud. 16 A propos du scheduler Deux champs sont important: alive et antiscrutening. Si le noeud est mort il ne sera pas choisi par le scheduler. Le noeud ne doit pas contrôler ce champ. Si un noeud est en mode antiscrutening, il n'est réveillé que s'il a des messages en attente. Seul le noeud doit contrôler ce champ. Dans chacun des modes, le noeud peut toujours être lancé manuellement. Ces champs influences seulement le scheduler aléatoire. 17 Section 5 Assistance Project manager & kernel: Nicolas Hoffman ([email protected]) Graphic designer : Benjamin Malkas ([email protected]) Ocaml team : Sébastien Mouchet ([email protected]) Sébastien Coavoux ([email protected] ) XML team : Yacine Fall ([email protected]) Emilien Riot ([email protected]) 18