Il corso è una introduzione ai principi, al progetto e alla realizzazione dei moderni sistemi operativi. Argomenti: funzioni di un SO; processi, thread e scheduling della CPU; gestione dello stallo; gestione della memoria principale e virtuale; interfaccia e implementazione del file system; gestione dei dispositivi periferici e della memoria secondaria; ambiente UNIX/Linux: uso interattivo della shell; system call; programmazione di sistema e comunicazione tra processi; programmazione Kernel.
Teoria
Testo adottato:
Sistemi Operativi. A.Silberschatz & P.B.Galvin & G.Gagne, 10ed., Addison-Wesley.
Testi di consultazione:
- Sistemi Operativi. P.Ancillotti & M. Boari & A. Ciampolini & G. Lipari, 2ed., McGraw-Hill.
- I Moderni Sistemi Operativi. A.S. Tanenbaum & H. Bos, 4ed., Pearson.
Attività di esercitazione laboratoriale
Testi di consultazione:
- The Linux Command Line, W. Shotts.
- C didattica e programmazione, A. Kelley, I. Pohl, Pearson, 2nd Edition.
- Understanding the Linux kernel, D. Bovet, M. Cesati, O’Reilly.
- J. Erickson, L’arte dell’Hacking, vol 1, 2008.
Obiettivi Formativi
Alla conclusione del corso, lo studente dovrebbe aver acquisito conoscenze dei principi alla base dei sistemi operativi moderni e competenze per comprendere e analizzare criticamente le problematiche legate alla loro progettazione e realizzazione. Inoltre, avrà una chiara comprensione dell'importanza di un sistema operativo in un generico sistema di calcolo e delle sue funzioni, e delle tecniche e metodologie, sia software che hardware, necessarie per realizzare tali funzioni.
In particolare, lo studente dovrebbe:
[Conoscenza e comprensione] conoscere e comprendere: la struttura interna dei sistemi operativi; le funzionalità delle componenti dei sistemi operativi; le interazioni di tali componenti con i programmi utente e con l'hardware sottostante; le problematiche inerenti progettazione e realizzazione delle varie componenti dei sistemi operativi.
[Capacità di applicare conoscenza e comprensione] essere in grado di: usare le conoscenze acquisite per la risoluzione di esercizi; usare consapevolmente ed efficacemente i sistemi operativi e gli strumenti che forniscono.
[Esprimere giudizi] saper valutare e confrontare in maniera critica metodi e tecniche alternative (es. realizzazioni differenti di una stessa componente).
[Abilità comunicative] saper presentare concetti inerenti i sistemi operativi in modo chiaro e competente.
Prerequisiti
Corsi vincolanti: Programmazione, Architetture degli Elaboratori.
Metodi Didattici
Lezioni di teoria, con l’uso di slide: 48 ore.
Attività di esercitazione laboratoriale: 36 ore.
Altre Informazioni
Il corso si svolge presso il Centro Didattico Morgagni (Viale Morgagni 40-44, Firenze), secondo l'orario delle lezioni previsto (si veda https://kairos.unifi.it/agendaweb/). La frequenza alle lezioni di teoria e alle esercitazioni laboratoriali non è obbligatoria ma è fortemente consigliata. Il sito del corso è disponibile sulla piattaforma di Ateneo (https://e-l.unifi.it/).
Ricevimento studenti Prof. Pugliese: di solito il giovedì dalle 14.00 alle 16.00, prendere un appuntamento tramite e-mail (rosario.pugliese@unifi.it).
Modalità di verifica apprendimento
L'esame è composto da due prove, una riguardante la parte di teoria ed una riguardante l’attività di esercitazione laboratoriale. La valutazione di ciascuna prova è espressa con un voto in trentesimi, con eventuale lode. Una prova si considera superata (con esito positivo) se il voto assegnato è almeno 18. Le due prove possono essere sostenute in un ordine qualsiasi, purché entrambe nello stesso anno accademico, pena l'annullamento dell'unica prova superata. A condizione che entrambe le prove siano superate con esito positivo, il voto finale sarà determinato dalla media ponderata dei voti, assegnando peso 2/3 al voto della parte di teoria e 1/3 al voto dell’attività di esercitazione laboratoriale.
Ogni obiettivo formativo è valutato in almeno una delle due prove che compongono l'esame.
La prova di teoria consiste in un esame scritto che verte su tutti gli argomenti del programma svolto a lezione. La prova comprende sia domande di teoria sia esercizi da risolvere tramite l'applicazione pratica della teoria. Il voto è determinato dalla somma dei punteggi conseguiti nelle singole domande/esercizi; tali punteggi, a loro volta, sono assegnati sulla base della complessità delle domande/esercizi e dell’accuratezza delle risposte fornite. Su richiesta del docente o dello studente, nel caso in cui questi abbia conseguito un punteggio pari o superiore a 16 nello scritto, è possibile sostenere anche una prova orale. In questo caso, il voto della prova di teoria è determinato tramite media aritmetica dei voti conseguiti nella prova scritta e nell'orale. La prova orale consiste di domande che possono riguardare tutti gli argomenti del programma svolto a lezione e il suo voto è determinato sulla base dell’accuratezza delle risposte fornite alle domande poste dal docente.
La prova di teoria mira a valutare la conoscenza e la comprensione da parte dello studente degli argomenti trattati durante le lezioni in aula, la sua capacità di affrontare in modo critico e approfondito tali argomenti e le sue competenze nell'utilizzare le conoscenze acquisite per la risoluzione di esercizi. La prova mira inoltre a valutare la chiarezza dell’esposizione, l’uso appropriato del lessico specialistico e la capacità di mettere in relazione fra loro in maniera critica metodi e tecniche alternative.
La prova relativa all’attività di esercitazione laboratoriale consiste in i) sviluppare un progetto software, con una breve relazione, in gruppi di massimo 3 studenti, e ii) una prova orale che include la discussione del progetto e la verifica della conoscenza degli argomenti trattati nel modulo di laboratorio. Il voto della prova di laboratorio è determinato dalla media dei punteggi conseguiti nella valutazione del progetto software e nella prova orale. Il progetto è valutato secondo i criteri: i) qualità della relazione; ii) qualità del codice; iii) qualità della struttura e organizzazione dei file; iv) qualità del processo di compilazione; v) corretto comportamento funzionale del progetto. La verifica degli argomenti trattati nel corso tramite prova orale, una volta assodato che il progetto e la relativa discussione sono sufficienti, si basa su due insiemi di domande (GRUPPO A, composto da 20 domande, e GRUPPO B, composto da 80 domande), che saranno resi disponibili sul sito del corso. Le domande sono da considerarsi come argomenti, su cui possono essere richiesti eventuali approfondimenti. Come condizione necessaria per il superamento della prova orale, non sono ammesse lacune nella risposta alle domande del GRUPPO A. Rispondere soltanto a domande del GRUPPO A permette di ottenere un punteggio per la parte del modulo di laboratorio non superiore a 20.
Programma del corso
Teoria:
Obiettivi e compiti principali di un sistema operativo. Gestione delle risorse. Interrupt. Servizi di un SO. Interfacce utente. System call e API. Modello concorrente e processi. Diagramma degli stati. Scheduling dei processi. Operazioni sui processi. Processi e thread. Modelli di multithreading. Gestione della CPU. Criteri e algoritmi di Scheduling. Stallo: caratterizzazione e metodi di gestione. Gestione della memoria principale. Spazi di indirizzi logici e fisici. Swapping. Memoria partizionata. Segmentazione. Paginazione. Algoritmi di sostituzione delle pagine. Gestione della memoria secondaria. Il file system: interfaccia e realizzazione. Directory e file. Metodi di accesso e di allocazione dei file. Gestione dello spazio libero. Gestione di un dispositivo di I/O: polling, interrupt, DMA. Struttura e gestione dei dischi. Politiche di scheduling delle richieste al disco.
Attività di esercitazione laboratoriale:
Comandi di shell in UNIX/Linux. Il linguaggio di programmazione C. UNIX/Linux system call. Programmazione di sistema e comunicazione tra processi in ambiente UNIX/Linux. Concetti di base di amministrazione dei sistemi UNIX/Linux. Cenni di Programmazione Kernel.