F47066 - Laboratorio di Sistemi e Reti [a.a. 2003-04]
Indice
Il corso di Laboratorio di Sistemi e Reti è un insegnamento fondamentale
del terzo anno del corso di laurea (triennale) in Comunicazione Digitale,
strettamente coordinato con il corso di
Reti di Calcolatori.
Venerdi dalle 16:30 alle 19:15 in aula Beta (Via Comelico 39)
Per meglio sincronizzare lo svolgimento del corso con quello di
Reti di Calcolatori,
alcune lezioni potranno svolgersi nell'orario di quest'ultimo,
e viceversa. Si vedano in proposito il
Diario delle lezioni tenute
e la
Agenda delle lezioni da svolgere
Il programma consiste di tutti e soli gli argomenti trattati a lezione,
secondo quanto viene via via pubblicato nella sottostante sezione
Diario delle lezioni tenute.
L'esame del corso di Laboratorio di Sistemi e Reti si compone di una
prova scritta
(si veda il seguente esempio),
consistente nella redazione in aula di due programmmi
che utilizzano la tecnologia delle socket (linguaggi Java e C),
eventualmente in combinazione con multithreading (Java/JVM) e
multiprocessing (C/Linux), cui segue una prova pratica (da svolgersi
a casa o in laboratorio) consistente nell'implementazione della
soluzione sviluppata in aula. L'elaborato finale (codice sorgente
del programma, prove di esecuzione, etc.) verranno discussi nel
corso di una breve prova orale che si terrà successivamente alla
pubblicazione dei voti riportati nella prova scritta.
Gli esami sono coordinati con quelli del corso di
Reti di Calcolatori, nel senso che gli esami
dei due corsi si svolgono nello stesso giorno, ora e luogo, secondo
il seguente calendario (eventuali variazioni verranno comunicate
tempestivamente - consultare periodicamente la
home page del docente),
e danno luogo alla verbalizzazione di un voto unico per i due corsi.
- Appello 1 a.a. 2003-04 - Aula Beta - Ore 09:30 - 02 Feb 04 -
[Testo]
[Risultati]
- Appello 2 a.a. 2003-04 - Aula Beta - Ore 09:30 - 23 Feb 04 -
[Testo]
[Risultati]
- Appello 3 a.a. 2003-04 - Aula Beta - Ore 09:30 - 27 Mar 04 -
[Testo]
[Risultati]
- Appello S a.a. 2003-04 - Aula Alfa - Ore 17:00 - 26 Apr 04 -
[Testo]
[Risultati]
- Appello 4 a.a. 2003-04 - Aula Beta - Ore 09:30 - 15 Mag 04 -
[Testo]
[Risultati]
- Appello 5 a.a. 2003-04 - Aula Beta - Ore 15:00 - 18 Giu 04 -
[Testo]
[Risultati]
- Appello 6 a.a. 2003-04 - Aula Beta - Ore 15:00 - 13 Lug 04 -
[Testo]
[Risultati]
- Appello 7 a.a. 2003-04 - Aula Beta - Ore 15:00 - 23 Set 04 -
[Testo]
[Risultati]
- Appello 8 a.a. 2003-04 - Aula Delta - Ore 13:00 - 06 Dic 04 -
[Testo]
[Risultati]
Per chi volesse svolgere esercizi di programmazione con le socket in
ambiente C/Windows senza necessariamente effettuare una installazione
"nativa" di Linux sul proprio PC di casa, si presentano varie
possibilità, tra cui:
- Installare Cygwin in ambiente
Windows e usare il suo sottosistema di socket
- Usare una distribuzione di Linux che gira interamente su CD (tipo
Knoppix) e salvare il lavoro su
floppy
- Installare Linux in ambiente Windows, utilizzando un simulatore
tipo VMWare
L'uso delle WinSock di Windows è invece sconsigliato, in quanto le
specifiche sono diverse rispetto a quelle (conformi allo standard
Posix) delle librerie presentate a lezione.
Chi fosse interessato a installare un compilatore C in ambiente Windows
(se non già incorporato nelle soluzioni di cui sopra) può effettuare
una ricerca in Internet (p.es. con
Google
) usando come keyword l'espressione "GCC compiler for Windows" (con
le virgolette): non c'è che l'imbarazzo della scelta.
Per avere un'idea della complessità di un tipico esercizio "da esame"
(effettivamente assegnato qualche anno fa nell'ambito del corso di
Sistemi Operativi) si veda l'esempio
CircTest.java,
che risolve il problema della sincronizzazione reciproca di due clown
(classe Clown) che si rubano il cappello (classe Hat) l'un l'altro.
La soluzione qui proposta è scarna quanto ci si aspetta che sia
una soluzione sviluppata in aula. Nella implementazione da realizzare
a casa o in laboratorio (e da discutere poi all'orale) ci si attende
invece una maggiore ricchezza di dettagli, soprattutto per quanto
riguarda l'inserzione nel codice di stampe che consentano di tracciare
una tipica esecuzione del sistema, similmente a quanto riportato in
CircTrac.java.
I voti vengono pubblicati esclusivamente online, e la loro validità
temporale è illimitata. Per la verbalizzazione, presentarsi a uno
degli appelli successivi a quello in cui l'esame è stato sostenuto.
Per situazioni di particolare urgenza (p.es. imminenza dell'esame di
laurea, scadenza dei termini per la presentazione della richiesta di
rinvio del servizio militare, etc.) presentarsi durante l'orario di
ricevimento.
Ecco il quadro dei risultati
definitivi, completo di numero di statino del verbale per coloro
che hanno superato l'esame e registrato il relativo voto.
- Lezioni 01-03 -- Ven 03.10.03 --
Presentazione del corso.
Paradigma di programmazione client-server.
Modello di comunicazione a socket.
- Lezioni 04-06 -- Ven 10.10.03 --
Le socket di tipo stream (TCP) in Java.
Le classi Socket e ServerSocket.
Sistemi client-server con server sequenziali.
- Lezioni 07-09 -- Ven 17.10.03 --
Sistemi client-server con server concorrenti.
Indirizzi IP (introduzione).
- Lezioni 10-12 -- Ven 24.10.03 --
Lezioni sospese (sciopero generale, con blocco
mezzi pubblici in orario lezione).
Ricupero previsto a fine corso.
- Lezioni 13-15 -- Ven 31.10.03 --
Indirizzi IP, reti e sottoreti.
Socket di tipo datagram (UDP).
Le classi DatagramPacket e DatagramSocket.
- Lezioni 16-18 -- Ven 07.11.03 --
La classe Thread.
Creazione e clonazione di thread.
Monitor e metodi synchronized.
Esempio: produttore e consumatore.
- Lezioni 19-21 -- Ven 14.11.03 --
Esempio: produttore e consumatore (approfondimenti).
Esempio: coppia di clown che si rubano il cappello
l'un l'altro.
- Lezioni 22-24 -- Ven 21.11.03 --
I metodi bind, connect, listen.
Loro relazioni con Socket/ServerSocket.
Sistemi client-server con DatagramSocket.
- Lezioni 25-27 -- Ven 28.11.03 --
Lezioni non tenute
(sostituite con lezioni di Reti di Calcolatori).
Ricupero previsto il 9 gennaio 2004.
- Lezioni 28-30 -- Ven 05.12.03 --
Introduzione al linguaggio di programmazione C.
[Con la collaborazione di Carlo Bolchini.]
- Lezioni 31-33 -- Ven 12.12.03 --
Introduzione al linguaggio di programmazione C.
[Con la collaborazione di Carlo Bolchini.]
- Lezioni 34-36 -- Ven 19.12.03 --
Primitive socket, bind e connect.
Scrittura di un client in C.
[Con la collaborazione di Carlo Bolchini.]
- Lezioni 37-39 -- Ven 09.01.04 --
Lezioni sospese (sciopero mezzi pubblici).
Ricuperate in data 22 gennaio 2004.
- Lezioni 25-27 -- Lun 12.01.04 --
Lezioni non tenute
(sostituite con lezioni di Reti di Calcolatori).
Ricupero previsto il 26 gennaio 2004.
- Lezioni 43-45 -- Ven 16.01.04 --
Implementazione di un client TCP.
Implementazione di un server TCP iterativo.
[Con la collaborazione di Carlo Bolchini.]
- Lezioni 46-48 -- Lun 19.01.04 --
Implementazione di un server TCP multiprocesso.
[Con la collaborazione di Carlo Bolchini.]
- Lezioni 49-51 -- Gio 22.01.04 --
Socket UDP.
Implementazione di un client e di un server UDP.
[Con la collaborazione di Carlo Bolchini.]
- Lezioni 52-54 -- Lun 26.01.04 --
Ripasso conclusivo di client e server TCP.
[Con la collaborazione di Carlo Bolchini.]
- -----------------
- Lezioni 55-58 -- Ven 20.02.04 --
Esempio di soluzione dell'esercizio di programmazione
in Java assegnato in primo appello.
- Lezioni 58-60 -- Gio 04.03.04 --
Idem, ma per l'esercizio di programmazione in C.
[Con la collaborazione di
Eugenio Cassiano.]
- Lezioni 61-63 -- Gio 11.03.04 --
Esercizi di programmazione con le socket in Java e C.
[Con la collaborazione di
Eugenio Cassiano.]
- Lezioni 64-66 -- Gio 18.03.04 --
Esercizi di programmazione con le socket in Java e C.
[Con la collaborazione di
Eugenio Cassiano.]
- Lezioni 67-67 -- Gio 25.03.04 --
Esercizi di programmazione con le socket in Java e C.
[Con la collaborazione di
Eugenio Cassiano.]
Il corso è terminato.
Testo di riferimento
Esistono molti testi pubblicati sugli argomenti trattati nel corso,
tutti largamente equivalenti ai fini didattici.
Esempi di multithreading in Java (solo codice sorgente)
Attenzione: negli esempi che seguono [versione del 24.11.03] non
si è posta alcuna attenzione alla gestione mutuamente esclusiva
del file di output (System.out) da parte dei vari thread che ne
fanno uso.
Tutti esempi sono soggetti a progressivi miglioramenti
stilistici e funzionali. Si consulti periodicamente questo sito
per le novità.
- CreaTest.java --
Creazione di un semplice thread, e sua immediata attivazione.
- MultTest.java --
Creazione di più thread, e loro successiva attivazione.
- ClonTest.java --
Clonazione di un thread, senza alcuna attivazione del clone.
- StatTest.java --
Clonazione di un thread, sua successiva attivazione, e conteggio del numero di thread creati.
- SoupTest.java --
Sincronizzazione tra una pluralità di produttori (classe Prod) e di
consumatori (classe Cons) attraverso l'uso di un monitor (classe Soup).
- CircTest.java --
Sincronizzazione reciproca di due clown (classe Clown) che si rubano il
cappello (classe Hat) l'un l'altro.
- CircTrac.java --
Versione modificata di CircTest.java con stampa di una traccia di
esecuzione.
Esempi di uso delle socket in Java (solo codice sorgente)
Attenzione: negli esempi che seguono [versione del 10.11.03] non
si è posta alcuna attenzione alla gestione mutuamente esclusiva
del file di output (System.out) da parte dei vari thread che ne
fanno uso.
Tutti esempi sono soggetti a progressivi miglioramenti
stilistici e funzionali. Si consulti periodicamente questo sito
per le novità.
- OneCli -- Un semplice client
(Cli.java)
che si connette a un semplice server sequenziale
(Ser.java)
mediante una socket TCP.
- OneCli -- Come sopra, ma il client
(Cli.java)
si connette al server
(Ser.java)
utilizzandone l'indirizzo IP invece del nome simbolico.
- TenCli -- Dieci client di tipo thread
(Cli.java)
che si connettono concorrentemente
(Ten.java)
a un server sequenziale
(Ser.java)
mediante socket TCP.
- ParSer -- Come sopra
(Cli.java,
Ten.java),
ma con un server concorrente
(Ser.java)
che eroga servizi creando thread ad hoc
(Svc.java).
- OneCli -- Un semplice client
(Cli.java)
che invia a sé stesso un pacchetto UDP.
- OneCli -- Versione modificata
(CliTra.java)
del client precedente con stampa di una traccia di esecuzione.
- TwoCli -- Un semplice client
(Cli.java)
che invia un pacchetto UDP a un server
(Ser.java)
che risponde.
- TwoCli -- Versione modificata del client
(CliTra.java)
e del server
(SerTra.java)
precedenti con stampa di una traccia di esecuzione.
- SckImp -- Come OneCli ma con client
(Cli.java)
e server
(Ser.java)
implementati via bind/connect e bind/listen (in stile simile a C).
Programmazione con le socket in linguaggio C
Per questa parte del corso si suggerisce di consultare le
slide del corso tenuto da Dario Maggiorini nell'a.a. 2002-03.
Sul tema è anche disponibile un eccellente
tutorial, che però non copre esattamente
tutti e soli gli argomenti trattati nel corso.
Siti enciclopedici
Standard: enti e documenti
Gianfranco Prini (
gfp@dico.unimi.it)