Sistemi operativi
Interazione tra hardware e sistemi operativi
Compiti del SO
Un S.O. ha il compito di rendere semplice (all’utente), l’utilizzo del calcolatore
Cosa deve fare un S.O. ?
Interazioni con:
- CPU
- Memoria
- Dispositivi di I/O
Architettura di un sistema di calcolo
- la cpu e i controller operano in modo concorrente
- la cpu e i controller comunicano attraverso un bus
Controller = dispositivo hw per la gestione delle periferiche
Schema di un sistema di calcolo
Architettura di un sistema di calcolo
- Sia la cpu sia i controller accedono alla memoria
- Necessità di sincronizzazione degli accessi
- Controller della memoria
Schema di un sistema di calcolo
La CPU
Compiti della CPU:
- recuperare una istruzione dalla memoria
- recodificarla per determinare tipo e operandi
- eseguirla
Tutte le CPU hanno un insieme di registri:
- per contenere dati in transito da e per la memoria
- program counter (indirizzo della prossima istruzione)
- stack pointer (indirizzo dello stack)
- program status word (insieme di bit di controllo)
- per delimitare lo spazio di indirizzamento del programma in esecuzione
Controllori dei dispositivi di I/O
- Ogni dispositivo è governato da un controller
- Ogni controller ha un suo buffer locale e registri di controllo
- Le operazioni di I/O avvengono dal dispositivo verso i buffer locali e viceversa.
- La CPU sposta i dati tra la memoria e il buffer
Problema
Come fa la cpu a sapere che i dati sono stati trasferiti nel buffer locale del controller?
- I soluzione:
- La CPU interroga in continuazione il controller
- II soluzione:
- Il controller avvisa la CPU della fine dell’operazione di I/O mediante un evento
Esempio
3 registri di controllo
- status (read only) indica lo stato del dispositivo
- 1 dispositivo occupato
- 0 dispositivo pronto ad eseguire un comando
- command (write) indica il comando da eseguire
- control (write) indica che un comando è pronto nel registro command
- 1 comando da eseguire presente nel registro command
- 0 nessun comando da eseguire
2 buffer
Esempio di negoziazione per l’output
- La CPU interroga il registro status fino a che status =0
- La CPU definisce il registro command = write e trasferisce i dati dalla memoria al buffer di output
- La CPU pone il registro control=1
- Il controller pone status=1
- Il controller esamina il registro command e trasferisce i dati dal buffer al dispositivo
- Il controller pone command=0 e status=0
ATTESA ATTIVA nel passo 1
Attesa attiva (polling)
Interrogare occasionalmente un dispositivo è in sé un’operazione efficiente
- Leggi il registro status
- Test sul contenuto
- Salto ad un altro punto del codice se status = 0
Tale tecnica diviene però inefficiente se le ripetute interrogazioni trovano raramente un dispositivo pronto per il servizio mentre altre utili elaborazioni attendono la CPU.
Alternativa: le interruzioni
- I controllori dei dispositivi, gli errori e le chiamate di sistema generano segnali d’interruzione per comunicare alla CPU un evento asincrono
- Le interruzioni vengono generate dai dispositivi e recapitate alla CPU attraverso la linea delle richieste delle interruzioni
- Dipendono dall’architettura e possono avere nomi differenti
- Esempio: architettura IA32 (Intel Pentium)
- Interrupt (se generati da dispositivi hardware)
- Exceptions (se generati da errori o da programmi in esecuzione)
Ciclo di I/O basato sulle interruzioni
In figura è mostrato uno schema esplicativo del funzionamento di un ciclo I/O (CPU – Controllore) interessato da una interruzione.
Esempio: lettura di un dato (I/O sincrono)
- La cpu istruisce il controller su cosa fare e attende
- Il controller carica i dati nel buffer locale
- Il controller manda un interrupt di fine I/O alla cpu
- La cpu trasferisce il dato dal buffer locale alla memoria
Accesso diretto alla memoria
- La dimensione di buffer dei controllori è di pochi byte.
- Quando devono essere trasferiti molti dati vengono generate molte interruzioni alla CPU
- La gestione dell’I/O da e per la memoria è di solito delegato ad una unità separata dalla CPU chiamata Controllore dell’Accesso Diretto alla Memoria (DMA controller)
- Il controllore DMA agisce direttamente sul bus della memoria, esegue il trasferimento senza l’aiuto della CPU e genera una sola interruzione
Passi di un trasferimento DMA
In figura è mostrato uno schema del processo di trasferimento DMA, con relativa sequanze procedurale.
Passi di un trasferimento DMA
Gli eventi
Gli eventi (oppure segnali, oppure interruzioni) sono il principale meccanismo con cui si sincronizzano le azioni di un moderno sistema operativo
- La ricezione di un evento avvisa la CPU che deve fare qualcosa
- Se non ci sono processi, dispositivi da servire o utenti con cui interagire il sistema operativo rimane inattivo nell’attesa di un evento (i S.O. sono events driven)
- L’insieme delle regole per il coordinamento tra CPU e controller è chiamato negoziazione (handshaking)
La interrupt line
- Le interruzioni arrivano alla CPU attraverso una “interrupt line”
- Alla fine di ogni ciclo macchina la CPU controlla la presenza di un segnale sulla interrupt line
Proc Intel 8008 (1974) e relativa tabella
Come viene gestita una interruzione
- Un dispositivo attiva una comunicazione elettrica con un controllore delle interruzioni della CPU
- Il controllore delle interruzioni informa la CPU codificando il tipo di interruzione
- La CPU interrompe l’esecuzione dell’istruzione corrente e salva lo stato del programma in esecuzione (dati e registri della CPU).
- Trasferisce il controllo ad una interrupt service routine (ISR) il cui codice si trova in una prefissata zona della memoria
- Le ISR (Interrupt Service Routine) eseguono il codice specifico per gestire il segnale appena giunto (ad es. trasferisce il dato dal buffer locale del controller alla memoria)
- Al termine dell’esecuzione della ISR, il S.O. ripristina lo stato del programma e riprende l’esecuzione
La gestione delle interruzioni
- L’efficienza di un Sistema Operativo dipende dall’efficienza con cui sono gestite le interruzioni.
- Per rendere efficiente la gestione delle interruzioni si usa di solito una sola ISR che gestisce una tabella di puntatori contenente gli indirizzi delle varie procedure di servizio (vettore delle interruzioni).
Gestione delle interruzioni
In figura si mostra uno schema riguardante l’interazione CPU – memoria – SO nella gestione delle interruzioni.
Schema esplicativo (gestione delle interruzioni)
Problema
Se la CPU effettua una operazione di I/O, deve attendere il completamento del trasferimento dei dati dal dispositivo al alla CPU (I/O sincrono)
Ma i dispositivi sono molto più lenti della CPU
-> Uso inefficiente della CPU
I/O sincrono
Vantaggi:
- una sola richiesta di I/O pendente alla volta
- la CPU riconosce subito da quale dispositivo arriva il segnale di interruzione
Svantaggi:
- la CPU rimane inattiva per tutta la durata dell’I/O
- no a operazioni I/O in parallelo
- no a sovrapposizione di I/O e calcolo
I/O asincrono
- Invece di rimanere inattiva, la CPU potrebbe essere impiegata a gestire altri programmi (multiprogrammazione)
- Dopo l’avvio dell’I/O il controllo deve tornare subito alla CPU (I/O asincrono)
- Se c’è un solo processo in esecuzione, tale processo deve comunque attendere la fine dell’operazione di I/O
- Possibilita’ di numerose richieste di I/O pendenti
Device-Status Table
La presenza di più operazioni di I/O pendenti impone la presenza di una tabella di stato dei dispositivi
Tabella di stato dei dispositivi
La memoria centrale
- La memoria centrale è il supporto su cui sono conservati dati e istruzioni
- E’ vista dalla CPU come una sequenza lineare di locazioni con un indirizzo
- Le uniche operazioni permesse sui dati residenti in memoria sono load e store
- E’ il solo dispositivo di memorizzazione di grandi dimensioni direttamente accessibile dalla CPU
Memorie di massa
- La memoria centrale è un dispositivo volatile.
- Ha una capacità dell’ordine dei 109 byte (Gbyte) e non è sufficiente a contenere i modo permanente tutti i dati e i programmi di un sistema operativo.
- C’è necessità di dispositivi più capienti e non volatili (memoria di massa / dischi magnetici).
Gap tra memoria e CPU
- Tempo per una operazione aritmetica 1 ciclo di clock (~ 10-9 sec)
- Tempo di accesso alla memoria 4-5 cicli di clock (~ 10-8 sec)
In figura si mostra un diagramma relativo al rallentamento della CPU.
Grafico relativo al rallentamento della CPU
Registri e cache
Soluzione:
Uso di dispositivi di memorizzazione ‘on chip’ capaci di supportare la velocità operativa della CPU (cache e registri)
Al momento del loro uso, blocchi di dati sono copiati dalla memoria nella cache.
Caratteristiche:
- limitata capacità (~1 Mbyte)
- alta velocita’ di accesso (~ 10-9 sec)
La gerarchia delle Memorie
In figura è mostrata uno schema gerarchico dei vari tipi di memorie: dalla più veloce alla più lenta, dalla più capiente alla più ridotta.
Grafico a piramide delle gerarchie
Caching
Caching – utilizzo di una memoria a più alta velocità per mantenere informazioni cui si accede più spesso.
- Richiede un politica di gestione della cache
- Provoca una replicazione dei dati, quindi necessita di una politica di gestione che garantisca la consistenza dei dati (di solito gestita dall’hardware)
- E’ un concetto che può essere applicato a più livelli
- La memoria centrale può essere vista come una cache per i dischi magnetici
- I dischi possono essere visti come una cache per i supporti di backup
Migrazione di un dato dal disco ai registri
Problemi :
- dimensioni della cache (più grande = più costoso)
- criteri di aggiornamento (‘prevedere’ quali dati saranno utilizzati dalla cpu)
Gestione efficiente della cache → 80% dei dati deve trovarsi nella cache quando servono
Schema (migrazione di un dato)
Problema
- La condivisione delle risorse (memoria, cpu, I/O) da parte dei processi di un sistema operativo, comporta che un errore in un programma puo’ alterare il funzionamento di tutto il sistema
- Se n è molto grande si modifica l’area di memoria riservata a proc2 o addirittura si modifica il sistema operativo
Protezione delle risorse
L’esistenza di risorse condivise richiede che il sistema operativo garantisca che un programma scorretto non possa effettuare operazioni non consentite.
Le istruzioni possono essere eseguite in due modalità (dual mode operation):
- User mode – (un utente qualsiasi può eseguire un insieme ristretto di istruzioni).
- Kernel mode (anche monitor mode, system mode o superuser mode) – (il sistema operativo può eseguire tutte le istruzioni).
Supporto hardware per la dual mode operation
La CPU deve essere dotata di un Mode bit che indica lo stato corrente: system (0) or user (1).
Quando giunge una interruzione o avviene un errore il sistema passa in modalità “sistema” e viene attivata la procedura di servizio.
Esistono istruzioni privilegiate che possono essere eseguite solo in modalità kernel.
Protezione dello I/O
- Ad es. tutte le istruzioni di I/O sono di tipo privilegiato.
- Per effettuare delle operazioni di I/O vengono utilizzate delle chiamate di sistema (System call ).
- Il Sistema operativo deve garantire che un utente non possa mai avere pieno controllo del sistema in modalità superutente.
Utilizzo di una System call per effettuare una operazione di I/O
Le System call
Quando un programma effettua una system call, il S.O.
- manda una interruzione alla CPU
- pone il bit mode =0 (modalità sistema)
- esegue la procedura di servizio
- ripone il bit mode=1 (modalità utente)
- restituisce il controllo del sistema al programma interrotto
Supporto hardware per la protezione della memoria
E’ necessario garantire protezione della memoria , come minimo per le informazioni che si trovano nel vettore delle interruzioni e nelle ISR.
La CPU deve possedere due registri per stabilire le locazioni di memoria cui ogni programma ha diritto ad accedere:
- Base register – memorizza il più piccolo indirizzo di memoria cui l’accesso è lecito.
- Limit register – Contiene la dimensione massima di memoria ad accesso consentito
La memoria al di là dell’intervallo indicato è protetta.
Schema esplicativo (base/limit register)
Protezione della memoria
- Quando una istruzione viene eseguita in modalià sistema ha accesso completo a TUTTA la memoria.
- Le istruzioni per caricare i valori dei registri base e limit sono di tipo privilegiato.
Schema esplicativo (protezione della memoria)
Clock o timer
Ogni calcolatore ha un orologio interno chiamato clock o timer
3 componenti:
- Cristallo al quarzo che vibra ad una fissata frequenza
- Contatore che viene decrementato da ogni impulso del cristallo
- Registro di inizializzazione del contatore
Clock
- Il contatore viene inizializzato dal registro di caricamento
- Quando il contatore si azzera viene emessa una interruzione
- La frequenza delle interruzioni viene determinata dal software (dal valore del registro di caricamento)
Esempio: con un cristallo da 500 MHz e registro di 32 bit il contatore viene decrementato ogni 2 ns
- Interruzioni ogni 2 ns (registro di caricamento =1)
- Interruzioni ogni 8,6 sec (registro di caricamento = 232)
In conclusione
Il Sistema Operativo deve:
- Interagire con i controller e il DMA
- Gestire le interruzioni
- Gestire la coerenza dei valori nelle memorie
- Gestire il passaggio del controllo della CPU da un programma ad un altro
- Gestire le modalità di esecuzione
- Proteggere la memoria
- Proteggere la cpu
Prossima lezione
I processi
- Concetto e implementazione dei processi
- Scheduling e gestione dei processi
- Processi cooperanti e comunicazione tra processi