Gestione dei processi
A. Ferrari
Multiprogrammazione
Tutti i Sistemi Operativi moderni sono in grado di
eseguire contemporaneamente più di un programma
Il numero di programmi in esecuzione è superiore al
numero di processori del sistema.
L’utente ha la sensazione che le proprie applicazioni
siano eseguite contemporaneamente dal computer.
In realtà la sensazione di contemporaneità è data
dall’elevata velocità di esecuzione dei programmi da
parte del computer.
Esecuzione “parallela”
MAC OSX
Monitoraggio attività
Windows
Task Manager
Linux
System monitor
Programma -> Processo
Un programma è costituito
dal codice oggetto generato
dalla compilazione del codice
sorgente
E’ salvato sotto forma di uno
o più file.
E’ un'entità statica, che
rimane immutata durante
l'esecuzione.
Il programma esiste
indipendentemente dal
computer che è in grado di
eseguirlo.
Un processo è definito come un’istanza
di un programma in esecuzione.
Al momento dell’esecuzione del
programma il SO crea il processo.
E’ un'entità dinamica, che dipende dai
dati che vengono elaborati, e dalle
operazioni eseguite su di essi.
E’ caratterizzato, oltre che dal codice
eseguibile, dall'insieme di tutte le
informazioni che ne definiscono lo
stato.
Da un solo programma possono
scaturire più processi distinti.
Thread
Un thread è una suddivisione di un processo in due o più filoni, che
vengono eseguiti concorrentemente dal processore.
In generale, si può dire che un thread è contenuto all'interno di un
processo.
Un processo ha sempre almeno un thread (se stesso), ma in alcuni
casi un processo può avere più thread che vengono eseguiti in
parallelo.
I vari thread dello stesso processo condividono alcune risorse (lo
spazio d'indirizzamento del processo), mentre processi differenti
non condividono le loro risorse.
I thread sono spesso utilizzati per la parallelizzazione di un
programma, per sfruttare i moderni processori multi core.
Processo vs Thread
Processo
Il processo è l'oggetto
del sistema operativo a
cui sono assegnate
tutte le risorse di
sistema per
l'esecuzione di un
programma, tranne la
CPU.
Thread
Il thread è l'oggetto del
sistema operativo o
dell'applicazione a cui
è assegnata la CPU per
l'esecuzione.
Un esempio
Un esempio di applicazione
che può far uso di più
thread è un browser Web,
che usa un thread distinto
per scaricare ogni
immagine in una pagina
Web che contiene più
immagini.
Dual Core - multi core
Una CPU dual core (doppio nucleo) unisce due
processori indipendenti in un singolo package.
I primi dual core sono gli IBM PowerPC del 2003.
Il termine multi core si usa per descrivere una CPU
composta da tre o più core: più nuclei di processori
fisici montati sullo stesso package.
Identificativo di
processo
Il Sistema Operativo assoccia a ogni processo (al
momento della creazione) un identificativo numerico
univoco, detto PID (Process Identifier).
Ad un processo sono associate le seguenti strutture
dati:
Uno o più segmenti di codice.
Uno o più segmenti di memoria dati.
I descrittori di eventuali risorse in uso (file, finestre,
periferiche, ecc.)
Uno o più thread.
Process control block
Il Process Control Block (Blocco di Controllo del
Processo) o PCB di un processo è una struttura dati
del nucleo del sistema operativo che contiene le
informazioni essenziali per la gestione del processo.
Contenuto del PCB
Program counter
Area per il salvataggio dei registri
Stato corrente di avanzamento del processo (Pronto, In
Esecuzione, Bloccato)
Identificatore unico del processo
Puntatore al processo padre e ai processi figli se esistenti
Livello di priorità
Informazioni per la gestione della memoria
Identificatore della CPU su cui è in esecuzione
Informazioni per lo scheduling (gestione) del processo, come il
tempo di run (esecuzione) o wait (attesa) accumulato
…
Informazioni sullo stato di I/O del processo
Context-switching
Operazioni eseguite dal SO per passare la risorsa
processore da un processo ad un altro.
Si interrompe momentaneamente il primo processo
per riprendere temporaneamente l’esecuzione del
secondo.
Nel context-switching viene salvato il PCB del primo
processo e caricato il PCB del secondo.
CPU e
context-switching
Stati di un processo
Ogni processo può essere in uno dei 3 stati:
Pronto (ready)
Il processo non è in esecuzione, ha tutte le risorse
necessarie tranne la CPU
Attesa (wait) (sleep)
Il processo non è in esecuzione, ha invocato un servizio (es
I/O) ed è in attesa di un segnale da parte di un altro processo
relativo al completamento del servizio richiesto.
Esecuzione (run)
Il processo dispone di tutte le risorse necessarie ed è in
esecuzione sulla CPU
Stati di un processo
Ready
Wait
Run
Transizione 1
Il processo viene creato e posto nello stato di
“pronto” (ready)
Ready
Wait
Run
Code d’attesa
Più processi possono essere in stato di ready pronti
per ottenere la risorsa CPU e passare in esecuzione.
I processi vengono quindi messi in coda d’attesa.
Transizione 2
Il Sistema Operativo seleziona uno dei processi in
stato Ready e lo pone in esecuzione (run)
Ready
Wait
Run
Scheduler
Lo scheduler (da to schedule letteralmente "mettere in
lista”) è un programma che, dato un insieme di richieste di
accesso ad una risorsa, stabilisce un ordinamento
temporale per l'esecuzione di tali richieste, privilegiando
quelle che rispettano determinati parametri, in modo da
ottimizzare l'accesso a tale risorsa e consentire così
l'espletamento del servizio.
Lo short-time-scheduler (scheduler della CPU) deve
garantire l’esecuzione di ogni processo, in modo ordinato,
concedendo e revocando la CPU alternativamente
mediante operazioni dette commutazioni di contesto tra i
processi.
Politiche di scheduling
L'attenzione posta su alcuni parametri piuttosto che
su altri, differenzia la politica di scheduling:
lo scheduler può eseguire le richieste in base al loro
ordine di arrivo (politica FIFO),
oppure dare precedenza a quelle che impegnano per
meno tempo la risorsa;
possono esistere politiche che si basano su principi
statistici o sulla predizione per individuare un
ordinamento delle richieste che si avvicini il più
possibile quello ottimale.
Obiettivi dello
scheduler
Fairness (Equità) - processi della stesso tipo devono avere trattamenti simili
Massimizzare il throughput (produttività dell'intero sistema), minimizzando
i tempi in cui la risorsa è inutilizzata.
Minimizza il tempo che intercorre tra l'istante in cui la richiesta è generata e
quello in cui la richiesta è soddisfatta.
Evitare fenomeni indesiderati come la starvation ovvero "l'attesa eterna" di
alcune richieste.
"Corre voce che quando fu chiuso l'IBM 7094 al MIT, nel 1973, si scoprì che un
processo con bassa priorità sottoposto nel 1967 non era ancora stato
eseguito".
Dare all'utilizzatore del sistema la percezione che le richieste vengano
soddisfatte contemporaneamente.
Transizione 3
Il Sistema Operativo interrompe l’esecuzione di un
processo e lo pone in stato di ready
Ready
Wait
Run
Time sharing
I Sistemi Operativi moderni adottano la tenica del
time-sharing per la gestione del processore.
Ad ogni processo viene assegnato un “quanto” di
tempo (time slice dell’ordine dei millisecondi) dopo il
quale deve rilasciare il processore passando dallo
stato di run a quello di ready.
Preemption (prerilascio) è l'operazione in cui un
processo viene temporaneamente interrotto, senza
alcuna cooperazione da parte del processo stesso, al
fine di permettere l'esecuzione di un altro processo.
Transizione 4
Nel corso dell’esecuzione il processo richiede un
servizio al Sistema Operativo e viene posto nello
stato di wait
Ready
Wait
Run
Transizione 5
Il Sistema Operativo completa la richiesta di un
processo che passa quindi allo stato di ready
Ready
Wait
Run
Transizione 6
Il processo termina l’esecuzione e viene distrutto dal
Sistema Operativo
Ready
Wait
Run
Algoritmi di
schedulazione
Round-robin
time-sharing e politica FIFO (First In First Out) di
selezione dei processi in coda di ready
Scheduling a priorità
Un valore di priorità (intero) è associato a ciascun
processo.
La CPU viene allocata al processo con la priorità più
alta
Tipi di processi
CPU Bound
Processi che sfruttano pesantemente le risorse
computazionali del processore, ma non richiedono servizi di
ingresso/uscita dati al sistema operativo in quantità
rilevanti.
Es. i programmi di calcolo matematico, i quali necessitano
spesso di un'enorme potenza di calcolo, ma sfruttano l'I/O
solo all'inizio della loro vita (per caricare gli input) ed alla
fine di essa (per produrre gli output).
I/O Bound
molti accessi alle periferiche, il processo è spesso interrotto
per attendere il completamento delle richieste di I/O.
P1 (CPU bound)
P2 /I/O bound)
P1
Lungo burst di CPU
Attesa completamento I/O
Corto burst di CPU
P2
tempo
In esecuzione
In attesa