Simulation d`algorithmes distribués Guide Utilisateur

publicité
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
Téléchargement