Nuova ricerca

Silvia CASCIANELLI

Ricercatore t.d. art. 24 c. 3 lett. A
Dipartimento di Ingegneria "Enzo Ferrari"

Insegnamento: Sistemi Operativi e Lab.

Ingegneria Informatica (MO) (Offerta formativa 2022)

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à fortemente consigliate: Fondamenti di Informatica I e Lab., Fondamenti di Informatica II e Lab.
Propedeuticità consigliate: Inglese, Calcolatori Elettronici e Lab.

Programma del corso

1) Introduzione (circa 1 CFU):
- 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 directory e loro gestore: il File System a livello di organizzazione logica e fisica.
2) La programmazione di sistema utilizzando i linguaggi comandi (circa 2 CFU): oltre ai tipici comandi utilizzati da linea di comando, si presenterà la sintassi per scrivere degli script, facendo anche uso della ricorsione, utilizzando una Shell di UNIX.
3) La programmazione di sistema utilizzando il linguaggio di programmazione C per UNIX (circa 3 CFU). In dettaglio, 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).
4) Laboratorio di Sistemi Operativi (circa 3 CFU): Esercitazioni pratiche, in laboratorio, utilizzando computer provvisti di sistema operativo UNIX/LINUX. Le esercitazioni avranno come obiettivo la 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

La metodologia didattica utilizzata per l’insegnamento si compone sia di lezioni frontali in aula e sia di esercitazioni pratiche in laboratorio: la percentuale di ore di lezioni in aula è 2/3 delle ore totali e quella di lezioni in laboratorio è 1/3.
Le lezioni in aula 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 lezione fanno uso oltre che di slide (fornite preventivamente agli studenti) anche di un video-proiettore con accesso ad un Sistema Operativo Linux per l’esemplificazione delle nozione pratiche. Le esercitazioni, che si svolgono in un laboratorio informatico con postazioni di lavoro con dual boot utilizzando il sistema operativo Linux o PC portatili personali (sempre con 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 (protetti 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 lucidi, 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 un test di sbarramento e di una prova scritta, che vengono svolti entrambi utilizzando un PC Linux.
In particolare, il test/quiz di sbarramento è composto da 20 domande a risposte multiple (di cui solo una sufficiente) sui comandi UNIX/Linux. Essendo solo un test di sbarramento non produce un voto, ma consente l'accesso alla prova scritta. Il test è considerato superato con 15/20 risposte giuste. La durata del test è di 20 minuti.
Per quanto riguarda la prova scritta, la durata 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 o personale). 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 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 con l'utilizzo di un PC Linux, 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.
La sufficienza della prova scritta è 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 possono portare comunque ad un voto sufficiente.
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 e consultati i manuali presenti in Linux.
Potranno essere organizzate anche due verifiche in itinere (la prima con test di sbarramento e un esercizio solo sulla parte in Shell e la seconda con un esercizio solo sulla parte in C, cui si può partecipare solo se superata la prima prova in itinere): in questo caso, la valutazione finale dell'insegnamento deriverà dalla media arrotondata per difetto delle due prove. Nel caso di superamento della prima prova in itinere, la seconda parte dell'esame potrà essere svolta in una qualunque delle date fissate per l'esame completo.
NOTA BENE: allo studente che risulti sufficiente ad una prova NON sarà consentito ripetere la prova per migliorare il voto! Nel documento http://www.didattica.agentgroup.unimo.it/didattica/SOeLab/GiustificazionePerMancanzaDiPossibilit%C3%A0RifiutoVoto.pdf si possono essere trovati i riferimenti normativi UNIMORE a giustificazione di ciò.
PRECISAZIONI:
a) Nel caso uno studente risulti insufficiente è obbligatorio prendere visione degli errori commessi (per cercare di non commetterli nuovamente); tale visione DEVE avvenire al massimo entro 2/3 settimane dalla pubblicazione/comunicazione dei risultati e, comunque, almeno 2/3 settimane prima della scadenza per la iscrizione all'appello successivo!
b) Nel caso uno studente si ritiri può chiedere la correzione della sua prova; tale correzione verrà di norma effettuata dopo aver terminato la correzione degli studenti che hanno consegnato.

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.