Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Ingegneria
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Stefano Russo » 23.Esercitazione - Introduzione a DAJ


Introduzione

DAJ è un toolkit Java che consente di implementare algoritmi distribuiti e di visualizzarne graficamente l’esecuzione.


Introduzione

È stato sviluppato presso la Hagenberg University of Applied Sciences, Hagenberg, Austria, da Wolfgang Schreiner nel 1997.

Basato sul modello a scambio di messaggi.

Modello di programmazione

  • Rete di nodi collegati tra di loro da canali che operano in maniera asincrona ed indipendente
  • Ogni nodo è dotato di un clock locale (incrementato da ogni operazione di comunicazione) che consente l’ordinamento totale (locale) degli eventi
  • Comunicazione unicast, multicast e broadcast basata su messaggi punto-punto
  • Ricezione di messaggi bloccante o bloccante con timeout
  • Supporto per la schedulazione personalizzata dei nodi
  • Supporto per l’implementazione di selettori personalizzati dei messaggi
  • Supporto per assertions sullo stato globale, per controllare la validità delle condizioni di invarianza nella rete

Visualizzazione

Canale

Grigio – vuoto

Verde – almeno un messaggio sul canale

Rosso – il canale è vuoto e il nodo ricevente è in attesa di un messaggio sul canale

Quando il puntatore del mouse è su un canale appare un tooltip con il suo stato.

Nodo

Viene riportato il nome del nodo ed il valore del clock locale

Verde – pronto per l’esecuzione

Rosso – bloccato (in attesa di un messaggio su un canale)

Blu – Esecuzione terminata

Quando il puntatore del mouse è su un nodo appare un tooltip con il suo stato.


Costruzione di una rete

Implementare una classe derivata da daj.Application.
Di tale classe occorre ridefinire il metodo astratto construct.
Specificare i nodi (Node) della rete.
Per ogni nodo specificare il programma da eseguire (Prog), un ID da far comparire nel nodo (n0), la posizione (X, Y).
Indicare le connessioni (link) tra i nodi.

Mostra codice

Programmare le operazioni sui nodi

Per descrivere il programma (Prog) eseguito da un nodo:

  • Implementare una classe che erediti dalla classe daj.Program
  • Ridefinire il metodo main implementando ciò che effettivamente il nodo deve eseguire
  • Ridefinire il metodo getText affinchè restituisca lo stato del nodo
Mostra codice

Programmare le operazioni sui nodi

È possibile utilizzare i metodi della classe daj.Program per:

  • Accedere ai canali in ingresso in()
  • Accedere ai canali in uscita out()
  • Controllare l’esecuzione del processo
  • Verificare la validità delle assertions
Mostra codice

Programmare le operazioni sui nodi

Se si vuole che un nodo esegua più programmi è possibile associare uno scheduler utilizzando il metodo

daj.Application.setScheduler(Scheduler s)

Per implementare lo scheduler:

  • Realizzare una classe che derivi da daj.Scheduler
  • Ridefinire il metodo astratto nextProgram che restituisce l’indice i del prossimo processo da schedulare (i deve essere compreso tra 0 e getNumber()-1, dove getNumber() restituisce il numero di nodi attivi nel sistema) e isReady(i) deve restituire true, ovvero il processo deve essere pronto all’esecuzione

Definizione di messaggi

Implementare una classe che estende daj.Message.

Ridefinire il metodo getText(), che restituisce la stringa relativa al messaggio da visualizzare nei tooltip.

Mostra codice

Invio di messaggi

Utilizzare il metodo send(Message msg) della classe OutChannel.

Gli OutChannel del nodo sono accessibili dalla classe Program.

Mostra codice

Ricezione di messaggi

Determinare quale canale non è vuoto utilizzando in().select.

N.B. Se tutti i canali sono vuoti il processo si blocca in attesa di un messaggio.

Invocare il metodo receive sul canale sul quale viene individuato un messaggio.

Mostra codice

Message Selector

Per definire la gestione dei messaggi in coda su un canale è possibile associare un message selector ad un’applicazione utilizzando il metodo

 

daj.Application.setSelector(Selector s)

 

Un message selector restituisce il prossimo messaggio da consegnare tra quelli presenti nella coda associata ad un canale.

Può essere utilizzato per ridefinire la politica di default di consegna dei messaggi (FIFO) o anche per simulare failures sul canale.

Per tutta la rete può essere specificato un solo message selector.

Per realizzare un message selector occorre implementare l’interfaccia daj.Selector e ridefinire il metodo Message select(MessageQueue queue).

Asserzioni

DAJ consente di definire delle asserzioni (assertions) per controllare che siano verificate determinate condizioni sullo stato globale della rete.

Ad esempio, può essere definita un’assertion che verifchi che il numero di messaggi nella rete non sia maggiore di N.

Asserzioni

Realizzare una classe che derivi da daj.GlobalAssertion.

Ridefinire il metodo astratto assert:

  • Tale metodo ha a disposizione lo stato di tutti i processi nella rete attraverso il parametro prog
  • Se restituisce false l’applicazione viene bloccata
  • Per verificare un’asserzione si può utilizzare il metodo assert della classe daj.Program
Mostra codice Mostra codice

Personalizzazione della GUI

La visualizzazione può essere personalizzata utilizzando opportuni metodi nel costruttore di Application (che si occupa della creazione dell’applet).

daj.Application.setNodeRadius(int r)
Imposta il raggio dei nodi

 

daj.Application.setNodeFonts(Font f1,Font f2)
Imposta i fonts per visualizzare il nome ed il tempo locale dei nodi

 

daj.Application.setChannelWidth(int w)
Imposta la larghezza del canale

Diagramma delle classi di un’applicazione generica


Esempio

Scambio di messaggi in una rete di 3 nodi collegati ad anello da canali bidirezionali.

  • Il nodo 0 invia un messaggio HELLO al nodo 1 ed un messaggio HI al nodo 2
  • Tutti i nodi, alla ricezione di un messaggio sul canale Cij lo reinoltrano sul canale Cji (per 2 iterazioni)
  • Una assertion verifica che dopo l’inizializzazione della rete in essa vi siano 2 messaggi

Esempio – Main.java

Mostra codice

Esempio – Prog.java

Mostra codice Mostra codice

Esempio – Msg.java

Mostra codice

Esempio – NumberOfMessages.java

Mostra codice

I materiali di supporto della lezione

W. Schreiner, DAJ – A Toolkit for the Simulation of Distributed Algorithms in Java, 1998

W. Schreiner, A Java Toolkit for teaching distributed Algorithms, 7° Annual Conference on Innovation and Technology in Computer Science Education, 2002

DAJ (Distributed Algorithms in Java)

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion