-
Supervisore
- Visione globale delle risorse
- Fornisce una virtual machine
-
Gestore risorse
- Conosce i dettagli
- Ottimizza e facilita
-
Interfaccia
- Astrae i dettagli
- Semplifica (hopefully)
-
Funzioni
- Gestione CPU & RAM, I/O, processi, file, (G)UI, security
===========================
bus di sistema
===========================
||| ||| |||
CPU MEMORIA I/O
- OS inesistente o dedicato
- Sistema meccanico
- Tutto in linguaggio maccchina
- Big stuff, single user only
- Utente = operatore
- SO batch
- Operatore + utente
- Lettura codice da schede
- Due macchine per l'I/O, una per la computazione
- 60s
- OS batch multiprogrammato
- Miglior uso della CPU (scheduling, interrupts, async I/O)
- Spooling
- 70s
- CPU time-sharing
- Job swapping
- Tastiere!
- MULTICS (multiuser, centralizzato + time-sharing)
- UNIX (monouser, open!)
- 80s
- Computer made personal
- Proliferazione device I/O
- Pretty GUI
- 90s
- Net OSs
- 00s
- Grid + Cloud = Virtualization FTW
- 10s
- ???
- PROFIT
- Esempi
- CP/M
- Windows
- 95, 98
- Win2000 e NT
- XP, Vista, 7
- Linux
- Open
- Distribuzioni abbestia
- Apple
- Mac OS [1-9]
- Mac OS X
- Terminal vs GUI
- Mono-user vs Multi-user
- Mono-tasking vs Multi-tasking
-
Ieri
- Job non interattivi
- Elab. batch
- CPU sottoutilizzata
- Condivisione CPU
-
Oggi
- Virtualizzazione delle risorse (CPU, RAM, hard-disks, GPUs) tramite time-sharing
Distribuzione dello sforzo su più processori
- Asimmetrico
- Master-slave
- Simmetrico
- Ogni processore esegue una copia dell'OS
I/O dai dispositivi al corrispettivo buffer, poi la CPU sposta dal buffer alla memoria
- Programmato
- Interrupt
- DMA
- Canali
Obiettivi
- Astrazione
- Virtualizzazione
- Creazione, avvio, sospensione e terminazione di processi
- Schedulazione
- Sincronizzazione
- Gestione stalli
- Comunicazione tra processi
- Allocazione e deallocazione processi
- Protezione della memoria
- Interfaccia omogenea
- Installazione, conf. e iniz.
- Supporto filesystems
- Ecc.
- API
- ...
Ieri asm, oggi C/C++ (o cmq type-safe)
- PowerOn
- BIOS
- Bootstrap del kernel
- ????
- PROFIT
SO su hdd o ROM (se embedded)
Lista interrupt in memoria
- CPU rileva
- Salva il contesto
- Recupero codice interruzione
- ????
- PROFIT
- Ripristino contesto
Accesso a servizi dell'OS Da asm o c/c++ Parametri passati per
- Registri
- Stack
- Memoria
- Monolitico
- Stratificato
- Microkernel
- Moduli funzionali
- VM
- Client/Server
- Molti OS commerciali
- Tutte le procedure compilate in un unica .dll/.so
- Blocking system calls
- Suddiviso in layers
- Layer 0: hardware
- Layer N: (G)UI
- Vantaggi:
- Virtualizzazione
- Portabilità (meno efficiente)
- Più funzionalità nei programmi di sistema che nel kernel stesso
- Facile estensione
- Maggiore portabilità
- Calo di prestazioni con più moduli caricati
- Dynamic kernel extensions
- Come microkernel ma più efficiente (niente messaggi tra moduli)
- L'hypervisor crea l'illusione di fornire cpu e memoria reali
Job = Processo Processo = programma in esec.
- Codice
- Dati
- Stack + Heap
- Stato
- PC
- Stack pointer
- ...
Processo ~ Funzione che trasforma lo stato iniziale in stato finale
- New
- Running
- Waiting - I/O, eventi, ecc.
- Ready
- Terminated
- Solo UNIX: Zombie
### PCB ###
- Stato
- PID
- PC
- Registri CPU
- Limiti memoria
- Info I/O
- Priorità
- Job queue
- Ready queue
- I/O queue
- Long-term scheduler - Ordine di secondi, minuti (no time-sharing)
- Short-term scheduler - Freq.
- Mid-term scheduler - Swap
< 10ms
- Synch: padre attende i figli
- Asynch: padre non attende i figli
- Condivisione info
- Computazione più veloce
- Modularità
- Convenienza
Scambio info = Comunicazione
Coordinamento = Sincronizzazione
Per scambiare info tra processi
- Veloce
- Scalabile
- Semplice
- Integrato nei linguaggi
- Affidabile
- Sicuro
Buffer condiviso
- Identificazione dei processi comm.
- Consistenza degli accessi
- Richiede una sincronizzazione
-
Memoria non condivisa
-
Contenuto
- Proc. mittente
- Proc. dest.
- Infos
-
Una connessione per coppia (Diretta)
-
Più di una connessione per coppia (Indiretta)
-
Uni/Bidirezionale
-
Coda temporanea
- Capacità 0: bloccante
- Capacità n: bloccante se piena
- Capacità ∞: mai bloccacnte
- File condivisi
- Pipe
- Unidirezionali
- Named pipe
- Bidirezionali
- Byte oriented
- Socket
- IP + porta
- TCP / UDP
- SOAP
- HTTP + XML
- REST
- Stateless
- HTTP + XML/JSON
- RPC
- Astrae le chiamate
- Connessione
- RMI
- Java shit
- Interni ad un processo
- Spazio di indirizzamento condiviso tra fratelli
- Contesto
- Stato (registri, stack, PC)
- Priorità
- TID
- Memoria privata
- Context switch + veloce
- Interferenze da gestire
- Prog sequenziale
- Pausabile
- Deterministico
- Prog concorrente
- Flussi cooperanti
- Blocchi di codice eseguiti contemp.
- Non deterministico
-
User-level
-
Soft-threads, esistono solo nell'applicazione
-
Libertà di scheduling
-
PORTABILI YEAH
-
Libs:
- libpthread
- win32threads
- java shit
-
Fails:
- Se un thread blocca, blocca tutto
- Contesto SMP: ogni cpu esegue tutti i thread di un solo processo
-
-
Kernel-level: real threads, switched by the kernel
- Lo switch grava sul kernel
- Meno portabile
Molti thread user-level a un thread kernel-level
- pthreads
- Windows
- Linux
Thread pooling?
Damn hard to manage
- Creazione
- fork(): mysterious face
- exec(): rimpiazza il processo
- Cancellazione
- Async
- Deferred
- Gestione segnali
- Eventi
- A chi consegno i segnali?
- Gruppi di thread
- Pooling!
- Dati specifici
- Ogni thread ha la sua copia dei dati
- Nascita di incosistenze su accessi e modifiche
- Stato transiente, interferenze
- Thread-safe se gli accessi sono atomici
Obiettivi:
- Massimizzare l'uso della CPU
- Fingere un sistema real-time
Esecuzione tipica:
- Uso CPU
- Attendi I/O
-
Preemptive (Time sharing)
- Esempi
- Esecuzione -> Pronto (interrupt)
- Attesa -> Pronto (I/O ready)
- Time slice
- Pre-rilascio
- Sync per accesso condiviso
- Esempi
-
Non-preemptive (Multitasking)
- Esempi
- Esecuzione -> Attesa (I/O hanging)
- Termina (SIGINT, SIGKILL, SIGBART, bla bla bla)
- Esempi
- Context switch (sospende il corrente, attiva il seguente)
- User-mode
- PC settato per runnare il processo
- Massimizzare l'tilizzo CPU
- Massimizzare il throughput
- Minimizzare il turnaround time
- Minimizzare il tempo di attesa
- Minimizzare il tempo di risposta
- FCFS
- Convoy effect
- SJF
- Preemptive: se arriva un job più corto interrompe e lo esegue subito
- Non-preemptive: lascia finire il corrente e poi fa quello nuovo
- Ottimale, ma ideale: si può solo prevedere la lunghezza dei picchi
- Priorità
- Priorità uguale -> FCFS
- Starvation sui job a bassa priorità
- Aging
- RR
- Alternanza -> FCFS + preemption
- Time slice (10-100ms)
- Prestazioni
- slice grande: FCFS
- slice piccolo: awesome, ma non troppo piccolo -> overhead due to context switch
- Coda a più livelli
- Processi ripartiti in code
- Ogni coda ha il suo algoritmo
- Schedulazione tra code!
Se il SO lo supporta sono schedulati i thread, non i processi
- Processori omogenei
- load sharing between them
- una coda x procio
- async: master - slave
- smp: ognuno si autogestisce
- hard real-time: forzatura sul tempo dei processi
- soft real-time: priorità massima su quelli critici
-
Sezione critica: mutualmente esclusiva nel tempo
-
Locks: variabili flag
-
Semafori: binari o contatori (wait - signal)
-
Problemi
- Deadlock
- Starvation
Set istruzioni cpu atomiche
- Semaforo mutex sul buffer
- Semaforo full a 0
- Semaforo empty a N
- Semaforo mutex sul db a 1
- Counter readerCount a 0
- Semaforo mutex sul readerCount a 1