Struttura e principali funzioni di un sistema operativo; processi, thread e scheduling della CPU; caratterizzazione e gestione dello stallo; gestione della memoria principale e virtuale; interfaccia e implementazione del file system; gestione dei dispositivi periferici e della memoria secondaria.
Uso interattivo della shell in UNIX/Linux. Il linguaggio C. UNIX/Linux system call. Programmazione di sistema e comunicazione tra processi in ambiente UNIX/Linux. Cenni di 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.
Laboratorio (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
Conoscenza e capacità di comprensione:
struttura interna dei sistemi operativi; funzionalità delle componenti dei sistemi operativi; problematiche inerenti progettazione e implementazione delle varie componenti dei sistemi operativi. Conoscenza e capacità di comprensione applicate:
comprensione approfondita dei legami hardware/software e dell'interazione dei sistemi operativi con i programmi utente; uso più consapevole ed efficace dei sistemi operativi e degli strumenti che forniscono.
Prerequisiti
Corsi vincolanti: Programmazione, Architetture degli Elaboratori
Metodi Didattici
Lezioni in aula: 48 ore.
Attività di laboratorio: 36 ore.
Altre Informazioni
Frequenza alle lezioni in aula e alle attività di laboratorio: raccomandata.
Strumenti a supporto della didattica UNIFI E-Learning: https://e-l.unifi.it/.
Ricevimento studenti Prof. Pugliese: di solito il mercoledì dalle 14.30 alle 16.30, prendere un appuntamento tramite e-mail (rosario.pugliese@unifi.it).
Ricevimento studenti Prof. Ceccarelli: per appuntamento. Contattare il docente per e-mail (andrea.ceccarelli@unifi.it).
Modalità di verifica apprendimento
L'esame è composto di due prove, una riguardante la parte di teoria (con peso 2/3 sulla determinazione del voto finale) ed una riguardante la parte di laboratorio (con peso 1/3).
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. Su richiesta dello studente o del docente, nel caso in cui lo studente abbia conseguito un punteggio pari o superiore a 17 nello scritto, è possibile sostenere anche una prova orale. In questo caso, il voto della prova di teoria è determinato tramite media aritmetica dei punteggi conseguiti nella prova scritta e nell'orale.
La prova di teoria mira a valutare la comprensione della struttura interna dei sistemi operativi, delle funzionalità delle loro componenti principali e dei problemi inerenti alla loro progettazione e implementazione. Oltre alla conoscenza degli argomenti presentati a lezione e alla capacità di applicare le conoscenze acquisite per la risoluzione di problemi, saranno altresì valutate la chiarezza dell’esposizione, l’uso appropriato del lessico specialistico e la capacità di mettere in relazione fra loro argomenti diversi del programma.
La prova di laboratorio 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.
A causa dell'emergenza COVID-19, le modalità di esame in presenza potranno essere commutate in modalità a distanza, seguendo eventuali disposizioni di Ateneo. In aggiunta, la prova scritta potrà essere commutata in una prova orale. Eventuali modifiche saranno comunicate esclusivamente tramite il sito del corso.
Programma del corso
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.
Modulo di laboratorio: 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. Programmazione Kernel.