Anno accademico: 1998\’99

Corso di "Reti di calcolatori"

Prof. Antonio Corradi

Oggetto: progetto della gestione di copie replicate ed implementazione in Java

Autore: Tiziano Moretti

Matr: 21 08 055364

Obbiettivi

Ho trattato il problema delle copie replicate. Più clienti devono poter interagire con tali copie avendo l’astrazione che si tratti di un’unica entità. Si è scelto di usare una semantica UNIX.

 

Il Progetto

Entità del progetto

Le copie

Le copie sono realizzate con l’entità più semplice possibile: un vettore di 10 elementi inizializzato con in ogni campo il rispettivo indice. Devono essere disponibili le operazioni di lettura e scrittura di ogni singolo elemento.

I clienti

Ai clienti deve essere nascosto il fatto che vi siano più copie e devono quindi lavorare con l’astrazione di copia unica. Tramite una interfaccia si può scegliere tra le due operazioni:

Per ognuna delle due operazione si deve poi specificare i secondi di attesa per simulare la computazione.

Il manager

Il manager è l’entità che gestisce le copie. Per la prima lettura il cliente si rivolge al manager che fornisce l’indirizzo di una copia attraverso cui interagire alle prossime letture se la copia non dovesse essere più disponibile il cliente deve interagire con il manager per avere l’indirizzo di una ulteriore copia. Il manager deve distribuire equamente i clienti tra le copie. Le scritture vengono fatte solo attraverso il manager che si occupa di aggiornare tutte le copie.

I protocolli

Richiesta al manager dell’indirizzo di una copia:

Cliente Manager

0 ---------à

0 è l’indicazione di lettura

ß --------- numero porta

In questa implemetazione, per semplicità, le copie, il manager e i clienti sono tutti sullo stesso host. L’estensione della distribuzione dei componenti in rete è banale.

 

Letture dal cliente alla copia

Cliente Copia

indice -------à

secondi -----à

ß ---------dato

 

Interazione del cliente con il manager per le scritture

Cliente Manager

1 -----------à

1 è l’indicazione di scrittura

indice -------à

dato --------à

secondi -----à

 

Interazione del manager con la copia per le scritture

Manager Copia

indice -------à

dato --------à

secondi -----à

 

Implementazione

La copia

La classe copia racchiude un vettore di interi di 10 elementi inizializzato con in ogni campo il valore del corrispondente indice. Tale classe fornisce i metodi di lettura e scrittura per interagire con il vettore.

La classe copiaLock racchiude al suo interno un oggetto copia, che rappresenta lo stato di tale oggetto, e definisce due metodi che chiamano i corrispettivi metodi di copia. Il metodo di scrittura deve essere synchronized perché si vogliono letture concorrenti ma scritture esclusive: non devono essere permesse letture durante le scritture. Questa classe può risultare inutile se si sceglie (come verrà fatto) di racchiudere l’uso dell’oggetto copia entro un blocco synchronized.

la classe oneCopyManager permette la comunicazione della copia con i clienti ed il manager. Il suo stato è costituito da un oggetto copiaLock. Una volta creato, questo oggetto lancia due thread: uno in attesa di richieste di letture dai clienti ed uno in attesa di scritture da parte del manager. Questi due thread sono implementati dalle due classi oCMThreadRead e oCMThreadWrite. Queste due classi sono molto simili: creano una ServerSocket, rimangono in attesa di connessioni (accept) all’interno di un ciclo infinito e per ogni connessione lanciano un nuovo thread: connRead e connWrite che si occupano di realizzare il servizio.

Il cliente

L’implementazione è composta da due classi copyClient e copyClientApplet. La seconda fornisce semplicemente l’interfaccia grafica per la prima. Fornisce i metodi di lettura e scrittura secondo i protocolli prima esposti. Se è la prima volta che si tenta una lettura viene chiesto al manager dove si trova una copia. Tale operazione viene ripetuta anche in caso di caduta della copia.

Il manager

La classe copyManagerApplet fornisce l’interfaccia grafica per interagire con il manager, è possibile creare una copia, distruggerne una esistente, stampare a video il contenuto corrente delle varie copie (per controlli).

La classe copyManager costituisce il gestore vero e proprio. Fornisce i metodi chiamati dall’applet ed in un ciclo infinito aspetta richieste di conessione dai clienti per poi lasciarle gestire dal thread connManager.