Jürgen Assfalg's Homepage - Teaching

Overview| Operating Systems| Internet Engineering
Teaching

versione stampabile

Sistemi Operativi: Programma a.a. 2006-2007

  1. Introduzione: cos'è un sistema operativo, diversi tipi di s.o. (batch, multiprogrammato, time-sharing, ...);
  2. Struttura di un calcolatore: funzionalità, I/O, gestione delle interruzioni, meccanisimi di protezione hardware;
  3. Struttura di un s.o.: componenti, servizi, primitive di sistema (system calls), programmi di sistema, struttura;
  4. Introduzione alla programmazione Java: la virtual machine ed il linguaggio di programmazione;
  5. Multiprogrammazione: processi (con particolare riferimento al sistema operativo Linux) e threads (con particolare riferimento a Java);
  6. CPU scheduling: concetti di base (CPU e I/O burst, scheduler, preemption, dispatcher), criteri di scheduling, algoritmi (first come first served, shortest job first, round robin, coda multilivello, coda multilivello con feedback); sistemi real-time (hard-realtime e soft-realtime; algoritmi RMS ed EDF; inversione della priorità ed ereditarietà della priorità); lo scheduler di Linux;
  7. Sincronizzazione di processi: primitive Java per attendere completamento threads e processi; il problema della sezione critica, con soluzioni SW (fra cui algoritmo di Dekker o di Peterson, algoritmo del fornaio) e HW (test&set, swap); semafori, regioni critiche e monitor; problema produttore/consumatore con buffer di memoria limitato, problema lettori/scrittori, problema dei 5 filosofi; esempi applicativi in Java; synchronized, monitor, mutex lock e variabili di condizione in Java;
  8. Il problema dello stallo: caratterizzazione, il grafo di allocazione delle risorse, strategie di prevenzione, strategie per evitare lo stallo (l'algoritmo del banchiere), strategie di rilevazione e rimozione;
  9. Gestione della memoria: binding degli indirizzi; spazio di indirizzamento logico e fisico; caricamento dinamico, linking dinamico, overlays; swapping; allocazione della memoria (contigua, paginazione, segmentazione).
  10. La memoria virtuale: paginazione su domanda; sostituzione delle pagine (FIFO, ottimo, LRU, LRU approssimato); allocazione della memoria fisica (numero minimo, algoritmi, locale/globale); thrashing (working set, frequenza dei page faults); prepaging, dimensione delle pagine; memory-mapped I/O.
  11. Comunicazione tra processi: processi cooperanti; IPC tramite memoria condivisa e scambio di messaggi; Sistemi distribuiti: comunicazione mediante sockets TCP; esempi in Java per server TCP con multi-threading o readiness selection; i moduli di multiprogrammazione di Apache;
  12. Il sottosistema di I/O: caratterizzazione dell'I/O; I/O sincrono/asincrono, bloccante/non bloccante; scheduling del disco; buffering; caching; I/O in Java mediante streams; I/O asincrono mediante threads;

Materiale didattico

  • Macchine virtuali [ documento PDF ] (aggiornato il 2/6/2006)
  • Introduzione a Java [ documento PDF; sorgenti Java (aggiornati il 13/2/2006) ]
  • Multiprogrammazione
    • Analisi quantitativa dei benefici [ documento PDF ] (aggiornato il 13/3/2005)
    • Gestione di processi in C (Linux/UNIX) [ documento PDF ]
    • Esempi su processi [ sorgenti C per UNIX/Linux ], [ sorgenti Java (aggiornato il 18/5/2005) ]
    • Threads in Java: creazione di threads, sincronizzazione elementare mediante Thread.join() (package so.esempi.threads) [ sorgenti Java ] (aggiornato il 14/3/2005)
  • Scheduling
    • Sistemi tempo-reale: schedulabilità, algoritmi RMS ed EDF [ documento PDF ] (aggiornato il 13/3/2005)
    • Inversione di priorità ed ereditarietà della priorità [ documento PDF ] (aggiornato il 13/3/2005)
    • Lo scheduler di Linux [ documento PDF ] (aggiornato il 13/3/2005)
  • Sincronizzazione
    • problema produttore-consumatore (package so.esempi.prodcons), realizzato mediante memoria limitata (Object[]) e memoria illimitata (LinkedList) [ sorgenti Java ] (aggiornato il 13/2/2006)
    • algoritmo del fornaio e relativa dimostrazione [ documento PDF ]
    • Implementazione di un monitor tramite semafori [ documento PDF ] (aggiornato il 2/6/2006)
    • esempi d'uso della sincronizzazione in Java, riferiti al problema produttore/consumatore [ sorgenti Java ] (aggiornato il 2/3/2006) ]
      • so.esempi.sincronizzazione.regione_critica_1
        esemplifica l'uso del costrutto synchronized(<Object>){...} per il controllo d'accesso alla sezione critica, pur non risolvendolo completamente;
      • so.esempi.sincronizzazione.regione_critica_2
        la soluzione rappresenta un'evoluzione della precedente, in quanto risolve completamente il problema della sezione critica ed esclude la possibilità di stallo, pur non risolvendo il problema del livelock in quanto è comunque presente l'attesa attiva (busy wait);
      • so.esempi.sincronizzazione.monitor
        esemplifica come l'uso dei metodi synchronized rappresenti un'implementazione del concetto di monitor (seppur limitata, prevedendo una sola variabile di condizione “anonima”);
      • so.esempi.sincronizzazione.variabile_condizione
        la soluzione mostra come, sebbene l'implementazione del concetto di monitor in Java sia limitata rispetto al caso generale, essa ha tutte le potenzialità per consentire soluzioni analoghe a quelle del caso generale. La soluzione consente anche di comprendere il concetto di lock rientrante;
      • so.esempi.sincronizzazione.semafori_java5
        esemplifica l'uso della classe Semaphore, introdotta in Java 5
      • so.esempi.sincronizzazione.monitor_java5
        illustra l'uso delle interfacce Lock e Condition e della classe ReentrantLock, introdotte in Java 5 (in pratica realizza la stessa logica vista nel pacchetto so.esempi.sincronizzazione.monitor, ma con classi standard nell'ultima versione di Java
      il pacchetto comprende anche, per comodità, una replica di parte del package so.esempi.prodcons
  • I/O
    • lettura asincrona mediante thread servers TCP [ sorgenti Java ]
  • Comunicazione
    • Produttore-consumatore mediante area di memoria condivisa [ sorgenti C per UNIX/Linux ] (attenzione: l'esempio non prevede alcuna forma di sincronizzazione)
    • realizzazione di servizi TCP e modelli di multiprogrammazione del web server Apache [ documento PDF ]
    • servers TCP [ sorgenti Java ]

Nota: i contenuti dei diversi pacchetti contenenti codice sorgente vengono aggiornati periodicamente (ultimo aggiornamento: 2/6/2006).

Per approfondimenti
  • Per la gestione dei processi sotto Linux si veda anche GAPIL (in particolare, le sezioni 2.1, 3.1, e 3.2)
  • Specifica della Java Virtual Machine [ documento HTML (Sun) ]

Nota sul diritto d'autore: il materiale pubblicato su questa pagina, fatta eccezione per quello prodotto da terzi, è diffuso per il solo scopo di aiutare gli studenti del corso al superamento dell'esame. Si diffida dalla pubblicazione/copia del suddetto materiale per scopi diversi. In particolare è fatto divieto di diffusione e riproduzione con fini di lucro.

Libri consigliati

  • A. Silberschatz, P.G. Galvin, G. Gagne, “Sistemi operativi - con esempi per l'uso in Java”, Apogeo, 2005
    (oppure, in inglese: A. Silberschatz, P.G. Galvin, G. Gagne, “Operating Systems Concepts with Java”, J. Wiley & Sons, 6th edition, 2004)
Per approfondimenti su Java
  • Cay S. Horstmann, “Concetti di Informatica e fondamenti di Java”, terza edizione, Apogeo, 2005.
    Una buona introduzione al linguaggio Java, con richiami di fondamenti di informatica e utili suggerimenti per la pratica della programmazione.
  • S. Oaks, H. Wong, "Java Threads", O'Reilly, 3rd edition, 2004.
  • Un testo interamente dedicato alle problematiche di multiprogrammazione e sincronizzazione in Java.
  • Ron Hitchens, Java NIO, O'Reilly, 2002
    Tecniche di I/O avanzate, con Java NIO
  • Moka(the)Book, http://www.mokabyte.it/mokabook/
Per approfondimenti su Linux
  • Daniel P. Bovet, Marco Cesati, “Understanding the Linux Kernel”, Third Edition, O'Reilly, 2005
  • S. Piccardi, “Guida alla programmazione in linux (GAPIL)”, http://gapil.firenze.linux.it
© 2001-2007 Jürgen Assfalg