Università degli studi dell'Insubria

PROGRAMMAZIONE CONCORRENTE E DISTRIBUITA

A.A. di erogazione 2019/2020
Insegnamento obbligatorio

Laurea triennale in INFORMATICA
 (A.A. 2018/2019)
Anno di corso: 
2
Tipologia di insegnamento: 
Caratterizzante
Settore disciplinare: 
SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI (ING-INF/05)
Crediti: 
8
Ciclo: 
Secondo Semestre
Ore di attivita' frontale: 
72
Dettaglio ore: 
Lezione (48 ore), Esercitazione (24 ore)

Il corso ha lo scopo di rendere gli studenti capaci di programmare sistemi software concorrenti e distribuiti. A tale scopo gli studenti apprenderanno le tecniche di programmazione concorrente, la programmazione distribuita e le relative problematiche.
Al termine del corso, lo studente sarà in grado di
1. Comprendere le caratteristiche e i meccanismi di funzionamento di un programma concorrente (comprendente molteplici thread di esecuzione); riconoscere le condizioni in cui si possono verificare situazioni problematiche, come Race Conditions, Deadlock e Starvation.
2. Conoscere e applicare le primitive per la creazione e gestione di thread, con particolare riferimento alle primitive di sincronizzazione e comunicazione tra thread; conoscere e applicare le tecniche in grado di prevenire Race Conditions, Deadlock e Starvation.
3. Conoscere e applicare i principali paradigmi di comunicazione tra thread.
4. Conoscere lo standard ISO/OSI e le basi dei principali protocolli di comunicazione.
5. Comprendere le caratteristiche dei sistemi distribuiti; conoscere e utilizzare i socket per la comunicazione tra programmi distribuiti.
6. Conoscere e utilizzare RMI per realizzazione di programmi object-oriented distribuiti.
7. Conoscere le basi della programmazione ad eventi in ambito concorrente e distribuito e scrivere programmi il cui comportamento è basato sulla reazione ad eventi.
Lo studente dovrà inoltre sviluppare una consapevole autonomia di giudizio con riferimento al riconoscimento delle problematiche tipiche della programmazione concorrente e distribuita e alla scelta di tecniche da impiegare per ottenere dal sistema il comportamento desiderato.

È richiesta la capacita di programmare in ambiente "sequenziale"; specificamente è necessario che lo studente padroneggi la programmazione in Java, il linguaggio usato nel corso. Le conoscenze e abilità necessarie per un proficuo apprendimento di questo insegnamento sono impartite nel corso fondamentale del primo anno di Programmazione, che dunque costituisce propedeuticità obbligatoria.

Le lezioni affronteranno i seguenti argomenti:
Programmi multi-thread (6 h, obiettivo formativo 1)
Introduzione ai programmi multi-thread; non-determinismo
caratteristiche e meccanismi di funzionamento di un programma concorrente; cosa succede in memoria durante l'esecuzione di un programma multi-thread
situazioni problematiche (Race Conditions, Deadlock, Lilelock e Starvation) e condizioni in cui si possono verificare.
Meccanismi per la programmazione multi-thread (18 h, obiettivo formativo 2)
semafori e monitor; equivalenza dei due meccanismi
prevenzione delle race conditions
primitive di sospensione e risveglio (wait e notify)
esempi: produttore-consumatore
tecniche per prevenire Deadlock
esempi: problema dei 5 filosofi
Progettazione e descrizione di programmi concorrenti mediante UML
Paradigmi di comunicazione tra thread (8 h, obiettivo formativo 3)
presentazione e implementazione dei paradigmi: segnali, buffer, mailbox, broadcast, blackboard, barrier.
esempi illustrativi di ciascun meccanismo
Lo standard ISO/OSI e i protocolli di comunicazione (8 h, obiettivo formativo 4)
Lo stack ISO/OSI
L'Internet protocol
TCP e UDP
Cenni ai protocolli applicativi, con approfondimento di HTTP
I sistemi distribuiti (4 h, obiettivo formativo 5)
Introduzione ai sistemi distribuiti
L'architettura client-server
Realizzazione di sistemi distribuiti mediante socket (8 h, obiettivo formativo 5)
Funzioni di libreria Java per l'uso dei socket
La serializzazione
Esempi
Proxy e skeleton
Descrizione di programmi distribuiti mediante UML
Realizzazione di sistemi distribuiti mediante RMI (12 h, obiettivo formativo 6)
Obiettivi di RMI
Principio di funzionamento di RMI
Programmazione con RMI
Callback
Programmazione ad eventi (8 h, obiettivo formativo 7)
Le base della programmazione ad eventi
Pattern per la comunicazione ad eventi in ambito distribuito
L'uso degli eventi nelle GUI
Gli argomenti verranno affrontati usando come riferimento il linguaggio di programmazione Java. Ciò nondimeno, molti degli argomenti trattati nel corso sono di validità generale, e le tecniche proposte sono generalmente applicabili con linguaggi diversi.

Il corso si articola in lezioni frontali (48 ore) ed esercitazioni (24 ore).
Le lezioni sono dedicate all'illustrazione degli elementi di programmazione concorrente e distribuita, delle problematiche tipiche dei programmi concorrenti e distribuiti, e delle tecniche adatte a costruire programmi concorrenti e distribuiti corretti.
Gli argomenti trattati a lezione sono oggetto di esercitazioni che prevedono la partecipazione attiva degli studenti e comprendono la dimostrazione dal vivo degli strumenti di sviluppo (principalmente Eclipse).

L’obiettivo della prova d’esame è l'accertamento dell’acquisizione delle conoscenze e delle abilità descritte nella sezione “Obiettivi del corso”, valutando il livello di conoscenza e soprattutto la capacità di mettere in pratica, anche integrandole tra loro, le tecniche di programmazione viste a lezione.
L'esame consiste in una prova scritta da svolgersi sui PC del laboratorio informatico usando l'ambiente di programmazione visto durante le esercitazioni. La prova–della durata indicativa di 90 minuti–richiede di scrivere alcuni piccoli programmi, ciascuno dei quali testa la conoscenza di uno o più argomenti trattati nel corso; specificamente, vengono sempre testate la capacita di scrivere programmi concorrenti e la capacita di scrivere programmi distribuiti, usando socket o RMI. Viene inoltre richiesto di rispondere a domande–generalmente in numero compreso tra 6 e 10–riguardanti le conoscenze illustrate nella sezione “Contenuti del corso”. Le domande sono generalmente a risposta multipla (le risposte non date o sbagliate sono equivalenti).
Solo nel caso la prova scritta lasci dei dubbi sulla reale preparazione dello studente–quindi a discrezione del docente–verrà svolta una prova orale.
La conoscenza della terminologia specifica di dominio viene testata implicitamente, poiché domande e specifiche dei problemi utilizzano tale terminologia.
Le risposte alle domande pesano complessivamente per il 25% nella formulazione del voto finale, mentre i programmi determinano il restante 75% del voto finale.
Il voto è espresso in trentesimi.

I testi consigliati sono:
Creating Components: Object Oriented, Concurrent, and Distributed Computing in Java di Charles W. Kann
Concurrent and Real-Time Programming in Java di A. Wellings
Concurrent and Distributed Programming in Java by Vijay K. Garg
Thinking in Java di Bruce Eckel et. al.
Tuttavia, data la generalità degli argomenti trattati, esistono diversi libri che possono proficuamente essere utilizzati dagli studenti al posto di quelli consigliati. Similmente, su Internet è facile trovare documentazione riguardante gli argomenti trattati nel corso; in particolare, è consigliato l'utilizzo della documentazione relativa alle primitive del linguaggio Java, disponibile sul sito Oracle.
Le slide delle lezioni in formato PDF sono messe a disposizione sulla piattaforma e-learning di Ateneo ove sono disponibili anche il testo dei problemi visti durante le esercitazioni e le soluzioni proposte.

Il docente riceve su appuntamento, previa richiesta via e-mail a luigi.lavazza@uninsubria.it. Il docente risponde solo alle e-mail firmate e provenienti dal dominio studenti.uninsubria.it.

Cerchi il programma? Potrebbe non essere ancora stato caricato o riferirsi ad insegnamenti che verranno erogati in futuro.
Seleziona l‘anno in cui ti sei immatricolato e troverai le informazioni relative all'insegnamento del tuo piano di studio.

A.A. 2019/2020

Anno di corso: 2
Curriculum: PERCORSO COMUNE

A.A. 2017/2018

Anno di corso: 2
Curriculum: PERCORSO COMUNE

A.A. 2016/2017

Anno di corso: 2
Curriculum: PERCORSO COMUNE

A.A. 2015/2016

Anno di corso: 2
Curriculum: PERCORSO COMUNE

A.A. 2014/2015

Anno di corso: 2
Curriculum: PERCORSO COMUNE

A.A. 2013/2014

Anno di corso: 2
Curriculum: PERCORSO COMUNE