|
Letizia LEONARDI
Professore Ordinario Dipartimento di Ingegneria "Enzo Ferrari"
|
Insegnamento: Sistemi Operativi e Lab.
Ingegneria Informatica (D.M.270/04) (Offerta formativa 2020)
Obiettivi formativi
L'insegnamento ha come obiettivo formativo quello di fornire la conoscenza e la capacità di comprensione di base dei Sistemi Operativi introducendo alcuni aspetti della programmazione di sistema in UNIX relativamente sia al linguaggio comandi (Shell) e sia al linguaggio di programmazione C, applicandoli a progetti concorrenti -in ambiente locale- di complessità crescente.
Prerequisiti
Propedeuticità obbligatorie: Fondamenti di Informatica I e Lab., Fondamenti di Informatica II e Lab.
Propedeuticità consigliate: Inglese, Calcolatori Elettronici e Lab.
Programma del corso
Classificazione dei Sistemi Operativi. In particolare, sistemi multi-utente e multiprocesso.
Il Sistema Operativo come insieme di gestori delle risorse. Introduzione al concetto di processo/thread e loro gestore: scheduling; il problema del deadlock. Introduzione alla gestione della memoria e in particolare la memoria virtuale. Introduzione al concetto di file e direttorio e loro gestore: il File System a livello di organizzazione logica e fisica.
La programmazione di sistema utilizzando i linguaggi comandi. Il Bourne Shell di UNIX.
La programmazione di sistema utilizzando il linguaggio di programmazione C per UNIX. Le primitive di basso livello per l'accesso ai file (in particolare, open, creat, close, read, write e lseek) e le primitive per la creazione, comunicazione e sincronizzazione dei processi (in particolare, fork, exit, wait, pipe, signal e kill).
Laboratorio di Sistemi Operativi. Esercitazioni pratiche, in laboratorio, utilizzando computer provvisti di sistema operativo UNIX/LINUX. Verifica pratica della programmazione di sistema UNIX, utilizzando sia il linguaggio dello Shell che il linguaggio di programmazione C per arrivare allo svolgimento di un progetto completo di ricerca ricorsiva nel file system avente una parte in Shell e una in C che si coordinano l'un l'altra.
Metodi didattici
ATTENZIONE: Le lezioni teoriche verranno svolte a distanza in modo sincrono (streaming e video-registrate) a causa della situazione sanitaria COVID19, mentre le esercitazioni di laboratorio verranno svolte sempre a distanza in modo sincrono (ma senza video-registrazione), suddividendo gli studenti in almeno due gruppi. In base alla evoluzione dell'emergenza sanitaria COVID19 verrà valutata l'erogazione anche in presenza.
La metodologia didattica utilizzata per l’insegnamento si compone sia di lezioni frontali teoriche e sia di esercitazioni pratiche utilizzando Linux: la percentuale di ore di lezioni teoriche è 2/3 delle ore totali e quella di esercitazioni è 1/3.
Le lezioni affrontano aspetti teorici inerenti ai sistemi operativi in generale e in specifico al Sistema Operativo UNIX e aspetti pratici relativi alla programmazione di Sistema in una shell di Unix e utilizzando il Linguaggio di Programmazione C: le lezioni fanno uso oltre che di slide (fornite preventivamente agli studenti) anche di un Sistema Operativo Linux per l’esemplificazione delle nozione pratiche. Le esercitazioni (che solo se possibile si svolgeranno in un laboratorio informatico con postazioni di lavoro con dual boot) utilizzano il sistema operativo Linux, sono parte integrante dell’insegnamento e consentono agli studenti di esercitarsi individualmente nello sviluppo di programmi di sistema sia utilizzando una shell di Linux che il linguaggio di Programmazione C per Unix.
Sulla pagina Web (gestita direttamente dal docente) gli studenti possono trovare, oltre ai file pdf delle slide (protette da password di lettura che verrà comunicata agli studenti nella prima lezione), esempi di esercizi, tutti i testi delle prove d’esame e di alcuni di questi anche le relative soluzioni, utili per la auto-verifica dell’apprendimento.
Testi di riferimento
Materiale come slide, esercizi e testi di esame (e alcune soluzioni) sono disponibili via WEB alla URL: http://www.didattica.agentgroup.unimore.it/wiki/index.php/Sistemi_Operativi_e_Lab. (il punto finale è compreso nella URL).
Testi di riferimento possono essere:
HAVILAND K., GRAY D., SALAMA B., Unix System Programming, Casa Editrice Addison-Wesley, 1999.
BOURNE S. R., UNIX System V, Casa Editrice Addison-Wesley, 1990.
In alternativa la seconda parte del testo seguente contiene tutti gli argomenti del corso (mentre la prima parte puo' essere usata per un ripasso del Linguaggio C):
BELLAVIA G., CORRADI A., LEONARDI L., Fondamenti di Informatica II: Dispense del corso (seconda edizione), Casa Editrice Esculapio, Progetto Leonardo, 1994.
Per un eserciziario relativo al Linguaggio C si segnala: LEONARDI L.: Linguaggio C: Raccolta di esercizi e relative soluzioni, Ed. Esculapio - Progetto Leonardo, 1996.
Verifica dell'apprendimento
La verifica dell’apprendimento (l'esame) si compone di una prova scritta, che viene svolta utilizzando un PC Linux. La durata della prova può variare da un minimo di 110 minuti (se svolta in remoto con il proprio PC) ad un massimo di 120 minuti (se svolta in presenza usando un PC del laboratorio). La prova scritta comprende un singolo esercizio che richiede la soluzione di un problema di sincronizzazione in ambito locale, ottenuta facendo riferimento al sistema operativo UNIX, che si compone di due parti:
1. una parte in Bourne Shell che deve risolvere un sottoproblema di esplorazione nel file system;
2. una parte in linguaggio C che deve risolvere un sottoproblema concorrente facendo uso delle primitive di gestione dei processi proprie di UNIX.
Dato che lo svolgimento della prova scritta avviene in laboratorio, lo studente dovrà produrre un insieme di file corrispondenti alla soluzione dell'esercizio: i file che risolvono il primo sottoproblema DEVONO avere il nome che termina con .sh, mentre i file che risolvono il secondo problema DEVONO avere il nome che termina con .c per il file che contiene il sorgente in linguaggio C e il nome makefile per quello che verrà usato dal comando make. Saranno corrette SOLO le soluzioni che non conterranno né errori di sintassi nella parte Shell e C né errori di collegamento (linking) nella parte C.
Durante lo svolgimento dell'esame possono essere consultati appunti cartacei o in formato elettronico (ma non online), così come possono essere usati file precedentemente sviluppati.
La sufficienza è rappresentata da un voto maggiore o uguale a 18/32: il voto massimo di ogni parte (Shell e C) è di 16/32; sono previste penalizzazioni in caso di insufficienza di una delle parti che porta però ad un voto sufficiente.
NOTA BENE: In caso di elevati numeri di studenti, potrebbe essere introdotto un test di sbarramento a risposte multiple (di cui solo una sufficiente) sui comandi UNIX/Linux; durante il test di sbarramento non sarà possibile consultare appunti!
Saranno organizzate anche due verifiche in itinere (la prima sulla parte in Bourne shell e la seconda sulla parte in C, cui si può partecipare solo se superata la prima verifica): in questo caso, la valutazione finale dell'insegnamento deriverà dalla media arrotondata per difetto delle due prove.
ATTENZIONE: Le prove potrebbero essere svolte in presenza o a distanza a seconda dell'evoluzione della situazione COVID19. Nel caso di svolgimento a distanza, le prove si svolgeranno sotto la supervisione video del docente e dei suoi collaboratori, come specificato nella opportuna sezione di Dolly 2020.
Risultati attesi
Conoscenza e comprensione
- Conoscere e comprendere i fondamenti dei sistemi operativi, con particolare riferimento a UNIX/Linux e alla relativa
programmazione di sistema.
Capacità di applicare conoscenza e comprensione
- Sapere utilizzare i principali comandi shell di UNIX/Linux e avere la capacità di sviluppare programmi di script in Shell e
programmi concorrenti usando il linguaggio di programmazione C.
Autonomia di giudizio
- autonomia di giudizio nell'analizzare e progettare sistemi complessi, valutando l'impatto delle soluzioni informatiche nel contesto applicativo, sia relativamente agli aspetti tecnici che agli aspetti organizzativi e dimostrando di partecipare attivamente al processo decisionale in contesti anche interdisciplinari.
- autonomia di giudizio nel valutare le implicazioni economiche, sociali ed etiche associate alle soluzioni individuate.
Abilità comunicative
- interagire efficacemente con interlocutori sia non specialisti che specialisti di diversi settori applicativi al fine di comprenderne le specifiche esigenze per la realizzazione di sistemi complessi;
- descrivere a tali interlocutori in modo chiaro e comprensibile informazioni, idee, problemi e soluzioni oltre che aspetti tecnici.
Capacità di apprendimento
- capacità di apprendimento che consente di affrontare in modo efficace le mutevoli problematiche lavorative connesse con l'innovazione propria dell'area dell'Ingegneria Informatica;
- capacità di riconoscere la necessità di apprendimento autonomo durante tutto l'arco della vita, dato l'elevato tasso di innovazione tecnologica e metodologica nell'area dell'Ingegneria Informatica;
- capacità di acquisire in modo autonomo nuove conoscenze specialistiche dalla letteratura scientifica e tecnica del settore, sia nell'ambito delle tematiche approfondite nel proprio percorso formativo, sia in altri ambiti dell'Ingegneria Informatica.