Sistemi operativi
Operazioni sui processi
Operazioni sui processi
Tutti i sistemi operativi forniscono i servizi fondamentali per la gestione dei processi, tra cui:
- Creazione processi
- Distruzione processi
- Sospensione processi
- Ripresa processi
- Cambio priorità dei processi
- Blocco processi
- Sblocco processi
- Attivazione processi
- Comunicazione tra processi
Come vengono creati i processi?
Un processo (padre) può creare numerosi processsi (figli), che, a loro volta, possono creare altri processi, formando un albero (genealogico) di processi.
Albero dei processi in Unix
In figura è mostrato uno schema ad albero relativo ai processi in Unix.
Diverse scelte progettuali
Risorse :
- Il padre e il figlio condividono tutte le risorse. -> Minor carico nel sistema
- I figli condividono un sottoinsieme delle risorse del padre.
- Il padre e il figlio non condividono risorse. -> Maggior carico nel sistema
Diverse scelte progettuali
Spazio degli indirizzi
- Il processo figlio è un duplicato del processo padre (UNIX).
- Nel processo figlio è caricato subito un diverso programma (VMS).
Esecuzione
- Il padre e i figli vengono eseguiti concorrentemente.
- Il padre attende la terminazione dei processi figli.
Un processo termina quando
Esegue l’ultima istruzione e chiede al sistema operativo di essere cancellato per mezzo di una specifica chiamata di sistema (exit in UNIX)
- Può restituire dati al processo padre.
- Le risorse del processo vengono deallocate dal SO.
Un processo termina quando
Viene terminato dal padre quando, ad esempio:
- Il figlio ha ecceduto nell’uso di alcune risorse.
- Il padre termina (in alcuni sistemi)
Viene terminato da un altro processo (eventualmente il padre) per mezzo di una specifica chiamata di sistema (abort in UNIX)
Esempio: UNIX
- La funzione fork crea un nuovo processo
- il figlio viene creato copiando tutto il PCB del padre
- ritorna 0 (zero) nel figlio
- ritorna il pid del figlio nel padre
- La funzione execlp carica nel nuovo processo un programma
- vengono sostituite le aree testo, data e stack
Esempio: UNIX
- La funzione exit fa terminare un processo
- eventualmente comunica al padre lo stato di uscita
- La funzione wait fa attendere al padre la terminazione del figlio
- eventualmente riceve dal figlio lo stato di uscita
Esempio: UNIX
A chi viene restituito 0 (chi è il padre del main)?
Codice (processo padre/figlio)
Processi cooperanti
- Un processo è indipendente se non può influire su altri processi nel sistema o subirne l’influsso.
- Processi cooperanti possono influire su altri processi o esserne influenzati.
- La presenza o meno di dati condivisi determina univocamente la natura del processo.
Vantaggi della cooperazione fra processi
- Condivisione di informazioni
- Accelerazione del calcolo (in sistemi multiprocessore)
- Modularità
Comunicazione tra processi (IPC)
Un sistema operativo è composto da numerosi moduli che devono interagire tra loro
-> Necessità di un meccanismo di comunicazione tra processi
- Segnali
- Memoria condivisa
- Scambio di messaggi
Segnali
- Interruzioni software per la comunicazione asincrona tra processi
- Non permettono ai processi di scambiarsi dati
- Il processo che riceve il segnale non e’ in un particolare stato di attesa (evento asincrono)
Segnali
I processi possono catturare, ignorare o mascherare un segnale
- Catturare un segnale significa far eseguire al sistema operativo una specifica routine al momento della ricezione del segnale o una azione di default associata al segnale
- Ignorare un segnale significa far finta che il segnale non sia mai arrivato
- Mascherare un segnale significa istruire il sistema operativo a non consegnare il segnale fino a nuovo ordine
Principali segnali di Unix
In figura sono tabellati i principali segnali di Unix e le relative cause.
Tabella dei segnali - cause (Unix)
Scambio messaggi / memoria condivisa
Nelle figure sono mostrati schemi esplicativi sul funzionamento dello scambio di messaggi (a sinistra) e della memoria condivisa (a destra).
Scambio di messaggi e memoria condivisa
Scambio di messaggi
Lo scambio di messaggi consente due operazioni:
- send(messaggio) — la dimensione del messaggio può essere fissa o variabile
- receive(messaggio)
Se i processi P e Q vogliono comunicare, devono:
- stabilire fra loro un canale di comunicazione
- scambiare messaggi per mezzo di send/receive
Problemi di implementazione
- Come vengono stabiliti i canali (connessioni)?
- È possibile assegnare un canale a più di due processi?
- Quanti canali possono essere stabiliti fra ciascuna coppia di processi comunicanti?
- Qual è la capacità di un canale?
- Il formato del messaggio che un canale può gestire è fisso o variabile?
- Stabilire canali monodirezionali o bidirezionali?
Comunicazione diretta o simmetrica
I processi devono dichiarare esplicitamente i loro interlocutori:
- send (P, messaggio) — invia un messaggio al processo P
- receive(Q, messaggio) — riceve un messaggio dal processo Q
Comunicazione indiretta o asimmetrica
I messaggi vengono inviati/ricevuti da mailbox
- Ciascuna mailbox è idendificata con un id unico.
- I processi possono comunicare solamente se condividono una mailbox.
Sincronizzazione
Le primitive send e receive possono essere sia bloccanti (o sincrone) che non–bloccanti (o asincrone)
- Invio bloccante: il processo che invia attende che il processo ricevente riceva il messaggio
- Invio non bloccante: il processo che invia riprende subito l’elaborazione
- Ricezione bloccante: il processo ricevente attende l’arrivo del messaggio
- Ricezione non bloccante: il processo ricevente riceve un messaggio valido oppure nullo
Implementazione
La coda dei messaggi legata ad un canale può essere implementata in tre modi.
- Capacità zero — Il canale non può avere messaggi in attesa al suo interno. Il trasmittente deve attendere che il ricevente abbia ricevuto il messaggio (rendezvous).
- Capacità limitata — Lunghezza finita pari a n messaggi. Se il canale è pieno, il trasmittente deve attendere.
- Capacità illimitata — Lunghezza infinita. Il trasmittente non attende mai.
Esempio: client server
E’ un classico paradigma di comunicazione tra processi
- un processo P (il client) chiede un servizio ad un processo Q (il server).
Es: apertura di un file
Schema dell'esempio (apertura di un file)
Scambio di messaggi in sistemi distribuiti
I messaggi trasmessi si possono perdere
- Necessità di protocolli che confermino la corretta ricezione del messaggio attraverso “ricevute di ritorno” (es. TCP/IP)
- Meccanismi di timeout per ritrasmettere i messaggi se la ricevuta non ritorna
Esempio: problema del produttore–consumatore
È un paradigma classico per processi cooperanti. Il processo produttore produce informazioni che vengono consumate da un processo consumatore.
- Buffer illimitato: non vengono posti limiti pratici alla dimensione del buffer.
- Buffer limitato: si assume che la dimensione del buffer sia fissata.
Esempio: Un programma di stampa produce caratteri che verranno consumati dal driver della stampante.
Buffer limitato e memoria condivisa
In figura sono mostrati il codice relativo ai dati condivisi e un esempio grafico e numerico.
Codice e schema dell'esempio
Processo consumatore
Codice (processo consumatore)
Processo produttore
Codice (processo produttore)
Osservazione
La soluzione proposta consente l’utilizzo di soli BUFFER_SIZE-1 elementi
PERCHE’?
Trovare una soluzione che utilizza tutti i BUFFER_SIZE elementi
Prossima lezione
I threads
- Cosa e’ un thread
- Similitudini e differenze con i processi
- Il ciclo di vita dei threads
- Esempi di implementazioni.