PROGRAMMA DEL CORSO DI SISTEMI OPERATIVI, A.A. 2011/2012 (M. CESATI) LEZIONI 1 Richiami di calcolatori elettronici 1.1 I componenti di un sistema di calcolo 1.2 Architettura generale del software 2 Introduzione ai sistemi operativi 2.1 Definizione di sistema operativo 2.2 Il concetto di multiprogrammazione 2.3 I precursori dei calcolatori elettronici 2.4 I sistemi di prima generazione 2.5 I sistemi di seconda generazione 2.6 I sistemi di terza generazione 2.7 I sistemi di quarta generazione 3 Struttura di un sistema operativo 3.1 Servizi del sistema operativo 3.2 Interfacce l'utente 3.3 Chiamate di sistema 3.4 Controllo dei processi 3.5 Gestione dei file 3.6 Gestione dei dispositivi di I/O 3.7 Gestione delle informazioni 3.8 Comunicazioni 3.9 Progettazione di un sistema operativo 3.10 Struttura di un sistema operativo 4 Gestione dei processi 4.1 Il blocco di controllo 4.2 Struttura di un file eseguibile 4.3 La schedulazione dei processi 4.4 Il job scheduler 4.5 Lo scheduler a breve termine 4.6 Lo scheduler a medio termine 4.7 Contesto e cambio di contesto 5 Processi e thread 5.1 Gestione dei processi 5.2 I thread 5.2.1 Supporto del nucleo del sistema operativo 5.2.2 Modelli di implementazione dei thread 5.3 La libreria di thread POSIX 5.4 Implementazione dei thread in Linux 6 Schedulazione dei processi 6.1 Schedulazione e caratteristiche dei processi 6.2 Algoritmi di schedulazione 6.3 Schedulazione nei sistemi multiprocessore 6.4 La schedulazione dei processi in Linux 7 Sincronizzazione dei flussi di esecuzione 7.1 Flussi di esecuzione e race condition 7.2 Le regioni critiche 7.3 Operazioni atomiche 7.4 Primitive di sincronizzazione 7.5 Il problema dello stallo 7.6 La sincronizzazione in Linux 8 Gestione della memoria centrale 8.1 Schemi di indirizzamento della memoria centrale 8.2 La segmentazione 8.3 La paginazione 8.4 La gestione della memoria centrale in Linux su IA-32 9 Gestione delle pagine fisiche di memoria 9.1 Frammentazione esterna della memoria 9.2 Frammentazione interna della memoria 9.3 L'allocatore di tipo Buddy system 9.4 L'allocatore "slab allocator" 9.5 Pagine fisiche e pagine virtuali 9.6 Paginazione su richiesta 9.7 Condivisione delle pagine fisiche tra i processi 9.8 Copiatura su scrittura delle pagine fisiche 9.9 Gestione delle pagine fisiche di memoria in Linux 10 Gestione della memoria virtuale 10.1 Regioni di memoria virtuale 10.2 Algoritmi di sostituzione delle pagine 10.3 Politiche di assegnazione della memoria fisica 11 Interfaccia del file system 11.1 Il sistema di archiviazione in memoria secondaria 11.2 I file e la loro gestione 11.2.1 Tipo e contenuto dei file 11.2.2 Operazioni sui file 11.2.3 Strutture di dati del nucleo per gestire i file 11.2.4 Accesso sequenziale, diretto ed indicizzato 11.3 Le directory 11.3.1 Struttura ed organizzazione delle directory 11.3.2 Nomi di file multipli (hard link) 11.3.3 I soft link 12 Realizzazione del file system 12.1 Protezione dei file 12.2 Montaggio di un file system 12.3 Componenti del sistema operativo per il file system 12.4 Il file system virtuale (VFS) 12.5 Il file system su disco 12.5.1 L'allocazione dei blocchi 13 Gestione della memoria secondaria 13.1 I file system annotati 13.2 Tecnologia e prestazioni del disco magnetico 13.3 Algoritmi di schedulazione del disco 13.4 I sistemi RAID 14 La memoria tampone per i dischi 14.1 Efficienza e prestazioni della memoria secondaria 14.2 Memorie tampone per la memoria secondaria 14.3 Ottimizzazione degli accessi ai file 14.4 Recupero della memoria fisica 15 Gestione delle periferiche di I/O 15.1 Le periferiche di I/O 15.2 Le interfaccie di I/O 15.3 Driver delle periferiche 15.3.1 Driver basati su polling 15.3.2 Driver basati su interruzioni 15.3.3 Driver basati su DMA ESERCITAZIONI 1 Installazione ed uso di una distribuzione basata su Linux 1.1 Installazione di Ubuntu tramite Wubi 1.2 Procedura di login 1.3 Shell di comandi 1.4 Comandi di sistema: 1.4.1 echo 1.4.2 cat 1.4.3 ls 1.4.4 man 1.4.5 pwd 1.4.6 cd 1.4.7 mkdir 1.4.8 mv 1.4.9 cp 1.4.10 rm 1.4.11 more, less 1.5 Nomi e percorsi di file regolari e directory 1.6 Flussi di un programma Unix 1.6.1 Redirezione di standard input, output e error 1.6.2 Operatore pipe "|" 1.7 Scrittura di un file di testo tramite editor 1.8 Ruolo della variabile d'ambiente PATH 2 Richiami di programmazione in linguaggio C 2.1 Ciclo di compilazione di un programma C 2.2 Compilatore gcc e sue opzioni piu' importanti 2.3 Tipi di dati del C 2.4 Stringhe formato di printf 2.5 Costrutti di controllo 2.6 Operatori: precedenza ed associativita' 2.7 Stile di programmazione 2.7.1 Indentazione dei programmi, programma indent 2.8 Attivazione dei warning del compilatore 2.9 Segmentation fault 2.10 Visibilita' e persistenza delle variabili 2.11 Puntatori 2.11.1 Differenze ed analogie tra puntatori e vettori 2.11.2 Operazioni sui puntatori 2.12 Effetto e risultato delle funzioni 2.13 Passaggio degli argomenti alle funzioni 2.14 Strutture 2.15 Funzioni di libreria per la gestione delle stringhe 2.16 Funzioni di libreria per allocazione dinamica della memoria 2.17 Utilizzo di make per automatizzare il processo di compilazione 2.18 Realizzazione di strutture di dati dinamiche: lista semplice 2.19 Funzioni di libreria per l'I/O bufferizzato (stream) 2.19.1 fopen 2.19.2 fclose 2.19.3 fprintf 2.19.4 fscanf 2.19.5 fgetc, getchar 2.19.6 fputc, putchar 2.19.7 fputs, puts 2.19.8 fgets, gets 2.19.9 fread 2.19.10 fwrite 3 Gestione dei file 3.1 Descrittore di file 3.2 File aperto e puntatore corrente 3.3 Relazione tra stream (FILE) e descrittori di file 3.4 File mappati in memoria 3.5 Chiamate di sistema per gestire i file 3.5.1 open 3.5.2 close 3.5.3 read 3.5.4 write 3.5.5 flock 3.5.6 lseek 3.5.7 mmap 3.5.8 munmap 3.5.9 dup, dup2 4 Gestione dei processi 4.1 fork, exec vs spawn 4.2 Variabili d'ambiente 4.3 Chiamate di sistema per gestire i processi 4.3.1 fork 4.3.2 exit 4.3.3 _exit 4.3.4 wait 4.3.5 waitpid 4.3.6 sysconf 4.3.7 execve 5 Segnali 5.1 Segnali tradizionali e segnali RT 5.2 I segnali piu' comuni 5.3 Segnali ignorati e catturati 5.3.1 Gestori dei segnali 5.4 Chiamate di sistema per gestire i segnali 5.4.1 signal 5.4.2 kill 5.4.3 sigaction 5.4.4 sigemptyset, sigfillset, sigaddset, sigdelset, sigismember 6 Interprocess Communication 6.1 Tipologie di IPC 6.2 Pipe unidirezionali 6.3 Named pipe (FIFO) 6.3.1 Comandi mknod, mkfifo 6.4 System V IPC 6.4.1 Comandi ipcs, ipcrm, ipcmk 6.5 POSIX IPC 6.5.1 Semafori anonimi 6.5 Chiamate di sistema per IPC 6.5.1 pipe 6.5.2 popen 6.5.3 pclose 6.5.4 mknod 6.5.5 ftok 6.5.6 msgget 6.5.7 msgsnd 6.5.8 msgrcv 6.5.9 msgctl 6.5.10 shmget 6.5.11 shmat 6.5.12 shmdt 6.5.13 shmctl 6.5.14 semget 6.5.15 semop 6.5.16 semctl 6.5.17 sem_init 6.5.18 sem_destroy 6.5.19 sem_wait 6.5.20 sem_post 6.5.21 sem_getvalue 7 Applicazioni multithread 7.1 La libreria POSIX Thread 7.2 Sincronizzazione tra thread 7.3 Funzioni per la gestione dei thread 7.3.1 pthread_create 7.3.2 pthread_self 7.3.3 pthread_exit 7.3.4 pthread_join 7.3.5 pthread_mutex_init 7.3.6 pthread_mutex_destroy 7.3.7 pthread_mutex_lock 7.3.8 pthread_mutex_unlock 7.3.9 pthread_barrier_init 7.3.10 pthread_barrier_destroy 7.3.11 pthread_barrier_wait 7.3.12 pthread_cond_init 7.3.13 pthread_cond_destroy 7.3.14 pthread_cond_wait 7.3.15 pthread_cond_signal 7.3.16 pthread_cond_broadcast