Obiettivi formativi
L’obiettivo del corso è fornire allo studente la capacità di comprendere come i
sistemi operativi gestiscano e controllino le risorse del sistema di elaborazione con
obiettivi di efficienza e facilità d’uso, e in particolare:
- il ruolo del sistema operativo come intermediario tra le applicazioni e l’hardware
- la necessità di sovrapporre attività di CPU e di I/O per aumentare l’efficienza
- il concetto di processo e i principali modelli di interazione tra processi
- i criteri e gli algoritmi di scheduling della CPU per sistemi interattivi
- le nozioni di base per l’utilizzo di UNIX/Linux e per la gestione dei comandi
- le principali chiamate di sistema offerte da UNIX/Linux alle applicazioni.
Le principali capacità di applicare le conoscenze e comprensione elencate risultano
essere:
- analizzare e valutare le caratteristiche dei sistemi operativi general-purpose
- analizzare semplici interazioni tra processi in ambiente globale e individuare forme
di sincronizzazione attraverso semafori
- valutare le prestazioni dei principali algoritmi di scheduling della CPU per sistemi
interattivi con un workload prefissato
- analizzare interazioni tra processi UNIX, individuare gli strumenti di comunicazione
interprocesso e le primitive di sistema necessari, e realizzare programmi in C che li
utilizzano.
Prerequisiti
- Fondamenti di informatica + Laboratorio di programmazione
- Fondamenti di programmazione
Contenuti dell'insegnamento
Parte I (Teoria - 28 ore)
Introduzione ai sistemi operativi. Sistemi batch, time-sharing, spooling (2 ore)
Parallelizzazione di elaborazione e I/O. Il sistema di interruzione: interruzione da
dispositivo e da timer. Gestione delle interruzioni. Modello di un semplice sistema
operativo e tecniche di incremento delle prestazioni (2 ore)
Multiprogrammazione e modello a processi. Sistema di protezione e sicurezza del SO. Modi di
funzionamento della CPU. Chiamate di sistema. Gestione dell'I/O (4 ore)
Struttura a livelli del sistema operativo. Virtualizzazione. Cenni ai container (4 ore)
Concetto di processo. Stato del processo. Descrittore del processo.
Processi concorrenti. Strumenti di programmazione concorrente in Java e con le thread. (4 ore)
Modello di interazione a memoria condivisa. Mutua esclusione
e sezioni critiche. Semafori e primitive di sincronizzazione.
Cooperazione e competizione tra processi mediante semafori. (4 ore)
Il modello di interazione a scambio di messaggi e le primitive send/receive. (3 ore)
Concetto di Deadlock e tecniche di gestione. (2 ore)
Algoritmi di scheduling della CPU. (3 ore)
Parte II (UNIX/Linux - 44 ore)
Introduzione a UNIX e Linux.
Struttura del file system di UNIX. Diritti e meccanismi di protezione. (2 ore)
Principali comandi di sistema. Redirezione e piping di comandi. Interpreti comandi.
Modalità di esecuzione foreground/background. (2 ore)
Organizzazione fisica del file system. L'immagine in memoria di un processo UNIX.
(2 ore) Sviluppo di programmi in UNIX/LINUX. (2 ore)
Primitive per la gestione dei file e dell'I/O. (2 ore)
Primitive per la gestione dei processi. Creazione, esecuzione e terminazione. (4 ore)
Sincronizzazione e comunicazione tra processi: segnali, pipe/FIFO (4 ore)
Introduzione al modello ISO OSI e ai protocolli della suite TCP/IP di Internet. Cenni a IPv6. (2 ore) IPC tramite socket e server concorrenti. Esempi (4 ore)
Altre primitive: select, epoll (2 ore)
Esercitazioni in laboratorio informatica di base (Linux Ubuntu) su interazione utente e programmazione di sistema Linux. (18 ore)
Programma esteso
Teoria (I parte)
Introduzione al corso. Programma e modalità di esame. Introduzione a Linux e alle
possibilità di installazione. SO come gestore di risorse. Attività del SO per gestione
risorse. Tipi e utenti di SO. SO proprietari e standard. Introduzione a evoluzione
storica dei sistemi di calcolo e dei SO. Sistemi Batch. Time Sharing. Spooling.
Gestione I/O Gestione I/O a polling. Sovrapposizione di attività di I/O. Gestione
delle interruzioni.
Multiprogrammazione. Concetto e stati di un processo. Gestione processi. PCB.
Commutazione tra processi. Sistema di protezione. Gestione del cambio di
contesto. System calls. Struttura di un SO con esempi (UNIX, MSDOS, Windows
NT/7). Concetti e tecniche di virtualizzazione. La virtualizzazione a livello di SO con i container. Nucleo del SO.
Modelli di interazione tra processi. Modello ambiente globale. Strumenti per la
programmazione concorrente: thread e Java. Interazione tra processi. Esempi
di interferenza. Mutua esclusione. Sezioni critiche. Semafori. Primitive wait e signal.
Atomicità semafori e di wait/signal. Semafori per interazione
produttore/consumatori. Modello ad ambiente locale. Classificazione
designazione/sincronizzazione. Modalità di designazione diretta/indiretta.
Sincronizzazione send e receive. Chiamate a procedura remota.
Deadlock e relative tecniche di gestione.
Livelli di scheduling. Criteri per la valutazione degli algoritmi. Algoritmi di scheduling
della CPU (FCFS, SJF, Priorità, Round-robin, code multilivello). Metodi per la
valutazione. Scheduling UNIX e in Linux.
Introduzione alla sicurezza informatica
UNIX (II parte)
Introduzione a UNIX. File system. Diritti di accesso a file/direttori. Principali comandi
UNIX. Filtri. Redirezione I/O e piping. Esecuzione comandi da shell. Modalità di
esecuzione dei comandi. Metacaratteri. Controllo espansione riga di comando.
Script: sintassi ed esempi. Esercitazione UNIX in laboratorio su file system e
comandi.
Strumenti di sviluppo UNIX.
Organizzazione fisica del file system. L'immagine in memoria di un processo UNIX.
Argomenti di invocazione e
ambiente Primitive per la gestione dell'I/O (open, close, read, write, lseek, etc.).
Esempi. Esercitazioni UNIX in laboratorio su primitive di I/O. Primitive per la gestione dei processi (fork, wait, exec). Esercitazioni UNIX in laboratorio su primitive per la gestione dei processi. Assegnamento opzionale su gestione I/O e processi.
Gestione segnali UNIX. Primitive per la gestione inaffidabile dei segnali. Problemi
della gestione inaffidabile. Primitive per la gestione affidabile dei segnali. Esempi.
Comunicazione via pipe. Esempi. Esercizi su segnali e pipe. Comunicazione via
FIFO. Esercitazioni UNIX in laboratorio su pipe e segnali.
Introduzione al modello ISO OSI e ai protocolli della suite TCP/IP di Internet. Cenni a IPv6.
Comunicazione via socket. Tipi di socket. Cenni a TCP e UDP. Primitive per la
gestione delle socket. Socket connesse. Server concorrente. Socket datagram.
Esempi. Primitiva select. Esercitazioni UNIX in laboratorio su gestione socket.
Altre primitive di sistema: select e epoll.
Esercizi d'esame.
Bibliografia
Tesi consigliati:
Sono rese disponibili sul sito del corso, lezione per lezione, le diapositive utilizzate
in aula e tracce di esercizi risolti.
Libri di testo suggeriti:
* Sistemi operativi - Concetti ed esempi - 8/ed, A. Silberschatz, P. B. Galvin, G.
Gagne. Pearson Education 2009, ISBN 9788871925691
* Sistemi Operativi 2/ed, P. Ancilotti, M. Boari, A. Ciampolini, G. Lipari. McGraw
Hill, ISBN: 9788838664328,
*GaPiL -- Guida alla Programmazione in Linux (http://gapil.truelite.it)
Metodi didattici
Lezioni frontali su teoria e UNIX/Linux.
Esercitazioni in laboratori informatica di base (Linux Suse 11 virtualizzato con
Virtualbox) su interazione utente e programmazione di sistema in Linux.
Modalità verifica apprendimento
Una prova scritta con domande aperte sulla parte di teoria (Parte I).
Una prova pratica al calcolatore costituita da un esercizio in C/C++ sulla interazione
tra processi UNIX (Parte II). Lo studente deve fornire una soluzione funzionante
ragionevolmente aderente alle specifiche per ottenere una valutazione sufficiente.
Entrambe le prove devono essere superate ai fini del superamento dell'esame.
Prima della prova pratica lo studente che non lo avesse già superato dovrà sostenere
un test su Elly, obbligatorio ma non vincolante, sulla programmazione Unix.
Durante il corso è inoltre proposto un assegnamento opzionale di programmazione
sulla gestione di processi UNIX, che può contribuire ad incrementare il voto della
prova pratica, dando pertanto maggior peso ad essa nella valutazione finale.
Gli studenti possono sostenere il giorno dell'esame una sola o entrambe le prove. I
risultati parziali conseguiti rimangono validi per tutto l'anno accademico (sessione di
gennaio/febbraio compresa). In caso di ripetizione di una prova già superata (teoria
e/o UNIX), rimane valido l'ultimo voto ottenuto.
Il voto finale è dato dalla media dei risultati ottenuti nei due tipi di prova,
eventualmente integrato con il contributo degli assegnamenti proposti durante il
corso.
Altre informazioni
Portale per il sito del corso su http://elly.dia.unipr.it
Il materiale didattico e di supporto è reso disponibile sul sito del corso lezione per
lezione agli studenti frequentanti.
Obiettivi agenda 2030 per lo sviluppo sostenibile