Interrupt e trap (eccezioni)
Interrupt
Definizione
Evento asincrono causato da un componente hardware.
Caratteristiche
- Gestito da CPU
- Causa l'interruzione della elaborazione corrente e viene chiamata una routine di servizio, il cui indirizzo è contenuto nell'Interrupt Vector nel numero di cella codificato all'interno del segnale stesso
- L'indirizzo di ritorno viene memorizzato nello stack di sistema
- Passaggio a Kernel Mode se proveniente da dispositivi di I/O
- Vengono disabilitati quando ne viene servito uno
Uso tipico
- Termine di un'operazione di I/O
- Malfunzionamento hardware
Trap
Definizione
Evento sincrono generato dal software o a causa di un errore o per una richiesta specifica fatta da un programma per ottenere un servizio di sistema.
Caratteristiche
- Il programma può ripartire dall'istruzione interrotta
- Passaggio a kernel mode se generata da violazioni di protezione da parte di un programma utente
Uso tipico
- Cannot divide per zero
- Page fault
- Memory access violation
Processi user e kernel thread
Un thread (parte di un processo), che è costituito da:
- PC (Program Counter)
- Registri
- Stack
- Parte di codice
- Dati
- Risorse date dal sistema operativo
User thread
Supportati mediante un insieme di chiamate a livello utente o di librerie di sistema → niente intervento del kernel.
Vantaggi
- Context switch veloce tra thread dello stesso task
- Implementazione su un kernel qualsiasi
Svantaggi
- Solo un thread running per task, anche in sistemi multiprocessore
- Se un thread effettua una system call bloccante sono bloccati tutti i thread dello stesso task
Kernel thread
Thread generati chiamando la system call del sistema → quindi con l'interazione del kernel.
Vantaggi
- Thread ready possono esser schedulati anche se appartengono allo stesso task di un thread che ha chiamato una system call bloccante
- In un sistema multiprocessore possono essere eseguiti thread multipli per task
Svantaggi
- Context switch più costoso perché richiede il passaggio al modo kernel
- Limitazione del numero massimo di thread per task
Approccio monolitico
Kernel → insieme enorme di funzionalità combinate in un unico livello.
MS-DOS
- Scritto per fornire il massimo di funzioni nel minimo spazio
- Non strutturato a moduli
- Interfacce e funzioni non separate per livelli
Struttura UNIX consiste di due parti:
- Programmi di sistema
- Kernel - è l'interfaccia a livello fisico dell'hw attraverso le system call
- Fornisce le funzioni relative al file system, scheduling della memoria e molte altre
Approccio a livelli
Il sistema → diviso in strati o livelli che svolgono funzioni specifiche.
- Ogni livello offre i propri servizi ai livelli superiori, che possono accedere a tali servizi tramite un'interfaccia ben definita.
- Livello più basso (0) → si appoggia direttamente sull'hw
- Livello più alto → realizza l'interfaccia utente.
Nelle macchine virtuali → sembra che più processi vengano eseguiti contemporaneamente su un proprio processore e su una propria memoria.
Gestione della protezione dello spazio di indirizzamento
Per proteggere lo spazio di indirizzamento del kernel da accessi diretti vengono utilizzati due registri che determinano l'area di memoria accessibile da un programma utente:
- Base register → contiene l'indirizzo di memoria dove inizia il programma utente
- Limit register → contiene la dimensione dell'intervallo di indirizzi disponibile al programma utente
Stati di un processo
Durante la sua esecuzione, un processo cambia di stato.
- SUBMIT: job suddiviso nei suoi processi componenti, che vengono creati
- HOLD: in attesa della disponibilità di risorse da parte del sistema
- READY: logicamente pronto a essere eseguito; in attesa della risorsa processore
- RUNNING: in esecuzione
- WAITING: in attesa di un nuovo evento
- COMPLETE: il processo termina e rilascia le risorse allocate
In un dato momento solo un processo si può trovare nello stato di RUNNING.
Il PCB contiene le informazioni associate al processo: stato, PC, registri CPU, informazioni su scheduling CPU, gestione memoria, stato operazioni I/O e amministrative varie.
Con PCB si possono gestire più processi concorrenti: sembra che la CPU svolga più operazioni nello stesso tempo quando invece attribuisce a ogni processo un certo tempo di esecuzione. (Nei sistemi è implementato in C mediante la struttura task-struct).
Diagramma stati più dettagliato
Problema produttore-consumatore
PROCESSO INDIPENDENTE: non può essere influenzato dall'esecuzione di altri processi, né può influenzarne altri
PROCESSO COOPERANTE: può essere influenzato dall'esecuzione di altri processi e può influenzarne altri.
Vantaggi
- Condivisione informazioni
- Maggior velocità di calcolo
- Modularità
Problema produttore-consumatore: tipico dei processi cooperanti:
Il processo produttore produce e inserisce in buffer informazioni usate da un processo consumatore;
- Si può assumere che il buffer sia di dimensioni illimitate
- Si assume che il buffer abbia dimensioni finite
Soluzione con buffer circolare:
- Dati condivisi
#define N 10
typedef struct {...} Item;
Item buffer[N];
int in = 0, out=0;
Processo produttore
item nextp;
while (true) {
... // produce an item in nextp
...
while ((in+1) % N == out); /// occhio al ;!!! // non fa nulla
buffer [in] = nextp; // metto il dato
in = (in+1) % N; // avanza di una posizione
}
Processo consumatore
item nextc;
while (true) {
while (in == out); /// occhio, c'è il ;! // non fa nulla finché non c'è qualcosa da leggere
nextc = buffer [out]; // prelevo il dato
out = (out+1) % N; // avanzo
... // consume the item in nextc
...
}
La soluzione NON è corretta per N=1.
System call
Definizione
Richiesta di un servizio del sistema operativo. Metodo usato da un processo per richiedere un'azione da parte del kernel.
Caratteristiche
- Disponibili come istruzioni assembler
- Normalmente realizzata come una trap a un indirizzo specifico nell'interrupt vector
- Passaggio a kernel mode se si richiede un'operazione di I/O
Meccanismo
- Salvato nello stack lo stato del programma utente (PC, registri, bit di modo, IR, segmento di codice del programma utente)
- Controllo passa, attraverso l'interrupt vector, ad una routine di servizio del kernel
- Bit mode settato a monitor mode
- Monitor verifica che i parametri associati siano corretti e legali, esegue la richiesta e restituisce il controllo all'istruzione successiva alla system call
Uso tipico
- Fork
- Execve
- Wait
- Signal
Chiamata a funzione
Definizione
Richiesta di passare a un altro indirizzo dell'area accessibile al programma utente.
Caratteristiche
- L'indirizzo di ritorno (che contiene la successiva istruzione) viene memorizzato nello stack del processo.
Uso tipico
Un programma utente richiama un compito specifico da eseguire.
Fork(): creazione processi
Crea copia identica del processo che l'ha invocata (padre), facendo sì che abbia stessa immagine in memoria, inclusi i descrittori di file, stack, dati...
- Un processo padre crea processi figli che a loro volta possono generare altri processi figli, formando un albero di processi.
- Condivisione risorse
- Padre e figli condividono tutte le risorse del padre
- Figli condividono col padre parte delle sue risorse
- Padre e figli non condividono alcuna risorsa
- Esecuzione
- Padre e figli eseguono in concorrenza
- Il padre aspetta finché i figli terminano
- Spazio indirizzi
- Il kernel duplica quello del padre
- Il figlio eventualmente cambia il suo spazio degli indirizzi
- Esempi di system call UNIX
- Fork crea un nuovo processo
- Execve può essere usata dopo una fork per cambiare lo spazio di memoria del nuovo processo con un nuovo codice eseguibile
Restituisce:
- -1 se è il padre in fallimento
- 0 se è un figlio o il PID del figlio nel caso in cui l'operazione vada a buon fine
Exit(): terminazione processi
System call: void exit()
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Riassunto esame Sistemi Operativi
-
Riassunto esame Sistemi operativi, prof. Lombardi
-
Riassunto Sistemi operativi
-
riassunto sistemi operativi