DAJ è un toolkit Java che consente di implementare algoritmi distribuiti e di visualizzarne graficamente l’esecuzione.
È stato sviluppato presso la Hagenberg University of Applied Sciences, Hagenberg, Austria, da Wolfgang Schreiner nel 1997.
Basato sul modello a scambio di messaggi.
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.
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.
Per descrivere il programma (Prog)
eseguito da un nodo:
daj.Program
main
implementando ciò che effettivamente il nodo deve eseguiregetText
affinchè restituisca lo stato del nodoÈ possibile utilizzare i metodi della classe daj.Program
per:
in()
out()
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:
daj.Scheduler
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’esecuzioneImplementare una classe che estende daj.Message.
Ridefinire il metodo
getText()
, che restituisce la stringa relativa al messaggio da visualizzare nei tooltip.
Utilizzare il metodo send(Message msg)
della classe OutChannel.
Gli OutChannel
del nodo sono accessibili dalla classe Program.
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 codicePer 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).
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.
Realizzare una classe che derivi da daj.GlobalAssertion.
Ridefinire il metodo astratto assert
:
prog
false
l’applicazione viene bloccatadaj.Program
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
Scambio di messaggi in una rete di 3 nodi collegati ad anello da canali bidirezionali.
1. Caratterizzazione dei sistemi distribuiti
2. Modelli di sistemi distribuiti
3. Tempo e sincronizzazione nei Sistemi Distribuiti
4. Stato globale nei Sistemi Distribuiti
5. Problemi di consenso nei sistemi distribuiti
7. Algoritmi di mutua esclusione nei sistemi distribuiti
8. Algoritmi di elezione nei sistemi distribuiti
10. Il Network File System di SUN Microsystems
11. AFS (Andrew File System) e GFS (Google File System)
12. Transazioni e controllo di concorrenza
13. Transazioni
15. Affidabilità (dependability) dei sistemi software distribuiti
16. Affidabilità dei sistemi software distribuiti
17. Software Faults
18. Classificazione e analisi dei difetti software
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