29 novembre 2006

Progetto di Programmazione a oggetti

Tecnologie Informatiche
A.A. 2006/2007


Introduzione


Una grande Università che sul proprio sito web riceve molti accessi al giorno decide di replicare il contenuto del proprio server principale (di seguito: SERVER) per diminuire il carico di lavoro e la occupazione di banda su di esso. Per fare ciò vuole creare una rete di altri server, (di seguito: PROXY), con il requisito fondamentale che essi si aggiornino automaticamente ai cambiamenti del SERVER, quali l'aggiunta di nuove pagine web (FILE) e la modifica di FILE esistenti. I browser degli utenti (CLIENT) verranno quindi indirizzati sui PROXY invece che sul SERVER, visualizzeranno un sito sempre aggiornato e non sovraccaricheranno il SERVER principale.

L'Università, prima di realizzare la rete di PROXY, vuole simulare l'intero sistema con un programma scritto in linguaggio C++. Nel seguito sono descritti il meccanismo dettagliato del sistema e i requisiti per la sua simulazione.


Descrizione del sistema

Il CLIENT

Il CLIENT è un computer dotato di un browser e di una memoria cache sulla quale vengono memorizzate le pagine web (FILE) accedute più di recente.
Il CLIENT tiene traccia della data di memorizzazione di ogni FILE nella cache.
Ogni CLIENT si connette alla rete attraverso un provider. Questa informazione sarà utilizzata per assegnare al client il PROXY più vicino.
Ogni volta che un utente richiede una pagina sul suo browser (ad esempio la pagina www.università.it/index.html), il CLIENT esegue questi passi:
  1. interroga il DNS, cioè un server apposito che restituisce l'indirizzo del PROXY più vicino (anziché l'indirizzo del SERVER)
  2. verifica l'eventuale possesso del FILE (pagina) in cache. Se il FILE c'è, il CLIENT chiede al PROXY la data di ultima modifica della pagina e la confronta con la data di memorizzazione del FILE in cache. Se i due FILE hanno la stessa data allora il CLIENT non fa altre richieste, ma mostra direttamente la pagina. Altrimenti prosegue con il prossimo passo.
  3. il CLIENT chiede il FILE al PROXY, lo visualizza e lo memorizza nella cache.

Chiameremo le due richieste di cui ai passi 2 e 3, rispettivamente: LastMod() e Get().

Il PROXY

Il PROXY è un computer in grado di rispondere alle richieste dei CLIENT e di eseguire, a sua volta, delle richieste al SERVER. Il PROXY ha una memoria dove mantiene i FILE.
Quando il PROXY riceve una richiesta, sia LastMod() che Get(), per poter rispondere deve prima verificare l'aggiornamento del FILE nella sua memoria. Poi potrà rispondere, rispettivamente:
  1. inviando la data dell'ultimo aggiornamento del file, nel caso di richiesta LastMod()
  2. inviando il file stesso, nel caso di richiesta Get()

L'aggiornamento del file si verifica in questo modo:
  1. Il PROXY deve verificare il possesso del FILE nella sua memoria.
  2. Se sì, deve verificare che non sia stato modificato sul SERVER, mediante una richiesta LastMod() analoga a quella del CLIENT.
  3. Se è stato modificato o se non era presente in memoria deve richiedere il FILE al SERVER (mediante una opportuna Get()) e (re)inserirlo in memoria.

Il SERVER

Il SERVER mantiene tutti i FILE, può rispondere alle richieste LastMod() e Get(), e, nel caso gli venga richiesto un file non esistente, restituisce un file speciale chiamato ERRORFILE. Inoltre è possibile aggiungere nuovi FILE sul SERVER e aggiornare file esistenti.

Modellazione

Modellare il sistema come segue.

  • una classe File. Ogni oggetto ha un contenuto, come stringa di testo. Ha un metodo per stamparsi e uno per restituire la propria lunghezza
  • una classe base Computer, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • un repository di FILE, con filename, size, date
    • un log delle operazioni eseguite
    • Add(), aggiunge un file al repository
    • Touch(), aggiorna la data di un FILE alla data corrente (simula un aggiornamento del file)
    • LastMod(), restituisce la data di un FILE
    • Get(), restituisce il contenuto di un file
    • Log(), aggiorna il log con l'operazione eseguita
    • Stat(), stampa le statistiche relative al log
  • una classe derivata Proxy, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • Get() e LastMod() modificati per la verifica e l'aggiornamento del FILE
    • gestione dell'ERRORFILE (non deve essere mai memorizzato in cache)
  • una classe derivata Server, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • Get() e LastMod() modificati per la gestione dei FILE inesistenti
  • classe Dns
  • classe Client, caratterizzata dalle seguenti strutture dati e dai seguenti metodi:
    • stampa del FILE (simula la visualizzazione di una pagina)
    • richiesta di un file


Realizzare un main() che, leggendo un file di configurazione in un formato a scelta, esegua una simulazione con 100 CLIENT, 4 PROXY, 1 SERVER, 1 DNS, 5 FILE.

36 commenti:

Anonimo ha detto...

Professore, mette l'avviso se domani ci sarà o meno lezione? Ce' lo sciopero generale dei mezzi pubblici, dalle 8.30 fino alle 17 e dalle 20 a fine servizio.

Grazie
Fabrizio

Anonimo ha detto...

queste specifiche per il progetto sono definitive?
cioè saranno integrate con altri particolari, o tutto quello che manca è lasciato a noi?

il log è un oggetto o un file di testo?

il repository lo dobbiamo costruire sapendo che i files saranno solo 5 o è meglio prevedere una struttura dati più efficente?
in altre parole, sarebbe una scelta positiva ai fini della valutazione o verrebbe considerata semplicemente inutile, viste le specifiche?

il file di configurazione contiene il numero di client, server,proxy e/o cos'altro?
grazie.

Anonimo ha detto...

Alla fine c'e' stata lezione o no venerdi scorso?
Vedo che ancora non ha messo alcun podcast quindi deduco che non c'e' stata lezione??

Qualcuno puo' confermarmelo?

Grazie

Fabrizio

Anonimo ha detto...

Io non ci sono stata ma hanno detto che il professore ha fatto regolarmente lezione. Ciao

Anonimo ha detto...

Certo che se il prof. partecipasse un po' di piu' a questo blog non sarebbe male...

Anonimo ha detto...

professore è uscito il calendario delle date di esame di gennaio-febbraio, volevo se possibile un chiarimento: le date di esame sono esatte? 31/01/2007 07/02/2007 e 13/02/2007 sono veramente queste o c'è uno sbaglio? perche se fossero giuste non le sembra un po esagerato mettere tutti e tre gli appelli nel giro di due settimane? la ringrazio

Anonimo ha detto...

prof se ci sei batti un colpo :)

Anonimo ha detto...

Ma che e' accaduto al prof.?
Non compaiono piu neanche i podcast...io ho perso delle lezioni e proprio quelle non le mette online??

Prof.? se legge i messaggi puo' inserire gli ultimi podcast delle lezioni e rispondere alle domande?

Grazie

Unknown ha detto...

l'email del prof è: Panizzi@di.uniroma1.it

Unknown ha detto...

Qualcuno sa se ci si può appoggiare alla libreria standard e alle STL per gestire roba tipo stringhe e liste oppure bisogna reimplementare tutto ex-novo?

Unknown ha detto...

visto che le sta spiegando a lezione penso che dobbiamo usarle!
altrimenti diventerebbe un progetto immenso!

Emanuele Panizzi ha detto...

E' ovvio che le strutture della standard library vanno utilizzate ampiamente nello svolgimento del progetto.

Emanuele Panizzi ha detto...

I podcast delle ultime due lezioni andranno online a breve.

Emanuele Panizzi ha detto...

Per quanto riguarda gli appelli: il calendario didattico prevede appelli dal 23 gennaio al 20 febbraio (circa, vado a memoria). Io credo che il mese di gennaio vi servirà tutto per preparare il progetto, e ho messo l'ultimo appello il 13 febbraio per lasciare spazio per gestire eventuali affollamenti.

Anonimo ha detto...

no professore, il calendario didattico prevede appelli dal 22 gennaio al 20 febbraio solo per i nouvi iscritti al primo anno, che possono sostenere un solo appelo nella sessione invernale.
rimane in vigore il calendario didattico degli anni passati quindi dal 8 gennaio a fine febbraio per chi è iscritto ad anni successivi al primo, quindi magari sarebbe stato meglio avere un appello a meta gennaio uno i primi di febbraio e uno a fine febbraio come accadeva negli anniu passati lei non crede?

Anonimo ha detto...

Come si puo' pensare di dare 2 o 3 esami (in realta' dovrebbero essere anche 5) avendo un solo mese di tempo?
Ma siamo ammattiti?

Io personalmente vorrei preparare 3 esami.

Fabrizio

Anonimo ha detto...

putroppo questo è quello che la nostra facolta ha deciso, con la motivazione che questo sistema ci motiverà a studiare di piu e di conseguenza a passare piu esami!!!
una bella favola!!!

Anonimo ha detto...

ma il giorno 15 dicembre 2006 essendoci sciopero totale di 24 ore è il caso di fare lezione secondo voi e il professore?
grwzie

Anonimo ha detto...

lo sciopero è stato revocato!!!!

Anonimo ha detto...

cerco persone per formare il gruppo di prog oppure per aggregarmi a qualcuno già esistente.contattatemi su algalord36@hotmail.com
Mi scuso per OT

Anonimo ha detto...

professore puo gentilmente aggiornare il blog con il materiale delle ultime lezioni. grazie

Anonimo ha detto...

Professore, in data 11 dicembre ha detto che avrebbe aggiunto i podcast...ma ad oggi 19 dicembre ancora nulla!! mancano di podcast di almeno 4 lezioni!!!!

Che stiamo aspettando???

Anonimo ha detto...

PROFESSORE PER QUALE MOTIVO OGGI NON E' VENUTO A LEZIONE? PER QUALE MOTIVO NON CI HA AVVERTITO?
PER QUALE MOTIVO CI HA ABBANDONATO?

Unknown ha detto...

Qualcuno ha idea se la classe Client debba estendere Computer?

Unknown ha detto...

il prof a lezione cioè venerdi scorso ha detto chiaramente di no
è una classe a parte.

Emanuele Panizzi ha detto...

Il 22 dicembre è vacanza di natale secondo il calendario accademico, quindi non ci sono lezioni.

Anonimo ha detto...

Prof le modalità di consegna del progetto sono le stesse dell'anno scorso ?
Inoltre volevo chiederle se oltre al file di configurazione è consentito fare un menu interattivo per effettuare una simulazione "reale".

Emanuele Panizzi ha detto...

Sì le modalità di consegna non sono cambiate: si consegna il progetto il giorno stesso dell'appello.

Benvenga anche un menù interattivo. Ma comunque con il file di configurazione si può effettuare una simulazione "reale" come dice lei, semplicemente modificando il file senza dover ricompilare il progetto.

Anonimo ha detto...

Qualcuno saprebbe dirmi dove posso trovare informazioni su come si costruisca e utilizzi un file di configurazione?
grazie

Unknown ha detto...

Alcuni colleghi mi hanno detto che il progetto deve essere svolto necessariamente in gruppo, purtroppo ho già sviluppato per intero il programma da solo. Posso presentarlo lo stesso? Non vorrei dover buttare parte del lavoro...

Emanuele Panizzi ha detto...

No, purtroppo il progetto si può fare solamente in gruppi di 3 o 4 persone.
Mi dispiace che abbia iniziato da solo. Se fosse venuto a lezione o avesse ascoltato i podcast avrebbe avuto quuesta informazione prima di iniziare.

Unknown ha detto...

Il problema è che non solo ho iniziato il progetto da solo, l'ho anche finito! Vabbè, pazienza, qualcuno per fare un gruppo lo troverò...

Anonimo ha detto...

a costo di sembrare pignolo, avrei un'osservazione sulle specifiche dateci: nell'introduzione è scritto che i proxy hanno "il requisito fondamentale che essi si AGGIORNINO AUTOMATICAMENTE ai cambiamenti del server..." cioè, appena avviene un cambiamento sul server, viene notificato al proxy????? ma nn era il proxy a informarsi dei cambiamenti? nn è lui che chiede al server se è stato aggiornato un file SOLO SE questo file è richiesto dal client?

Emanuele Panizzi ha detto...

Sì, è come dice lei. Cioè i proxy devono aggiornarsi ai cambiamenti di un file sul server solo se un client richiede quel file. "Automaticamente" significa che il proxy deve decidere se ricaricare la pagina dal server (cioè aggiornarsi) o no.

Anonimo ha detto...

Un paio di domande a proposito delle statistiche:
1) Mi è sembrato di capire che il metodo Stat() della classe Computer debba stampare le operazioni eseguite dalla singola istanza. In tal caso (stampando le operazioni dei singoli oggetti separatamente) risulterebbe assai difficoltoso ricostruire un flusso "generale" dell'esecuzione della simulazione, ho pertanto creato un sistema di logging "diffuso" tra i vari oggetti istanziati che permette di stampare le azioni eseguite da tutti gli oggetti in maniera globale e sequenziale ma che permette allo stesso tempo di richiedere separatamente le azioni dei singoli oggetti (coprendo quindi le specifiche per quanto riguarda il metodo Stat() ). Va bene questa soluzione?

2) Durante le lezioni e in qualche commento su questo blog mi è sembrato di capire che la simulazione dovrebbe restituire dati attraverso i quali sarebbe possibile generare un grafico, qualcuno ha proposto l'utilizzo della libreria GLUT (usare OpenGL per generare un grafico!? Assomiglia molto all'usare una bomba H per uccidere una mosca), lei ha suggerito di ripiegare sulla soluzione più semplice se ben ricordo (inserimento dei dati direttamente su Excel), il mio problema tuttavia è altrove: quali dati dovrei usare per le ascisse e quali per le ordinate?
Misurare i tempi di esecuzione delle singole richieste non credo sia una soluzione praticabile: probabilmente sarebbero troppo brevi per essere misurati e comunque i risultati sarebbero piuttosto lineari.
L'unica cosa che mi viene in mente è ricorrere alle funzioni di sistema per misurare il tempo effettivo impiegato da un insieme di richieste abbastanza grande da poter mostrare un intervallo temporaneo misurabile. Questo renderebbe i risultati più leggibili ma comunque credo che resterebbero lo stesso del tutto lineari.
Forse ho frainteso del tutto quali dati usare per la generazione del grafico ma non mi viene altro in mente, attendo consigli...

Emanuele Panizzi ha detto...

Risposta a Graziosi:
Per il punto 1, la soluzione trovata va benissimo.
Per quanto riguarda il punto 2, quello che vogliamo vedere è se il carico sul server diminuisce all'aumentare dei proxy.

Quindi, ad esempio, fissando il numero di client e il numero medio di richieste per client, si potrebbe fare un grafico con in ascissa il numero di proxy e in ordinata il numero di richieste Get al server (quindi sarebbe un grafico contenente i risultati di più simulazioni). Può inventare altri grafici simili per mostrare entro quali limiti il sistema dei proxy è utile.