Obiettivi formativi
Il corso si propone di far conoscere allo studente le architetture e le funzionalità dei moderni sistemi operativi e di renderlo in grado di programmare in modo corretto ed efficiente sistemi ed applicazioni concorrenti e in tempo reale. In particolare i contenuti del corso riguardano:
- componenti dei sistemi operativi, processi, thread, spazi di indirizzamento,
- modalità di gestione di processi e thread e di assegnazione di risorse del sistema,
- meccanismi e strumenti per la sincronizzazione e la programmazione concorrente,
- caratteristiche dei sistemi in tempo reale e relativi algoritmi di scheduling.
Al termine del corso lo studente sarà in grado di applicare direttamente le conoscenze acquisite nei seguenti ambiti:
- modellazione e soluzione di problemi di programmazione concorrente mediante mutex, semafori, variabili condizione, e costrutti linguistici come monitor e regioni critiche;
- programmazione di applicazioni di sistema, multiprocesso e cliente-servitore in linguaggio C/C++ nei sistemi operativi UNIX e Linux;
- programmazione di applicazioni multithread mediante le API POSIX e C++ in Linux;
- progettazione e programmazione di applicazioni multithread in tempo reale mediante le API POSIX e C++ in Linux.
Prerequisiti
Conoscenza di base degli elementi dei sistemi operativi. Conoscenza generale della programmazione e capacità pratica di programmazione in linguaggio C/C++.
Contenuti dell'insegnamento
Sistemi operativi e in tempo reale: Programma del corso
Architetture dei sistemi operativi
Componenti dei sistemi operativi
Programmazione concorrente nel modello a memoria condivisa
Programmazione concorrente nel modello a memoria locale
Sistemi distribuiti e cliente-servitore
Sistemi in tempo reale
Schedulazione in tempo reale
Programmazione di sistemi multiprocesso in C/C++ nei sistemi operativi UNIX e Linux.
Programmazione multithread e in tempo reale con API POSIX e/o C++ in ambiente Linux.
Programma esteso
__Sistemi operativi e in tempo reale: Programma dettagliato del corso__
Architetture dei sistemi operativi
Evoluzione, ruolo e funzioni del sistema operativo. Multiprogrammazione. Processi, thread e spazi di indirizzamento. Protezione. Commutazione di thread e di processi. Sistemi a macchine virtuali.
Componenti dei sistemi operativi
Gestione dei processi e dei thread. Scheduling della CPU. Gestione della memoria. Memoria Virtuale. Gestione dell'I/O. Gestione dei file. Sicurezza. Tecniche di prevenzione e gestione del blocco critico.
Programmazione concorrente nel modello a memoria condivisa
Mutua esclusione e primitive di sincronizzazione. Gestione di risorse mediante semafori. Regioni critiche condizionali. Monitor. Supporti per la programmazione concorrente in Java.
Programmazione concorrente nel modello a memoria locale
Primitive send e receive. Remote procedure call. Comandi con guardia.
Sistemi distribuiti
Modello cliente-servitore. RPC in ambiente distribuito. Sincronizzazione, mutua esclusione e coordinamento distribuiti.
Sistemi in tempo reale
Sistemi embedded. Sistemi di elaborazione operanti con vincoli temporali. Tipologie dei sistemi in tempo reale e parametri caratteristici. Modello di riferimento per i sistemi di elaborazione in tempo reale.
Schedulazione in tempo reale
Scheduling di task aperiodici. Scheduling di task periodici mediante executive ciclico. Scheduling di task periodici basato su priorità. Algoritmi di scheduling Rate Monotonic ed Earliest Deadline First. Scheduling congiunto di task periodici, aperiodici e sporadici. Protocolli di accesso a risorse condivise. Gestione della inversione di priorità.
Programmazione di sistemi multithread e in tempo reale
Funzionalità dei moderni sistemi operativi a supporto dell'elaborazione in tempo reale. Supporti per il multithreading in Linux. Le API standard POSIX e C++ per il multithreading. Thread e processi. Sincronizzazione tra thread. Segnali. Meccanismi di IPC. Scheduling. Gestione del tempo. Gestione della memoria. Gestione dell'I/O. Pattern per la programmazione di sistemi in tempo reale. Sistemi operativi real-time dedicati. Middleware per sistemi in tempo reale distribuiti.
Attività d'esercitazione
Esercitazioni in laboratorio relative alla programmazione di sistema multiprocesso in C/C++ nei sistemi operativi UNIX e Linux.
Esercitazioni in laboratorio con uso delle API POSIX e C++ per la programmazione multithread e real-time in ambiente Linux.
Bibliografia
I diversi argomenti affrontati nel corso sono trattati organicamente nei testi indicati di seguito:
A. Silberschatz, P.B. Galvin, G. Gagne, “Sistemi operativi”, settima edizione o successiva, Pearson Education Italia, 2006 (o successivo).
P. Ancilotti, M. Boari, “Programmazione concorrente e distribuita”, McGraw-Hill, 2007
J.W.S. Liu, Real-Time Systems, Prentice-Hall, 2000.
D. Butenhof, Programming with POSIX Threads, Addison-Wesley, 1997.
Testo con contenuti ulteriori, su programmazione concorrente in Java:
S.J. Hartley, "Concurrent Programming - The Java Programming Language", Oxford University Press, 1998.
Testo con contenuti ulteriori, su programmazione concorrente in C++:
A. Williams, "C++ Concurrency in Action", 2nd edition, Manning Publications, 2019.
Agli studenti frequentanti sono rese disponibili sul sito del corso, lezione per lezione, le diapositive utilizzate, che tuttavia non possono essere diffuse al di fuori del corso né ripubblicate.
Metodi didattici
Lezioni in aula con proiezione di diapositive, integrata da una significativa attività guidata di laboratorio (obbligatoria) su programmazione multiprocesso, concorrente, multithread e real-time.
Il corso si articola in circa 54 ore di lezioni in aula e 24 ore di esercitazioni assistite in laboratorio. La frequenza delle esercitazioni di laboratorio è obbligatoria.
Sono proposte prove intermedie ed assegnamenti pratici o teorici da svolgere a casa per mantenere gli studenti al passo ed esonerarli da parti dell'esame.
Il corso viene tenuto esclusivamente in presenza, nessuna attività didattica viene svolta a distanza.
Modalità verifica apprendimento
L'apprendimento viene verificato mediante una serie di prove pratiche, scritte e orali, in parte proposte come prove intermedie durante l'erogazione del corso. L'esame è superato solo quando tutte le prove sono state svolte con esito positivo:
1) Prova scritta di teoria e applicazione della schedulazione real-time (prima prova intermedia; durata 1 ora e 50 minuti).
2) Assegnamento pratico di programmazione multithread e real-time mediante thread POSIX o C++ (proposto durante le esercitazioni obbligatorie).
L’assegnamento viene proposto durante le esercitazioni, raggruppando gli studenti a coppie. Gli studenti sono assistiti in 2-3 esercitazioni successive (di due ore ciascuna) orientandone le fasi iniziali di progettazione dell’applicazione. Le coppie di studenti devono completare la realizzazione dell’applicazione real-time funzionante e conforme alla specifica entro una data prefissata (tipicamente entro 10 giorni dopo l’ultima esercitazione guidata). La consegna avviene in una sessione formale in presenza (seconda prova intermedia).
Per lo svolgimento e la consegna della prova è richiesto di applicare anche le competenze di programmazione multiprocesso proposte nella prima parte delle esercitazioni.
3) Prova scritta o pratica di programmazione concorrente (durata 2 ore).
4) Prova orale finale con discussione degli elaborati svolti dallo studente ed una o due domande su concetti generali di sistemi operativi e di programmazione concorrente proposti nel corso e non verificati nelle prove pratiche e scritte (durata 20-30 minuti).
La prova orale deve essere la prova conclusiva dell'esame.
Per chi non sostiene o non supera le prove in itinere, le prove scritte n. 1) e 3) possono essere sostenute anche assieme negli appelli ufficiali. Chi non ha superate la prova pratica n. 2) durante il corso deve concordare con il docente la modalità di svolgimento, in una data da stabilire.
La prova scritta n. 1) consente di verificare le conoscenze acquisite sui sistemi in tempo reale e i relativi algoritmi di schedulazione.
La prova pratica n. 2) consente di verificare sia l'apprendimento delle competenze applicative di capacità di programmazione di sistema e di progettazione di applicazioni multiprocesso e cliente-servitore, sia l'apprendimento delle competenze applicative di progettazione di applicazioni multi-thread e in tempo reale.
La prova scritta o pratica n. 3) consente di verificare le conoscenze acquisite sull'uso delle tecniche di programmazione concorrente e il relativo problem-solving.
La prova orale n. 4) consente di verificare complessivamente le conoscenze acquisite sui componenti dei sistemi operativi e sui fondamenti della programmazione concorrente.
Altre informazioni
Portale per il sito del corso: http://elly2024.dia.unipr.it
Il materiale didattico e di supporto è reso disponibile sul sito del corso lezione per lezione agli studenti frequentanti. Per motivi di copyright, si prega di non diffondere o ripubblicare all'esterno il materiale fornito.
Obiettivi agenda 2030 per lo sviluppo sostenibile
4 Istruzione di qualità
9 Industria, innovazione e infrastrutture