Processi e Thread
Scheduling
(Schedulazione)
1
Scheduling
Introduzione al problema dello Scheduling (1)
• Lo scheduler si occupa di decidere quale fra i processi
pronti può essere mandato in esecuzione
• L’algoritmo di scheduling ha impatto su:
– prestazioni percepite dagli utenti
– efficienza nell’utilizzo delle risorse della macchina
• Lo scheduling ha obiettivi diversi in diversi sistemi
(batch, interattivi…)
2
Introduzione al problema dello Scheduling (2)
Obiettivi principali degli Algoritmi di Scheduling:
• Fairness (Equità) - processi della stesso tipo devono
avere trattamenti simili
• Balance (Bilanciamento) - tutte le parti del sistema
devono essere sfruttate (CPU, dispositivi …)
• Sistemi batch
– Throughput - massimizzare il numero di job completati in un
intervallo di tempo
– Tempo di Turnaround - minimizzare il tempo di permanenza di
un job nel sistema
• Sistemi interattivi
– Tempo di risposta - minimizzare il tempo di riposta agli eventi
– Proporzionalità - assicurare che il tempo di risposta sia
proporzionale alla complessità dell’azione richiesta
3
Introduzione al problema dello
Scheduling (3)
• Due tipologie di processi :
– processi CPU-bound -- lunghi periodi di
eleborazione fra due richieste successive di I/O
– processi I/O-bound -- brevi periodi di elaborazione
fra due richieste successive di I/O
• Conviene dare priorità ai processi I/O-bound
4
Introduzione al problema dello
Scheduling (4)
P1
Lungo burst di CPU
Attesa completamento i/o
Corto burst di CPU
P2
tempo
• Processi compute bound (P1) and I/O bound (P2)
5
Introduzione al problema dello
Scheduling (5)
P1
P2
tempo
• Priorità ai compute bound
6
Introduzione al problema dello
Scheduling (6)
P1
P2
tempo
• Priorità agli I/O bound
– il funzionamento del sistema è più bilanciato
7
Introduzione al problema dello
Scheduling (7)
• Scheduling senza prerilascio
– lo scheduler interviene solo quando un processo
viene creato, termina o si blocca su una SC
• Scheduling con prerilascio
– lo scheduler può intervenire ogni volta che è
necessario per ottenere gli obiettivi perseguiti
• quando diventa pronto un processo a più alta priorità
rispetto a quello in esecuzione
• quando il processo in esecuzione ha sfruttato la CPU per
un tempo abbastanza lungo
8
Introduzione al problema dello
Scheduling (8)
• Scheduling in sistemi batch
– SJF (shortest job first)
• Scheduling in sistemi interattivi
– Round Robin
– Code Multiple
9
Scheduling nei sistemi Batch (1)
• Un esempio di scheduling secondo la strategia che
privilegia il job più corto (SJF “Shortest Job First”)
– l’insieme dei job da schedulare è noto all’inizio
– si conosce il tempo di esecuzione T di ogni job
– i job sono schedulati in ordine di T crescente
– SJF minimizza il tempo di turnaround medio
– non c’è prerilascio
10
Scheduling nei sistemi Batch (2)
Perché SJF funziona?
4 job A,B,C,D con tempi di esecuzione a, b, c, d
–
–
–
–
turnaround(A) -- a
turnaround(B) -- a + b
turnaround(C) -- a + b + c
turnaround(D) -- a + b + c + d
turnaround totale 4a + 3b + 2c + 1d
minimo quando a,b,c,d sono in ordine crescente
11
Scheduling nei sistemi Batch (3)
Tre livelli di scheduling
12
Scheduling nei sistemi Batch (4)
• Admission scheduler
– decide quali job (sottomessi, memorizzati su disco)
ammettere nel sistema (viene creato il processo
corrispondente)
• Memory scheduler
– i job ammessi devono essere caricati in memoria
centrale prima di poter essere eseguiti
– se non tutti i job entrano in MC, il memory scheduler
sceglie quali job caricare in memoria e quali tenere su
disco (swapped out)
• CPU scheduler
– lo scheduler che abbiamo trattato finora
13
Scheduling nei sistemi Interattivi
Scheduling Round Robin (1)
– (a) lista dei processi pronti
– (b) lista dei pronti dopo che B ha usato il suo quanto
(quantum) di tempo
14
Scheduling Round Robin (2)
• Come fissare il quanto di tempo
– deve essere abbastanza lungo da ammortizzare il costo
di un context switch (ordine 1 ms)
– deve essere abbastanza breve da permettere una
risposta veloce agli utenti interattivi
– in sistemi reali tipicamente 20-120 ms
• RR non favorisce i processi I/O bound
15
Scheduling con priorità (1)
• Ogni processo ha una priorità
• Ogni volta va in esecuzione il processo a priorità
più elevata
• Punti chiave :
– come assegnare le priorità (statiche, dinamiche…)
– come evitare attesa indefinita della CPU nei processi
a priorità più bassa
– come individuare i processi I/O bound
• per elevare la loro priorità
16
Scheduling con priorità (2)
• Molte strategie per il calcolo della priorità
• Tipicamente :
– priorità dinamica (es. più elevata per i processi che
passano da bloccato a pronto)
– legata alla percentuale f del quanto di tempo che è
stato consumato l’ultima volta che il processo è
andato in esecuzione (es. proporzionale a 1/ f ,
favorisce i processi I/O bound)
– decrescente nel tempo per i processi che rimangono
pronti (es. per impedire l’attesa indefinita)
17
Scheduling con Code multiple (1)
Esempio di algoritmo di scheduling a code multiple
con 4 classi di priorità
18
Scheduling con Code multiple (2)
• Scheduling Round Robin all’interno della classe
con priorità più elevata
• I processi che usano tutto il quanto di tempo più
di un certo numero di volte vengono passati alla
classe inferiore
• Alcuni sistemi danno quanti più lunghi ai
processi nelle classi basse (compute-bound) per
minimizzare l’overhead del cambio di contesto
19
Scheduling dei Thread (1)
• Lo scheduling dei thread
– utilizza algoritmi simili a quelli visti finora
– viene implementato in modo diverso nel thread
a livello utente e a livello kernel
20
Scheduling dei Thread (2)
• Lo scheduling dei thread user level
– il SO non conosce l’esistenza dei thread, quindi
schedula i processi
– durante l’esecuzione di un processo lo
schedulatore della libreria dei thread decide
quale thread mandare in esecuzione
– le interruzioni del clock non sono visibili allo
schedulatore di livello utente
– lo schedulatore può intervenire solo se invocato
esplicitamente (es. thread_yield)
– non c’è prerilascio (all’interno di un singolo
processo)
21
Scheduling dei Thread (3)
• Lo scheduling dei thread kernel level
– il SO schedula i thread (non i processi)
– quando un thread si blocca il SO può decidere
di mandare in esecuzione un altro thread di quel
processo o un thread di un processo diverso
• può scegliere se pagare il cambio di contesto o no
– le interruzioni del clock permettono allo
schedulatore di tornare in esecuzione alla fine
del quento di tempo
• i quanti di tempo sono assegnati direttamente ai
thread
• si può effettuare prerilascio
22
Alcuni esempi di schedulatori
Unix, Linux, Windows 2000
23
Scheduling in UNIX
Scheduling a due livelli :
• scheduler a basso livello (low-level): sceglie il
prossimo processo da mandare in esecuzione fra quelli
in RAM
• scheduler ad alto livello (high-level): sposta i processi
fra RAM e disco in modo da dare a tutti la possibilità
di ottenere l’accesso alla CPU
Nel seguito descriveremo lo scheduler a basso livello
24
Lo scheduler di UNIX (1)
Lo scheduling a basso livello è basato su una coda a più
livelli di priorità
25
Lo scheduler di UNIX (2)
• Si esegue il primo processo della prima coda non vuota
per massimo 1 quanto (tipicamente 100ms)
• Scheduling round robin fra processi con la stessa priorità
• Una volta al secondo tutte le priorità vengono
ricalcolate:
priorità = cpu _usage + nice + base
cpu _usage : numero di clock tick per secondo che il processo ha
avuto negli ultimi secondi
nice : valore intero nell’intervallo [-20, +20]
base : valore intero che dipende da cosa sta facendo il processo
• ha il valore della priorità precedente se il processo sta eseguendo
elaborazione normale in user mode
• ha un valore negativo molto basso se sta effettuando I/O da disco o da
terminale
26
Lo scheduler di UNIX (3)
Meccanismo di aging (invecchiamento o decadimento)
usato per il calcolo di cpu _usage :
• Fissiamo un intervallo di decadimento t
• I tick ricevuti mentre il processo P è in esecuzione
vengono accumulati in una variabile temporanea tick
• Ogni t
cpu _usage = cpu _usage / 2 + tick;
tick = 0;
• Il peso dei tick utilizzati descresce col tempo
• La penalizzazione dei processi che hanno utilizzato
molta CPU diminuisce nel tempo
27
Lo scheduler di Linux (1)
• Vengono schedulati i thread, non i processi
• Tre classi di thread : real-time FIFO, real-time Round
Robin, Timesharing
• Ogni thread ha
– una priorità nell’intervallo [0, +40], generalmente all’inizio la
priorità di default è 20
– un quanto (misurato in jiffy = 10ms, sono i tick del clock)
• Lo scheduler calcola la goodness (gdn, lett. bontà) di
ogni thread pronto come
if (class == real-time) gdn = 1000 + priority
if (class == timeshar && quantum > 0) gdn = quantum + priority
if (class == timeshar && quantum == 0) gdn = 0
28
Lo scheduler di Linux (2)
Algoritmo di scheduling :
• Ogni volta viene selezionato il thread con goodness
maggiore
• Ogni volta che arriva un tick il quanto del thread in
esecuzione viene decrementato
• Un thread viene de-schedulato se si verifica una delle
seguenti condizioni
– il quanto diventa 0
– il thread si blocca
– diventa ready un thread con una goodness maggiore
29
Lo scheduler di Linux (3)
Algoritmo di scheduling (contd.):
• Quando tutti i quanti dei thread ready sono andati a 0 , lo
scheduler ricalcola il quanto di ogni thread (anche se
blocked) come segue :
quantum = quantum / 2 + priority
30
Scheduling in Windows 2000 (1)
• Win32 permette all’utente di specificare :
– priorità di un processo (6 livelli diversi)
– priorità di un thread all’interno di un processo (7 livelli diversi)
• Windows 2000 mappa le 42 combinazioni possibili su 32
livelli di priorità
31
Scheduling in Windows 2000 (2)
Corrispondenza fra le priorità di Win32 e quelle di Windows 2000
32
Scheduling in Windows 2000 (3)
Windows 2000 fornisce 32 priorità diverse per i thread
33
Scheduling in Windows 2000 (4)
Algoritmo di scheduling :
• Si esegue il primo thread della prima coda non vuota
per massimo 1 quanto (20ms--120ms)
• Scheduling round robin fra thread con la stessa priorità
• Come variano le priorità nel tempo :
– i thread tipicamente entrano a priorità 8
– la priorità viene elevata se:
• viene completata una operazione di I/O (+1 disco, +2 linea seriale, +6
tastiera, +8 scheda audio …)
• termina l’attesa su un semaforo, mutex, evento (+1 background, +2
foreground)
• l’input nella finestra di dialogo associata al thread è pronto
34
Scheduling in Windows 2000 (5)
Algoritmo di scheduling :
• Come variano le priorità nel tempo (cont.):
– la priorità viene abbassata se:
• un thread usa tutto il suo quanto (-1), fino a ritornare alla priorità base
– se un thread non ha girato per un tempo maggiore di una
soglia fissata, allora passa per 2 quanti a priorità 15 (serve a
gestire potenziali inversioni di priorità)
• Quando una finestra va in foreground il quanto dei
thread corrispondenti viene allungato
35
Scheduling in Windows 2000 (6)
Un esempio di inversione di priorità
36