CPU Scheduling

Capitolo 5: Scheduling della CPU!
  Criteri di Scheduling!
  Algoritmi di Scheduling!
  Cenni Scheduling per sistemi multprocessore
 
!!
Modelli Asimmetrico e Simmetrico!
Scheduling della CPU!
5.2!
Concetti di Base!
Alternanza di Sequenze di CPU- e I/O-Burst!
  Massimizzare l’utilizzo della CPU mediante multiprogrammazione!
  CPU–I/O Burst Cycle !
 
Processo alterna cicli di CPU ad attese di I/O!
  Distribuzione dei cicli di CPU (CPU-burst)!
5.3!
5.4!
Istogramma dei CPU-burst!
Scheduling!
  Scheduler a lungo termine !
 
Decide quali tra i job richiesti vanno selezionati per essere
schedulati!
 
Decide il grado di multiprogrammazione e crea il giusto mix di
programmi !
  Scheduler a breve termine!
 
Decide quale processo pronto attivare!
 
Il vero e proprio schedulatore della CPU!
  Scheduler a medio termine!
 
Controlla lo swap in and swap out dei processi!
 
Fa il tuning del grado di multiprogrammazione!
 
Può liberare memoria per altri processi !
5.5!
5.6!
Schedulatore della CPU!
  Sceglie tra i processi pronti quello da eseguire e assegna la CPU!
  La Schedulazione della CPU avviene quando un processo:!
Dispatcher!
  Il Dispatcher passa il controllo della CPU al processo selezionato
dallo schedulatore a breve termine: !
1. !Passa da attivo in stato di attesa!
 
Cambia il contesto (context switch)!
2. !Passa da attivo a stato di pronto!
 
Passa in modalità utente!
3. !Passa da stato di attesa a stato di pronto!
 
Salta alla locazione giusta da cui il processo schedulato deve
ripartire!
 
Latenza di Dispatch latency – tempo necessario al dispatcher
per fermare un processo e farne ripartire un altro!
4. !Termina!
  Scheduling secondo 1 e 4 e’ non-preemptive (senza prelazione)!
  Se si schedula secondo 2 e 3, preemptive (con prelazione)!
5.7!
5.8!
Criteri di Scheduling!
Criteri di Ottimizzazione!
  Utilizzo/efficienza della CPU!
 
  Massimizza uso di CPU!
CPU quasi sempre occupata!
  Massimizza throughput!
  Throughput – # di processi completati per unità di tempo!
  Minimizza turnaround!
  Tempo di Turnaround – tempo necessario per completare
  Minimizza tempo d’attesa !
un particolare processo!
  Minimizza tempo di risposta!
  Tempo di attesa – tempo trascorso dal processo nella
coda di dei processi in stato di pronto!
  Tempo di risposta – tempo trascorso dal momento in cui
una richiesta viene sottoposta al sistema fino al momento in
cui una prima risposta appare in output, tempo necessario
a servire una sottorichiesta (importante in ambienti time-sharing)!
5.9!
5.10!
First-Come, First-Served (FCFS) Scheduling
(in ordine di arrivo)!
Politiche di Scheduling!
  FCFS – serve le richieste nell’ordine di arrivo!
  SJF – preferisce processi brevi !
  Round robin – alterna in maniera ordinata!
!
!Process
!
!P1
!Burst Time
!24!
!
!
! P2
! P3
!3!
!!
!3!
  I processi arrivano nell’ordine: P1 , P2 , P3 al tempo 0!
  Highest Response Ratio Next – cerca di bilanciare
Il diagramma di Gantt per la schedulazione:
tra processi brevi limitando i tempi di attesa!
P1!
P2!
P3!
!
!
0!
  Tempo di attesa:
24!
P1 = 0; P2 = 24; P3 = 27!
  Tempo medio di attesa: (0 + 24 + 27)/3 = 17!
5.11!
5.12!
27!
30!
FCFS Scheduling (Cont.)!
Shortest-Job-First (SJF) Scheduling!
Consideriamo ora l’ordine di arrivo!
!
  Scegli il processo con il più piccolo CPU burst!
! P2 , P3 , P1 !
  Schemi possibili: !
  Il diagramma di Gantt diventa:
 
Non-preemptive – una volta assegnata la CPU ad un processo
attendi fino a completamento del CPU burst!
 
preemptive – se un nuovo processo arriva con CPU burst più
breve del tempo rimanente al CPU burst del processo in
esecuzione, prelaziona!
!
P2!
0!
P3!
3!
P1!
6!
30!
  Tempi di attesa: P1 = 6; P2 = 0; P3 = 3!
noto come: Shortest-Remaining-Time-First (SRTF)!
  SJF ottimizza (minimizza) il tempo medio di attesa!
  Tempo medio di attesa: (6 + 0 + 3)/3 = 3!
 
  Schema
Miglioramento significativo!
  Evitato l’effetto convoglio: processi brevi dopo processi lunghi!
5.13!
5.14!
Esempio di SJF Non-Preemptive!
!
Esempio di SJF Preemptive (SRTF)!
!Process
!Arrival Time
!Burst Time!
!
!
!P1
!0
!7!
!
! P2
!2
!4!
!
! P3
!4
!1!
!
! P4
!5
!4!
  SJF (non-preemptive)!
P1!
0!
3!
!Process
!Arrival Time
!Burst Time!
!
!P1
!0
!7!
!
! P2
!2
!4!
!
! P3
!4
!1!
!
! P4
!5
!4!
  SJF (preemptive)!
P3!
7!
P2!
8!
  Tempo media di attesa = (0 + 6 + 3 + 7)/4 = 4!
5.15!
P4!
12!
P1!
16!
0!
P2!
2!
P3!
4!
P2!
5!
P4!
7!
P1!
11!
  Tempo medio di attesa = (9 + 1 + 0 +2)/4 = 3!
5.16!
16!
La Lunghezza dei CPU Burst!
SJF Preemptive e non-preemptive!
!
!Process
!Arrival Time
!Burst Time!
!
!P1
!0
!7!
  Possiamo solo stimare tale lunghezza!
!
! P2
!2
!4!
  Possibilità: usa le lunghezza dei precedenti CPU burst!
!
! P3
!4
!1!
!
! P4
!5
!4!
 
  SJF (preemptive) – tempo di attesa media = 3!
P1!
0!
P2!
2!
P3!
4!
P2!
P4!
5!
!
P1!
11!
7!
Es.: media esponenziale!
!
16!
1.
2.
3.
4.
t n = lunghezza effettiva dell'n mo CPU burst
τ n +1 = valore atteso del prossimo CPU burst
α, 0 ≤ α ≤ 1
Definisci : τ n +1 = α t n + (1− α )τ n .
  SJF non preemptive – tempo di attesa media = 4!
€
P1!
0!
3!
P3!
7!
P2!
8!
€
P4!
12!
16!
5.17!
5.18!
Es.: Media Esponenziale!
τ n +1 = α t n + (1− α )τ n .
Previsione della lunghezza di CPU Burst!
  α =0!
 
 
τn+1 = τn!
La storia (recente) non ha valore!
  α =1!
 
 
τn+1 = α tn!
€
Solo il precedente CPU burst ha valore!
  Se espandiamo la formula otteniamo:!
τn+1 = α tn+(1 - α) τn!
= α tn+(1 - α) (α tn-1 + (1 - α) τn-1)!
= α tn+(1 - α) α tn-1 + (1 - α)2 τn-1!
= α tn+(1 - α) α tn-1 + (1 - α)2 α tn-2+(1 - α)3 τn-2!
… = α tn+(1 - α) α tn-1 +… (1 - α)k α tn-k+ …(1 - α)n+1 τ0
!
  Nota che α e (1 - α) sono ≤ 1, quindi ogni termine nella formula
pesa meno del precedente!
5.19!
5.20!
Scheduling a Priorità!
  Ogni processo ha associato un valore di priorità (intero)!
  La CPU è allocata al processo con priorità più alta
(spesso numeri piccoli indicano priorità alta)!
 
 
Highest Response Ratio Next!
  w : tempo speso dal processo in stato di pronto dall’ultima
schedulazione!
  s : tempo totale necessario al processo (sottorichiesta) per arrivare
a terminazione (risposta)!
Preemptive!
  R = (w+s)/s!
Non-preemptive!
  SJF è uno sceduling a priorità definita dal tempo (previsto) di CPU
burst.!
  Lo scheduling HRRN sceglie il processo con max R!
  Problemi: Starvation – processi con priorità bassa potrebbero
essere “dimenticati”!
  Soluzione: Aging – incrementare la priorità dei processi in funzione
del tempo trascorso in stato di pronto!
 
Processi brevi hanno “priorità” !
 
Implementa una sorta di “aging” implicito!
!
!
5.21!
5.22!
Round Robin (RR)!
  Ogni processo riceve la CPU per un breve intervallo (time
quantum), tipicamente 10-100 millisecondi. Passato tale quanto
di tempo, il processo ritorna alla fine della coda dei processi in
stato di pronto.!
  Con n processi nella coda e un quanto di tempo = q, ogni
processo riceve 1/n di CPU time in blocchi di q unità per volta.
Nessun processo attende più di (n-1)q unità.!
  Performance!
 
q grande ⇒ FIFO!
 
q piccolo ⇒ q deve esser maggiore del tempo di context
switch, per evitare un overhead eccessivo!
Es.: RR con quanto di tempo = 20!
!
!
!Process
!P1
!Burst Time!
!53!
!
! P2
! 17!
!
! P3
!68!
!
! P4
! 24!
  Il diagramma di Gantt: P1! P2! P3! P4! P1! P3! P4! P1! P3! P3!
0! 20! 37! 57! 77! 97! 117! 121! 134! 154! 162!
!
  In genere, rispetto a SJF, il tempo di turnaround è più alto, ma
risulta migliore il tempo di risposta!
5.23!
5.24!
Tempo di Context Switch!
5.25!
Code Multilivello!
Turnaround Time (medio) dipende da q!
5.26!
Code Multilivello!
  La coda dei processi pronti divisa in code separate:!
 
es.: foreground (interactive) e background (batch)!
  Ogni coda è gestita dal proprio algoritmo di scheduling!
 
foreground – RR!
 
background – FCFS!
  Scheduling tra le code!
 
Scheduling a priorità fissa; (es. prima tutti i processi in
foreground quindi quelli in background). Rischio di starvation.!
 
Time slice – ogni coda ha assegnata una percentuale di tempo
di CPU in cui può schedulare i propri processi;!
  es.:
– 
80% ai processi foreground con RR!
20% ai processi background con FCFS !
5.27!
5.28!
Code Multilivello con retroazione!
  Processi possono cambiare coda; !
 
Possibilità di implementare tecniche di aging!
  Parametri critici:!
 
numero di code!
 
Algoritmo di scheduling usato in ciascuna coda!
 
Criterio di promozione dei processi tra le code!
 
Criterio di declassamento dei processi tra le code!
 
Criterio di assegnazione di un processo ad una coda in
funzione del servizio richiesto!
Es.: Code Multilivello con retroazione!
  Tre code: !
 
Q0 – RR con q=8 milliseconds!
 
Q1 – RR con q=16 milliseconds!
 
Q2 – FCFS!
  Scheduling!
 
Ogni nuovo job è ammesso alla coda Q0 servita con RR.
Quando attivo, il processo ha 8 milliseconds per completare.
Se non completa passa alla coda Q1.!
 
In Q1 i job sono schedulati con criterio RR con q=16. Se tale
quanto non risulta sufficiente, il processo passa in Q2.!
 
In Q2 schedulazione secondo FCFS!
5.29!
Code multilivello con retroazione!
5.30!
Esempi: Unix classico!
  Code Multilivello con retroazione!
  Priorità ricalcolate ad ogni intervallo!
Ii = [ti, ti+1]
(es. ogni secondo)!
!Ti : uso CPU nell’ultimo intervallo Ii !
Stima l’uso medio della CPU come!
!T = (T+ Ti )/2!
Calcola la priorità (base definisce le classi di processi)!
!P(i) = base + T + nice!
  Processi che usano molta CPU vengono penalizzati!
  P(i) piccolo -> priorità alta!
5.31!
5.32!
!
!Process!
!
!Process!
!
!P1
!0
!
4 s = 240 tick!
!
!P1
!0
!
!
! P2
!1.5
!
2 s = 120 tick!
!
! P2
!1.5
!
!
! P3
!2.7 !
(0.1 CPU – 0.8s I/O)-cycle!
!
! P3
!2.7 !
!
! P4
!4.5
2 s = 240 tick !
!
! P4
!4.5
Base = 60
Tempo!
Arrival Time
T = (T + Ti)/2
P 1
60
0!
0.0!
T!
!
P = base + T!
P 2
P
Burst Time Distribution!
P
Base = 60
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
P1!
Tempo!
T = (T + Ti)/2
P 1
P
0.0!
Arrival Time
60
P
!
2 s = 240 tick !
P 3
T!
P
P 4
T!
P
5.34!
!Process!
!
!Process!
!
!P1
!0
!
4 s = 240 tick!
!
!P1
!0
!
!
! P2
!1.5
!
2 s = 120 tick!
!
! P2
!1.5
!
!
! P3
!2.7 !
(0.1 CPU – 0.8s I/O)-cycle!
!
! P3
!2.7 !
!
! P4
!4.5
2 s = 240 tick !
!
! P4
!4.5
Arrival Time
P 1
P
0.0!
P
Burst Time Distribution!
!
P = base + T!
P 2
T!
Base = 60
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
Tempo!
0!
P1!
0.0!
P1!
1.0!
90
60
30!
!
T = (T + Ti)/2
P
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
!
2 s = 240 tick !
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
0!
P1!
P1!
90
60
30!
60
0!
!
5.35!
4 s = 240 tick!
P = base + T!
P 2
T!
Burst Time Distribution!
60
2.0!
!
Arrival Time
P 1
P
60
1.0!
Processo
Schedulato!
P1!
!
Tempo!
T!
60!
5.33!
T = (T + Ti)/2
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
0!
1.0!
Base = 60
4 s = 240 tick!
P = base + T!
P 2
T!
Burst Time Distribution!
5.36!
!
!Process!
!
!Process!
!
!P1
!0
!
4 s = 240 tick!
!
!P1
!0
!
!
! P2
!1.5
!
2 s = 120 tick!
!
! P2
!1.5
!
!
! P3
!2.7 !
(0.1 CPU – 0.8s I/O)-cycle!
!
! P3
!2.7 !
!
! P4
!4.5
2 s = 240 tick !
!
! P4
!4.5
Base = 60
Tempo!
T = (T + Ti)/2
P 1
P
0.0!
Arrival Time
!
P = base + T!
P 2
T!
Burst Time Distribution!
P
Base = 60
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
Tempo!
0!
P1!
0.0!
P1!
1.0!
90
60
30!
105
60
45! 60
2.0!
0!
0
P2!
T = (T + Ti)/2
P 1
P
60
1.0!
P
!
P
2 s = 240 tick !
P 4
T!
P
P1!
P1!
90
105
60
45! 60
0!
0
0
60!
P2!
!
0
!
5.38!
!Process!
!
!Process!
!
!P1
!0
!
4 s = 240 tick!
!
!P1
!0
!
!
! P2
!1.5
!
2 s = 120 tick!
!
! P2
!1.5
!
!
! P3
!2.7 !
(0.1 CPU – 0.8s I/O)-cycle!
!
! P3
!2.7 !
!
! P4
!4.5
2 s = 240 tick !
!
! P4
!4.5
Arrival Time
P 1
P
P
Burst Time Distribution!
!
P = base + T!
P 2
T!
Base = 60
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
Tempo!
0!
P1!
0.0!
P1!
1.0!
90
60
30!
105
60
45! 60
0!
0
82
0
22! 90
60
30! 60
2.0!
3.0!
P2!
0
0!
P3!
P
4 s = 240 tick!
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
!
2 s = 240 tick !
P = base + T!
P 2
T!
Burst Time Distribution!
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
60
0!
P1!
P1!
90
60
30!
105
60
45! 60
0!
0
0
22! 90
60
30! 60
0
0!
P3!
82
82
22! 90
30! 60
6!
P1!
3.0!
3.1!
5.39!
P 1
2.0!
!
Arrival Time
T = (T + Ti)/2
P
60
1.0!
Processo
Schedulato!
0!
!
Tempo!
T!
60
30!
5.37!
T = (T + Ti)/2
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
P 3
T!
!
Base = 60
4 s = 240 tick!
60
3.0!
0.0!
Burst Time Distribution!
P = base + T!
P 2
T!
2.0!
!
Arrival Time
P2!
!
5.40!
!
!Process!
!
!Process!
!
!P1
!0
!
4 s = 240 tick!
!
!P1
!0
!
!
! P2
!1.5
!
2 s = 120 tick!
!
! P2
!1.5
!
!
! P3
!2.7 !
(0.1 CPU – 0.8s I/O)-cycle!
!
! P3
!2.7 !
!
! P4
!4.5
2 s = 240 tick !
!
! P4
!4.5
Base = 60
Tempo!
Arrival Time
T = (T + Ti)/2
P 1
P
0.0!
!
P = base + T!
P 2
T!
Burst Time Distribution!
P
Base = 60
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
Tempo!
0!
P1!
0.0!
P1!
1.0!
90
60
30!
105
60
45! 60
0!
0
82
0
22! 90
60
30! 60
2.0!
3.0!
3.1!
82
4.0!
P2!
P3!
P1!
22! 90
30! 60
6!
54
30!
6!
P 1
P
!
2 s = 240 tick !
P 3
T!
P
P 4
T!
P
P1!
90
105
60
45! 60
0!
0
82
0
22! 90
60
30! 60
82
22! 90
98
54
38! 75
P2!
!
0
0!
P3!
30! 60
6!
P1!
0
15! 63
0
3!
P3!
5.42!
!Process!
!
!Process!
!
!P1
!0
!
4 s = 240 tick!
!
!P1
!0
!
!
! P2
!1.5
!
2 s = 120 tick!
!
! P2
!1.5
!
!
! P3
!2.7 !
(0.1 CPU – 0.8s I/O)-cycle!
!
! P3
!2.7 !
!
! P4
!4.5
2 s = 240 tick !
!
! P4
!4.5
Tempo!
Arrival Time
P 1
P
0.0!
P
Burst Time Distribution!
!
P = base + T!
P 2
T!
Base = 60
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
Tempo!
0!
P1!
0.0!
P1!
1.0!
90
60
30!
105
60
45! 60
0!
0
82
0
22! 90
60
30! 60
82
22! 90
98
54
38! 75
98
38! 75 
2.0!
3.0!
3.1!
4.0!
4.1!
!
P2!
0
0!
P3!
30! 60
6!
P1!
3.1!
0
15! 63
0
3!
P3!
4.0!
15! 63
9!
!
!
5.43!
P2!
!
P 1
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
!
2 s = 240 tick !
P 3
T!
P
P 4
T!
P
T!
Processo
Schedulato!
0!
P1!
P1!
90
60
30!
105
60
45! 60
0!
0
82
0
22! 90
60
30! 60
82
22! 90
98
54
38! 75
98
38! 75 
15! 63
9!
0
54!
0!
3.0!
4.1!
P
4 s = 240 tick!
P = base + T!
P 2
T!
Burst Time Distribution!
60
2.0!
!
Arrival Time
T = (T + Ti)/2
P
60
1.0!
Processo
Schedulato!
P1!
!
T = (T + Ti)/2
T!
0!
5.41!
Base = 60
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
60
30!
4.0!
!
4 s = 240 tick!
60
3.0!
3.1!
Burst Time Distribution!
P = base + T!
P 2
T!
2.0!
!
0
0!
T = (T + Ti)/2
P
60
1.0!
Arrival Time
5.0!
!
P2!
!
0
0!
P3!
30! 60
6!
P1!
0
15! 63
6
3!
P3!
5.44!
P2!
0!
!
!Process!
!
!P1
!
!
!
Base = 60
Tempo!
0.0!
!
! P2
!1.5
!
! P3
!2.7 !
! P4
!4.5
P 1
2 s = 120 tick!
(0.1 CPU – 0.8s I/O)-cycle!
!
2 s = 240 tick !
P 4
T!
0!
P1!
P1!
90
60
30!
105
60
45! 60
0!
0
82
0
22! 90
60
30! 60
82
22! 90
98
54
38! 75
98
79
4.0!
5.0!
T!
P
T!
Processo
Schedulato!
60
3.0!
P
  Processi con più alta priorità hanno quanto di tempo maggiore!
  Es: Quantum = (140-Priority)x20 (o x5 se Priority >119)!
P 3
T!
  Code Multilivello!
  Priorità 0-99 (real time proc) 100-139 (normal proc’s) !
P = base + T!
P 2
P
Esempi: Linux!
4 s = 240 tick!
P
2.0!
4.1!
Burst Time Distribution!
!0
T = (T + Ti)/2
1.0!
3.1!
Arrival Time
P2!
!
Attivi!
priorità!
0!
1!
1!
99!
99!
P2!
139!
139!
P4!
140!
P3!
30! 60
6!
P1!
0
15! 63
0
3!
P3!
38! 75 
15! 63
9!
0
19! 94
54
34! 64 5.45!
0
4! 60
5.46!
Sistemi Multi-Processore!
!
  CPU scheduling deve bilanciare il carico e le condivisioni
Multiprocessing Simmetrico: ogni processore schedula autonomamente;!
  Alternative: !
!
accede alle strutture dati di sistema e gestisce la
suddivisione per tutti!
 
  Multiprogrammazione Simmetrica: ogni processore fa
scheduling autonomamente; !
 
  Coda
comune!
  Code
separate!
Affinità di processo: meglio evitare che un processo passi da un
processore all’altro!
  Affinità
forte: no switching !
  Affinità
debole: no switching preferito ma non garantito!
Bilanciamento del carico (in contrasto con l’affinità di processo) !
  Migrazione
guidata (push) - un processo speciale ribilancia!
  Migrazione
spontanea (pull) – se una coda si svuota, il
!processore sposta processi da una coda piena !
!
5.47!
140!
Multiple-Processor Scheduling!
tra i vari processori!
  Multiprogrammazione asimmetrica: un solo processore
Expired!
priorità!
Lista dei task!
Lista dei task!
0!
0
0!
0
0!
  Priorità ricalcolate quando il proc passa da Attivi ad Expired!
5.48!
Multicore Processors!
!
  Processori multipli sullo stesso chip!
 
 
Ogni core ha il suo insieme di registri!
Risparmio energetico e più veloce!
!!
  Multi-threading!
 
I Core possono schedulare diversi processi/thread!
  Multi-Thread gestito in hardware!
 
Quad core, dual thread = (virtualmente) 8 processori!
  Scheduling
parallelo di processi e (hw thread)!
5.49!