1. Introduzione al CPU scheduling
• Multiprogrammazione:
– mantenere più processi in esecuzione
– commutare l'esecuzione ad un altro processo in
caso di blocco per I/O
– impiegare tempi di attesa in modo produttivo
1
2. Ciclicità fasi di elaborazione - I/O
• L'esecuzione di un processo si alterna in un
ciclo costituito da:
– fase di elaborazione (CPU burst)
– attesa completamento I/O (I/O burst)
• Tale ciclo prosegue fino alla fine della
esecuzione del programma
2
3. Ciclicità fasi di elaborazione – I/O
• Processo CPU-bound:
– produce poche sequenze di operazioni di CPU
molto lunghe
– produce relativamente poco I/O
• Processo I/O-bound:
– produce tante sequenze di operazioni di CPU
molto breve
– produce prevalentemente operazioni di I/O
3
4. Scheduler della CPU
• Quando la CPU passa nello stato di inattività, il
SO sceglie un processo dalla coda di pronto
per l'esecuzione
• Scheduler della CPU:
– gestisce la coda di pronto
– seleziona il prossimo processo da mandare in
esecuzione
4
5. Scheduler della CPU
• Coda dei processi pronti:
– non è necessariamente una coda FIFO
– può essere implementata come:
♦ una coda FIFO
♦ una coda con priorità
♦ un albero
♦ una lista concatenata non ordinata
• elementi della coda dei processi pronti sono i
process control block
5
6. Il diritto di prelazione
• Lo scheduling della CPU può essere attivato
nelle seguenti circostanze:
1.un processo passa dallo stato di esecuzione
allo stato di attesa (richiesta I/O)
2.un processo passa dallo stato di esecuzione
allo stato di pronto (interruzione, quanto)
3.un processo passa dallo stato di attesa allo
stato di pronto (completamento I/O)
4.un processo termina l'esecuzione
6
7. Il diritto di prelazione
• 1. e 4. non richiedono una vera e propria scelta
di scheduling (prossimo processo)
• 2. e 3. richiedono una scelta di scheduling
(prossimo processo)
• Schemi di scheduling:
– con diritto di prelazione (preemptive): lo
scheduling interviene in 1., 2., 3., 4.
– senza diritto di prelazione (non preemptive): lo
scheduling interviene in 1., 4.
7
8. Il diritto di prelazione
• Scheduling senza diritto di prelazione
– il processo rimane in possesso della CPU fino a
quando non la rilascia
♦ termine esecuzione
♦ passaggio nello stato di attesa (I/O)
– non esiste il concetto di quanto di tempo
♦ implementazione più semplice
♦ funziona su architetture sprovviste di timer
8
9. Il diritto di prelazione
• Scheduling con diritto di prelazione
– concetto di quanto di tempo
– singolo processo non monopolizza la CPU
• Problemi
– gestione in mutua esclusione dei dati condivisi
fra due o più processi
– se un processo in kernel mode viene interrotto
a metà di una operazione critica
(aggiornamento di code di scheduling), il kernel
rimane in uno stato inconsistente
– una interruzione interrompe un processo in
kernel mode; strutture dati in comune vanno
accedute in mutua esclusione
9
10. Il diritto di prelazione
• Scheduling con diritto di prelazione
– concetto di quanto di tempo
– singolo processo non monopolizza la CPU
• Soluzioni
– Nei SO UNIX, il context switch avviene al
termine di una chiamata di sistema
♦ soluzione semplice
♦ non scala su più unità di elaborazione
– versioni recenti di Linux (v2.6) introducono i
preemption point
♦ API per rilasciare volontariamente la CPU
♦ il programmatore decide il rilascio
10
11. Dispatcher
• Il componente del CPU scheduler che sceglie il
prossimo processo da mandare in esecuzione
• Esegue le seguenti azioni:
– context switch
– passaggio al modo utente
– salto alla locazione della prossima istruzione da
eseguire
• Il dispatcher viene invocato ad ogni context
switch
– deve essere rapido
11
12. Algoritmi di scheduling
• First Come, First Served (FCFS)
• Shortest Job First (SJF)
• Priority
• Round Robin (RR)
• Multilevel Queue (MQ)
• Multilevel Feedback Queue (MFQ)
12
13. First Come, First Served
• Si assegna la CPU al processo che l'ha chiesta
per prima
• Implementato tramite una coda FIFO
• Quando un processo entra nella coda dei
processi pronti:
– PCB inserito in fondo alla coda dei processi
pronti
• Quando la CPU torna libera:
– estrae dalla coda dei processi pronti il PCB in
cima alla coda e ripristina l'esecuzione del
processo corrispondente
13
14. First Come, First Served
Processo Durata
P1 24msec
P2 3msec
P3 3msec
P1 P2 P3
0 24 27 30
P1
P2 P3
0 3 6 30
14
15. First Come, First Served
• Tatt(P1,P2,P3)=(0+24+27)/3=17msec
• Tatt(P2,P3,P1)=(6+0+3)/3=3msec
• Il tempo di attesa di FCFS non è, in genere,
minimo
• Effetto convoglio: se un processo CPU-bound
va in esecuzione per primo, gli altri processi
devono attendere il rilascio della CPU
– riduzione utilizzo CPU
– riduzione utilizzo periferiche
– invertendo l'ordine di esecuzione migliorerei gli
utilizzi
15
16. First Come, First Served
• Assenza di prelazione: CPU trattenuta fino al
rilascio della CPU
– termine esecuzione
– richiesta di I/O
• FCFS è problematico nei sistemi time shared
– quanto di tempo stride con assenza di
prelazione
16
17. Shortest Job First
• Si associa ad ogni processo la lunghezza della
successiva sequenza di operazioni di CPU
• Si assegna la CPU al processo con la
lunghezza più breve
• Se due processi hanno sequenze uguali, si
applica il criterio FCFS
• Nome più corretto: shortest CPU burst first
17
18. Shortest Job First
• Il tempo di attesa medio per n processi in coda
si può scrivere come:
(1) Tatt=(T1+T2+...+Tn)/n
dove
(2) Tj=Tj-1+tj
essendo:
♦ T =tempo attesa job j-1
j-1
♦ t =tempo esecuzione job j
j
18
19. Shortest Job First
• Sostituendo (2) in (1) si ottiene:
(3) Tatt=((n-1)t1+(n-2)t2+...+(n-k)tk+...+tn-1)/n
• Prendiamo due processi di indici k e k-j
(separati di j posizioni): Pk e Pk-j
– k>0, j>0, k-j>0
– Il processo che viene prima ha tempo di
esecuzione più grande: tk-j > tk
• Scambiamo di posto questi due processi (S1)
• Calcoliamo il nuovo tempo di attesa medio:
(4) Tatt,S1=((n-1)t1+...+(n-k+j)tk+...+(n-k)tk-j+...+tn-1)/n
19
20. Shortest Job First
• Calcoliamo la differenza (3)-(4): si elidono tutti i
termini tranne quelli relativi a tk-j e tk
Tatt-Tatt,S1=((n-k+j)tk-j+(n-k)tk-(n-k+j)tk-(n-k)tk-j)/n
Tatt-Tatt,S1=j(tk-j-tk)/n > 0
• Spostando dopo un processo con tempo di
esecuzione più grande, si ottiene una riduzione
del tempo di attesa
• Reiteriamo S1,S2,...,Sm scambi fino a quando i
processi sono ordinati dal più breve al più
lungo
– si ottiene sempre un Tatt,Sj descrescente
– Dopo m scambi, si ottiene l'ordinamento SJF
20
22. Shortest Job First
• Tatt(P4,P1,P3,P2)=(3+16+9+0/4=7msec
• Tatt è ottimale
• spostando un processo breve prima di un
processo lungo:
– il tempo di attesa per il processo breve
diminuisce più di quanto aumenti il tempo di
attesa per il processo lungo
– di conseguenza, Tatt medio diminuisce
• Problema: SJF richiede la durata della
successiva richiesta di CPU
– non sempre si conosce esattamente, si deve
spesso stimarla
22
23. Shortest Job First
• La lunghezza del CPU burst si stima con la sua
media esponenziale:
ten+1=atn+(1-a)ten , a in [0,1]
• a=0: valore recente non ha effetto
• a=1: assenza di storia
• a=1/2: stesso peso per valore recente e storia
passata (scelta comune)
• SJF può essere con e senza prelazione
23
24. Shortest Job First
• Se arriva un processo con CPU burst
successivo più breve rispetto a ciò che resta al
processo attualmente in esecuzione:
– prelazione: il processo in esecuzione viene
sostituito col nuovo processo
– assenza di prelazione: il processo in
esecuzione termina il suo CPU burst
• SJF con prelazione viene chiamato shortest
remaining time first
24
25. Priority
• Si associa ad ogni processo una priorità
• Si assegna la CPU al processo con priorità più
alta
• Se due processi hanno uguale priorità, si
applica il criterio FCFS
• SJF è un algoritmo di priorità
– la priorità è l'inverso della lunghezza (prevista)
del prossimo CPU burst
25
27. Priority
• Tatt(P2,P5,P1,P3,P4)=8.2msec
• Le priorità possono essere definite:
– internamente: in base a grandezze misurabili
(limiti di tempo, memoria, lunghezza CPU burst)
– esternamente: in base a criteri esterni al SO
(importanza del processo)
• Priority scheduling può essere con o senza
prelazione
27
28. Priority
• Se arriva un processo con priorità maggiore
rispetto a quella del processo attualmente in
esecuzione:
– prelazione: il processo in esecuzione viene
sostituito col nuovo processo
– assenza di prelazione: il processo in
esecuzione termina il suo CPU burst
• Problema: starvation (attesa indefinita di
processi a bassa priorità)
• Soluzione: aging (aumento graduale della
priorità)
28
29. Round Robin
• Progettato per sistemi time sharing
• FCFS con capacità di prelazione per
commutare fra processi
• Ciascun processo riceve una quantità fissa di
tempo di CPU, il quanto di tempo
– esecuzione viene interrotta allo scadere del
quanto di tempo
– quanto di tempo varia da 10msec a 100msec
• La coda dei processi pronti viene gestita in
modalità circolare
• Implementazione tramite coda FIFO
– nuovi processi aggiunti in coda
– processi appena eseguiti sono riaccodati 29
31. Round Robin
• Tatt(P1,P2,P3)=17/3=5.66msec
• RR è sempre con prelazione (per via del
quanto di tempo)
• Se ho n processi, quanto di tempo pari a q:
– ciascun processo ottiene 1/n del tempo di
elaborazione di CPU in frazioni di al più q unità
di tempo
– l'attesa di esecuzione è limitata a (n-1)*q unità di
tempo
31
32. Round Robin
• Le prestazioni dell'algoritmo RR dipendono
fortemente dalla dimensione del quanto di
tempo
• quanto di tempo piccolo:
– RR prende il nome di CPU sharing
– overhead del context switching
• quanto di tempo ampio:
– RR tende a diventare FCFS
32
33. Multilevel queue
• Distinzione fra più classi di processi
– processi interattivi (foreground)
– processi in sfondo (background)
– processi batch
• Classi di processi hanno requisiti diversi sui
tempi di risposta
• Si suddivide la coda dei processi pronti in più
code distinte
• Ciascun processo viene associato
permanentemente ad una coda
• Ciascuna coda ha il proprio algoritmo di
scheduling (RR, FCFS)
33
34. Multilevel queue
• Necessità di uno scheduling fra code: quali
sono le code con priorità più alta di
esecuzione?
– priorità fissa, con prelazione
• Esempio:
1.processi di sistema
2.processi interattivi
3.processi interattivi di editing
4.processi in background
5.processi degli studenti
34
35. Multilevel queue
• Ogni coda ha priorità assoluta sulle code di
priorità più bassa
• Se un processo a priorità più alta viene
iniziato, si interrompe un eventuale processo
in esecuzione a priorità più bassa (Solaris2)
35
36. Multilevel feedback queue
• Variante di multilevel queue
• I processi possono spostarsi fra le varie code
– cambio di priorità
• Idea: raggruppare i processi con
caratteristiche di CPU burst simili nelle stesse
code
• Tipicamente:
– CPU burst lunghi, priorità bassa
– CPU burst brevi, priorità alta
36
38. Multilevel feedback queue
• Parametri di MFQ:
– numero di code
– algoritmo di scheduling per ciascuna coda
– criterio usato per spostare un processo in una
coda con priorità maggiore
– criterio usato per spostare un processo in una
coda con priorità minore
– criterio usato per scegliere la coda in cui
inserire inizialmente un processo
38
39. Scheduling nei sistemi SMP
• Finora sono stati analizzati sistemi basati su
un solo processore
• Con più processori, diviene possibile la
condivisione del carico (load sharing) dei
processi fra più processori
• Ci concentriamo su sistemi:
– Symmetric Multi Processing (SMP): processori
uguali, ciascuno in grado di eseguire codice
– Uniform Memory access (UMA): la probabilità di
accedere ad una qualunque locazione in
memoria è la stessa per ogni processore
39
40. Scheduling nei sistemi SMP: tecniche
• Due diversi approcci per implementare la coda
di pronto
– Coda di pronto per ciascun processore
– Una singola coda di pronto acceduta da tutti i
processori
• Processor Affinity
– Lo scheduler tende a rischedulare gli stessi
processi sugli stessi processori, per aumentare
la probabilità di trovare dati in cache
• Load Balancing
– Lo scheduler bilancia l'esecuzione dei processi
in modo tale che la lunghezza delle code di
pronto sia grossomodo la stessa sulle CPU
40
41. Scheduling dei thread
• Se un SO è multithreaded, i thread devono
essere schedulati dallo scheduler del kernel
• Process Contention Scope:
– Scelta di schedulazione dei thread user level
– Many-to-One, Many-to-Many
– Basato sul concetto di priorità
• System Contention Scope:
– Scelta di schedulazione dei thread kernel level
– One-to-One (Linux)
– Basato su Multilevel Feedback Queue
41
42. Valutazione algoritmi di scheduling
• Come fare a scegliere un dato algoritmo di
CPU scheduling fra i tanti a disposizione?
– Occorre valutarli
– Ma come?
• Tre passi:
– Occorre scegliere degli indici di valutazione
delle prestazioni di un algoritmo
– Occorre scegliere degli indici statistici di
misurazione per gli indici di prestazione
– Occorre costruire un modello di
rappresentazione dell'algoritmo
42
43. Indici di prestazione
• Utilizzazione CPU
– È una probabilità (valori in [0, 1])
– È definita come la probabilità di trovare il
sistema occupato in un dato intervallo di
osservazione
– In alternativa, è definita come il rapporto fra un
intervallo di tempo in cui la CPU è usata (Tocc) ed
un intervallo di tempo di misura(Tmis)
T occ
=
T mis
– 0: sistema completamente scarico
– 1: sistema utilizzato al 100% (bene se non ci
sono ulteriori accodamenti)
43
45. Indici di prestazione
• Throughput
– È definito come il numero di processi N
commutati in un intervallo di misura Tmis
N
X=
T mis
– Vorremmo averlo più alto possibile
45
46. Indici di prestazione
• Tempo di risposta
– È definito come l'intervallo temporale che passa fra
la sottomissione del processo e l'inizio della
risposta
– Lo vorrei minimo per i processi interattivi
• Tempo di completamento
– È definito come l'intervallo temporale che passa fra
la sottomissione del processo ed il suo
completamento
– In generale, lo vorremmo più basso possibile
• Tempo di attesa:
– È definito come la somma degli intervalli temporali
passati in coda di pronto
– In generale, lo vorremmo più basso possibile
46
47. Indici statistici
• Media campionaria
– È definita come la media aritmetica di n campioni xi
di una grandezza
n
1
x= ∑ x i
n i=1
– In generale, la vorrei più bassa possibile
• Varianza campionaria
– È definita come la media dello scarto quadratico fra
n campioni e la loro media campionaria
– Misura la dispersione dei valori attorno alla media
n
1
2 2
∑ xi −x
=
n−1 i=1
– Lo vorremmo basso per processi interattivi
47
48. Modelli rappresentativi
• I modelli rappresentativi possono essere i
seguenti
– Modello analitico
– Modello a reti di code
– Modello simulativo
– Sistema reale
48
49. Modello analitico
• Si analizza l'algoritmo ed il carico a cui esso è
soggetto
• Si cerca di scoprire una relazione in forma
chiusa (formula) che lega la prestazione di un
dato algoritmo con il numero di processi
• In un sistema complesso, non sempre si riesce
a stabilire la formula
• Nota una formula, la valutazione delle
prestazioni è immediata
• Ad esempio, per SJF, il tempo di attesa su n
processi è dimostrabilmente minimo:
n
1
T att = ∑ n−it i
n i=1
49
50. Modello a reti di code
• Lo scheduler è visto come un oggetto servente
a cui è attaccato un oggetto coda di attesa
• Una richiesta entra nello scheduler, si accoda
ed aspetta fino a quando non si libera il
servente
• Le richieste arrivano con un ritmo aleatorio,
con valor medio pari a λ richieste per unità di
tempo
• Il servente serve richieste (processi) ad un
ritmo aleatorio, con valor medio pari a μ
richieste per unità di tempo
• Più componenti possono essere attaccati per
formare una rete di code (queueing network)
50
51. Modello a reti di code
Una coda semplice
λ μ
CPU
coda servente
Una rete di code
Input Output
CPU Disk
51
52. Modello a reti di code
• Legge di Little
– Sia n il numero medio di elementi in coda
– Sia λ il tasso medio di arrivo delle richieste
– Sia W il tempo medio speso in coda
– Sussiste la seguente relazione generale:
n= W
• Esempio:
– Se arrivano in media λ=7 processi al secondo
– Se la lunghezza media della coda è n=14
processi
– Allora il tempo medio di permanenza in coda è
di W=2s
52
53. Modello a reti di code
• Utilizzazione del servente
– È definita come il rapporto fra λ e μ
=
• In generale, si ha:
ρ
1
λ
λ=μ
53