L'obiettivo del corso è fornire allo studente le conoscenze fondamentali dei sistemi operativi, trattando sia gli aspetti teorici sia le tecniche di base e avanzate di programmazione di un sistema operativo.
Le principali conoscenze acquisite saranno: - struttura di un sistema operativo - organizzazione di un sistema operativi multi processo - concetto di processo e di processore virtuale e il cambio di contesto - concetto e realizzazione della memoria virtuale - struttura dei dispositivi di IO
Le principali abilità acquisite saranno: - capacità di programmare sistemi concorrenti e multi-tasking - analisi delle prestazioni dei sistemi operativi - uso del sistema operativo Linux - programmazione multi-thread e multi-processo
Prerequisiti
Si consiglia di avere frequentato il corso di "Architettura degli Elaboratori" e di aver acquisito la capacita' di utilizzare i linguaggi di programmazione C e Java forniti dai corso di "Programmazione e laboratorio" e "Linguaggi di Programmazione".
Metodi didattici
Il corso prevede 80 ore (10 CFU) di didattica divise in 50 ore di lezioni di teoria e 30 ore di lezioni di laboratorio. Il corso è organizzato mediante lezioni frontali ed esercitazioni in laboratorio assistite dal docente. Verranno fornite video-lezioni registrate.
Verifica Apprendimento
L'esame è suddiviso in: - prova in laboratorio, che prevede lo svolgimento di esercizi su programmazione di sistema Unix (linguaggio C con System Call), programmazione multi-thread in Java e programmazione in Shell di Bourne; - prova orale su tutti gli argomenti del corso.
Le 3 parti della prova in laboratorio sono indipendenti e possono anche essere svolte in sessioni diverse. Il voto della parte di laboratorio è la media pesata delle 3 prove (voto massimo per ciascuna prova 30): 50% programmazione di sistema, 25% shell, 25% Java. Il superamento della parte di laboratorio prevede l'ottenimento di almeno 18/30 in ciascuna prova. E' consentito consultare libri e copie delle dispense (non si può consultare il codice di esercizi e prove di esame risolte) solo per la parte di programmazione di sistema in C, per la parte di shell è consentito accedere al solo man, per la parte di Java è consentito accedere al solo javadoc. Il tempo previsto per la prova è di circa 3.5 ore, suddiviso tra le tre prove di C, shell e Java in modo proporzionato alla difficoltà di ciascuna prova.
E' possibile sostenere la prova orale solo se si è superata la prova in laboratorio. Il voto finale è determinato a partire dal voto della prova in laboratorio, che può essere sia aumentato che diminuito (al più +/-2 punti) in sede di orale a seconda delle conoscenze dimostrate.
Testi
1. Sistemi operativi 2/ed - Paolo Ancilotti, Maurelio Boari, Anna Ciampolini, Giuseppe Lipari - McGraw-Hill 2. I moderni Sistemi Operativi 3/ed - Andrew S. Tanenbaum - Pearson Prentice Hall
Contenuti
- Introduzione ai sistemi operativi: organizzazione, evoluzione e funzioni principali di un sistema operativo. - Processi, Thread and Scheduling: concetto di processo e di thread, gestione dei processi, context switch, algoritmi di scheduling, sincronizzazione di processi, creazione e terminazione di processi, comunicazione tra processi. Gestione di processi e thread in Unix e Linux. - Gestione della memoria: tecniche di gestione della memoria (a partizioni fissi e variabili, pagina, segmentata) gestione degli spazi virtuali, indirizzamento multi-livello, gestione della memoria in Unix/Linux. Algoritmi di rimpiazzamento. - Organizzazione del file-system: concetto di file e directory, organizzazione di file e directory, operazioni sui file, controllo degli accessi, organizzazione del file-system in Unix e Linux.