Obiettivo principale del corso è di fornire le conoscenze di base di un
moderno sistema operativo mettendo in luce le sue principali
funzionalità.
Il linguaggio Java è usato nel corso per fornire esempi di programmazione
multithread e per risolvere problemi di sincronizzazione tra processi
mediante l'uso di semafori e metodi sincronizzati.
La maggior parte degli argomenti del corso sono trattati in:
- Sistemi Operativi: Concetti ed esempi, settima edizione, Pearson
Addison-Wesley, A.Silberschatz, P. Galvin, G. Gagne.
Obiettivi Formativi
Il corso si pone un duplice obiettivo: da un lato, sono fornite le
conoscenze relative alla struttura ed alle modalità di funzionamento dei
moderni sistemi operativi; dall’altro, sono affrontate le problematiche di
programmazione relative all’utilizzo delle funzionalità che il sistema
operativo mette a disposizione di un utente programmatore.
Conoscenza dei diversi aspetti del funzionamento di un moderno sistema
operativo.
Conoscenze di base del linguaggio Java e suo utilizzo per la soluzione di
problemi di programmazione multithread e concorrente.
Prerequisiti
La conoscenza della programmazione e delle architetture dei calcolatori
come acquisite nei corsi di Fondamenti di Informatica I e di Calcolatori
Elettronici, costituiscono prerequisiti utili alla comprensione dei contenuti
del corso.
1. Introduzione
Introduzione ai Sistemi Operativi (rif.[silberschatz-osc], Cap.1) -
Cos'e' un Sistema Operativo: vista dell'utente e del sistema. Sistemi
mainframe: sistemi batch, sistemi multiprogrammati e sistemi timesharing. Personal Computer. Sistemi multiprocessore. Sistemi distribuiti:
client-server, peer-to-peer. Sistemi real time. Sistemi palmari.
Struttura di un sistema di calcolo (rif.[silberschatz-osc], Cap.2) -
Operazioni del sistema: bootstrap, interruzioni, system call. Struttura
dell'I/O: gestione con interrupt sincroni e asincroni. Protezione hardware: modo utente e modo sistema, protezione dell'I/O, protezione della
memoria, protezione della CPU.
Struttura del Sistema Operativo (rif.[silberschatz-osc], Cap.3) -
Struttura e funzioni di un sistema operativo: gestione dei processi,
gestione della memoria principale, gestione dei file, gestione dei
dispositivi di I/O, gestione della memoria secondaria. Struttura dei sistemi
operativi: struttura semplice, struttura stratificata, microkernel. Macchine
virtuali.
2. Le basi del linguaggio Java
Java (rif.[dispense-java]) -
La tecnologia Java e la Java Virtual Machine. Classi e oggetti. Passaggio di
parametri. Array. Gestione delle eccezioni. Classi derivate. Interfacce.
Polimorfismo.
3. Gestione dei processi
I processi (rif.[silberschatz-osc], Cap.4; [gapil], Cap.2) -
Modello della multiprogrammazione. Concetto di processo. Scheduling
dei processi. Operazioni sui processi. I processi in Linux. Le system call
fork(), exec(), wait() e exit(). Esempi in linguaggio C.
I threads (rif.[silberschatz-osc], Cap.5; [java-threads], Cap.1,2) -
Concetto di thread. Modelli multithreading: molti-a-uno, uno-a-uno, moltia-molti. Le system call fork() e exec() per i thread. Cancellazione,
gestione dei segnali e pool di thread. Threads in Java: la classe Thread e
l'interfaccia Runnable. Scheduling dei threads in Java.
Scheduling della CPU (rif.[silberschatz-osc], Cap.6; [dispensescheduling_rt]; [dispense-scheduling_linux]; [gapil], Cap.3) -
Cicli di I/O e CPU burst. Scheduler della CPU: scheduling di tipo
preemptive e non. Il dispatcher. Criteri di scheduling. Algoritmi di
scheduling: first-come first-serverd (FCFS), shortest-job-first (SJF),
shortest remaining time first (SRTF), scheduling con priorita' e aging,
round-robin (RR), scheduling a code multiple e code multiple con
feedback. Scheduling di piu' processori. Lo scheduling di Linux.
Algoritmi di scheduling real time: rate monotonic scheduling e earliest
deadline first. Inversione di priorita'.
Sincronizzazione tra processi (rif.[silberschatz-osc], Cap.7; [dispensesoftware]; [java-threads], Cap.3,4) -
Introduzione. Il problema della sezione critica: soluzioni per due processi,
soluzione per n processi, sincronizzazione hardware. Problema
dell'attesa attiva. Semafori: utilizzo e implementazione. Deadlock e
starvation. Problemi di sincronizzazione: produttore-consumatore, lettoriscrittori, filosofi a cena. I monitor: variabili di condizione. Soluzione al
problema dei filosofi a cena con l'uso di monitor. Sincronizzazione in Java:
metodi synchronized, wait(), notify(), notifyAll(). I semafori e i monitor in
Java: esempi applicativi. Nested lock. Variabili di condizione. o (rif.[silberschatz-osc], Cap.8) -
Caratterizzazione della condizione di stallo: condizioni necessarie. Grafo
di allocazione delle risorse. Metodi per la gestione dello stallo.
Prvenzione dello stallo. Evitare lo stallo: stato sicuro, algoritmo del grafo
di allocazione delle risorse, algoritmo del banchiere. Rilevazione e
recupero dello stallo: singola istanza di una risorsa, risorse con istanze
multiple, terminazione dei processi, preemption delle risorse. 4. Gestione della memoria
Gestione della memoria centrale (rif.[silberschatz-osc], Cap.9) -
Binding degli indirizzi. Spazio di indirizzamento logico e fisico.
Caricamento dinamico. Linking dinamico e librerie condivise. Swapping.
Allocazione contigua in memoria. Paginazione: approccio base, supporto
hardware, protezione. Struttura della tabella delle pagine: gerarchica,
hash, invertita. Segmentazione: approccio base, hardware, protezione e
condivisione, frammentazione. Segmentazione con paginazione:
architettura Intel 386.
Memoria virtuale (rif.[silberschatz-osc], Cap.10) -
Introduzione. Paginazione su domanda. Prestazioni della paginazione su
domanda. Creazione di processi. Sostituzione delle pagine: schema base,
FIFO, ottimo, LRU, LRU approssimato. Allocazione di frame: minimo
numero di frame, algoritmi di allocazione, allocazione locale e globale.
Thrashing: modello del working set, frequenza dei page fault. Altre
considerazioni: prepaging, dimensione della pagina, TLB, struttura del
programma, blocco di I/O.