6 slide/pagina

11/03/2014
Kernel
Inter‐process communication
Process management
Scheduling
Mutual exclusion
Interrupt handling
p
g
¾
¾
¾
¾
¾
¾
Compiti del sistema operativo
Creazione e terminazione di processi
Schedulazione
Mutua esclusione
Sincronizzazione
Gestione delle interruzioni
Comunicazione tra processi
Gestione della memoria
Il sistema operativo deve:
¾ Allocazione e deallocazione della memoria ai processi
¾ consentire l'esecuzione concorrente dei vari task
(parallelismo virtuale);
¾ Caricamento dei processi in memoria principale
¾ decidere
d id
l' di di esecuzione
l'ordine
i
d i varii task
dei
t k (scheduling),
( h d li )
rispettando i requisiti specificati;
¾ Gestione della memoria virtuale
¾ Protezione della memoria
¾ risolvere potenziali conflitti di temporizzazione
nell'accesso a risorse condivise (mutua esclusione);
¾ consentire l'esecuzione di eventi asincroni (interruzioni).
Visione a strati
Gestione delle periferiche
Processi utente
¾ Configurazione
Interfaccia utente (Shell)
¾ Inizializzazione
File system
Gestione periferiche
¾ Protezione delle periferiche
¾ Buffering
Gestione della memoria
Gestione dei processi (kernel)
Macchina fisica
1
11/03/2014
File system
¾ Gestione dell'albero del file system
Concorrenza
Confrontando l'esecuzione sequenziale con quella
concorrente, sembra non ci siano vantaggi:
Response times
R1 = 4
¾ Creazione e cancellazione di file
¾ Lettura e scrittura di file
¾ Copia di file
esecuzione
sequenziale
i l
¾ Ricerca di file
R2 = 10
0
2
4
6
8
10
12
R3 = 15
14
¾ Salvataggio e ripristino file
¾ Protezione dei file (controllo degli accessi)
R1 = 10
esecuzione
concorrente
R2 = 15
0
2
Interfaccia utente
¾ Interprete dei comandi utente (Shell)
¾ Interfaccia grafica
¾ Chiamate di sistema (interfaccia verso i processi)
¾ Librerie
6
4
8
10
12
R3 = 14
14
Concorrenza
Risulta vantaggiosa nel gestire task periodici a frequenze
diverse (nei tempi di attesa vengono eseguiti altri task):
esecuzione
sequenziale
(FIFO)
¾ Gestione degli errori
0
2
4
6
8
10
12
14
16
18
20
0
2
4
6
8
10
12
14
16
18
20
esecuzione
concorrente
(Rate Monotonic)
Concorrenza
La concorrenza è la capacità di portare avanti
l'esecuzione di più processi per volta, attraverso
un'alternanza delle esecuzioni:
τ1 τ2
τ3
Multiprogrammazione
Ed è anche importante per realizzare la
multiprogramazione in sistemi multiutente (sfrutta le
attese di input per gestire altri utenti):
esecuzione
q
sequenziale
esecuzione
parallela
esecuzione
concorrente
2
11/03/2014
Concorrenza
Esempio 2
La concorrenza dunque consente di sfruttare
meglio i tempi di inattività dei processi (ad
esempio, attese su dati di ingresso, o attese per la
riattivazione di task periodici).
τ1
Tuttavia, la concorrenza può generare situazioni di
conflitto durante l'accesso a risorse condivise (ad
esempio, quando più task operano su dati globali
comuni).
Ciascun thread incrementa un contatore ogni volta che
rileva un evento:
buffer
globale
τ1
x = counter;;
x = x + 1;
counter = x;
τ1
10
10
τ1
counter
bloccaggio
read(x)
read(y)
3
5
scrittura
buffer
llegge (3,5)
(3 5)
correttamente!
Meccanismo semaforico
Cerca di colpire il bersaglio nel punto (x,y)
La mutua esclusione viene realizzata attraverso un due
primitive wait(s) e signal(s): che utilizzano una variabile di
sistema s, detta semaforo:
τ2
τ1
τ2
(x, y)
x = (a + b)/c;
y = (a − b) /c;
τ2
x: 3
y: 5
x←1
y←8
τ2
Un evento
viene perso!
11
(x, y)
variabili globali
8
τ1
Esempio 2
τ1
3
x = 1
y = 8
8
τ2
Stima la posizione successiva (x,y)
di un bersaglio
read(y)
Soluzione: l'accesso al buffer condiviso dev'essere
consentito ad un task per volta (mutua esclusione):
x = counter;;
x = x + 1;
counter = x;
11
read(x)
Accesso a risorse condivise
counter
counter
x←1
y←8
τ2
τ2
counter
c: 10
legge (3,8)
che non appartiene
alla traiettoria!
τ1
Esempio di conflitto
τ2
x: 3
y: 5
x = 1
y = 8
(x, y)
lettura
buffer
m1 = k1*(ax ‐ x);
m2 = k2*(ay ‐ y);
sezione
critica
wait(s);
x = ... y = …
signal(s);
scrittura
buffer
lettura
buffer
wait(s);
m1 = … x;
m2 = … y;
signal(s);
sezione
critica
3
11/03/2014
Meccanismo semaforico
¾ Ogni risorsa è protetta da un semaforo diverso.
¾ s = 1 ⇒ risorsa libera,
s = 0 ⇒ risorsa occupata.
¾ wait(s):
− se s == 0, il task deve essere bloccato su una coda
associata
i t all semaforo
f
(l politica
(la
liti di gestione
ti
d ll
della
cosa dipende dal SO, di solito è FIFO o prioritaria).
− altrimenti si pone s = 0.
¾ signal(s):
− se ci sono task bloccati, si risveglia il primo in coda
(s rimane a 0), altrimenti pone s = 1.
Note implementative
s = create_sem(n)
crea la struttura semaforo, comprendente un contatore
(s.count) inizializzato a n, e una coda di task (s.queue).
wait(s) {
if (s.count == 0)
<blocca il task su s.queue>
else s.count--;
}
signal(s) {
if (!empty(s.queue))
<sblocca il primo task in s.queue>
else s.count++;
}
Meccanismo semaforico
¾ Se la variabile s è inizializzata a 1, la coppia wait(s)
signal(s) realizza il meccanismo di mutua esclusione:
¾ Un semaforo inizializzato a 0 può essere utilizzato per
attendere un evento generato da un altro task.
τ1
τ1
τ2
Semafori di sincronizzazione
τ2
τ3
R
chiama la signal al verificarsi dell'evento
signal(s);
wait(s);
wait(s)
bloccato
τ1
wait(s)
τ2
τ3
signal(s)
signal(s)
bloccato
wait(s)
τ1
bloccato
signal(s)
wait(s)
s = 1
priorità
s = 0
s = 1
Risorse multi-unità
¾ Un semaforo che può assumere solo gli stati 0 e 1 è
detto semaforo binario.
¾ Esistono risorse multi‐unità che ammettono l'accesso
simultaneo di più task. Se le unità sono n, il semaforo
viene inizializzato ad n.
¾ wait(s):
− se s == 0, il task deve essere bloccato su una coda
associata al semaforo;
− altrimenti si decrementa s.
¾ signal(s):
− se ci sono task bloccati, si risveglia il primo in coda
per farlo entrare, altrimenti si incrementa s.
signal(s)
τ2
Gestione dei processi
Un processo rappresenta l'unità di esecuzione in un SO.
Programma: entità passiva descritta dal codice sorgente.
Processo:
entità attiva determinata dall'esecuzione del
programma su un particolare insieme di dati.
Un processo è rappresentato dai seguenti elementi:
ƒ codice:
istruzioni compilate ed eseguibili;
ƒ dati:
spazio di memoria per le variabili globali;
ƒ contesto:
stato dei registri di CPU;
ƒ stack:
spazio di memoria per le variabili locali.
ƒ parametri: tipo, priorità, argomenti, ...
4
11/03/2014
Gestione dei processi
Ready queue
¾ I processi non condividono memoria!
In un sistema concorrente, più task possono essere attivi
ma solo uno può essere in esecuzione (running).
¾ Processi diversi
ƒ eseguono codici diversi;
ƒ accedono a spazi di memoria distinti.
¾ Un task attivo che non è in esecuzione si dice pronto
(ready).
¾ Essi possono comunicare mediante un meccanismo a
scambio di messaggi messo a disposizione dal SO:
P1
P2
channel
¾ I task p
pronti sono mantenuti in una coda ((readyy q
queue),
),
gestita mediante una politica di scheduling.
¾ Il processore viene assegnato al primo task in coda
attraverso una procedura detta dispatching.
activation
dati
dati
Ready queue dispatching
τ3
Processi e thread
τ2
τ1
termination
CPU
Preemption
¾ Un processo può essere costituito da più sottoprocessi
concorrenti, detti thread.
¾ I thread di uno stesso processo
ƒ condividono lo stesso spazio di memoria;
ƒ hanno stack distinti;
ƒ possono eseguire lo stesso codice. τ1 τ2
E' un meccanismo che consente di interrompere
l'esecuzione di un task a favore di un altro task ritenuto più
importante. Il task interrotto viene rimesso in coda pronti.
activation
τ3 Pi
Ready queue
τ3
τ2
τ1
dispatching
termination
CPU
preemption
Esempio di processo
composto da 3 thread:
¾ La preemption facilita la concorrenza e consente di
ridurre i tempi di risposta di task ad alta priorità.
Nel seguito indicheremo come task
una generica attività di calcolo
concorrente (processo o thread).
¾ Può essere disabilitata (del tutto o temporaneamente)
per garantire la consistenza di certe operazioni critiche.
dati
Task
Schedulazione
¾ Sequenza di istruzioni che, in assenza di altre attività,
viene eseguita dal processore in modo sequenziale fino
al suo completamento.
activation time
Task τi
Ci
start time
ai
computation
time
finishing time
si
fi
Ri
La quantità fi − ai
prende il nome di tempo di risposta Ri
t
E' un particolare assegnamento di task al processore che
determina la sequenza temporale di esecuzione:
Formalmente, dato un insieme di task Γ = {τ1, ..., τn}, una
schedulazione è una funzione costante a tratti σ: R+ → N
che
h associa
i un intero
i
k ad
d ognii intervallo
i
ll temporale
l [t,
[ t+1)
1)
col seguente significato:
k = 0 in [t, t+1) il processore è IDLE k > 0 in [t, t+1) il processore esegue τk
5
11/03/2014
Schedulazione
τ1
idle
τ2
Stati di un task
τ3
idle
BLOCKED
σ(t)
signal
wait
3
2
dispatching
1
0
t1
t2
t3
t4
t
activation
termination
READY
¾ Ogni intervallo [ti, ti+1) viene detto time slice.
RUNNING
preemption
¾ Negli istanti t1, t2, t3, e t4 il processore effettua un
cambio di contesto (context switch).
ACTIVE
Schedulazione preemptive
Real-Time Task
¾ Un task di tipo real‐time è caratterizzato da un vincolo
sul tempo di risposta, detto deadline:
priorità
τ1
τ2
deadline relativa Di
τ3
0
2
4
6
8
10
12
14
16
18
20
τi
ai
σ(t)
si
fi
tempo di risposta Ri
t
di
deadline assoluta
(di = ai + Di)
3
Un task real‐time τi si dice fattibile se termina
entro la sua deadline assoluta, ossia se fi ≤ di,
o equivalentemente, se Ri ≤ Di
2
1
0
0
2
4
6
8
10
12
14
16
18
20
Stati di un task
priorità
Slack e Lateness
Di
running
τ1
running
τ2
ready
running
τ3
0
2
4
running
ready
6
8
10
τi
running
12
14
16
18
ai
si
fi
Ri
20
slacki = di - fi
Di
σ(t)
τi
3
2
1
0
0
2
4
6
8
10
12
14
16
18
20
ai
t
di
si
lateness Li = fi - di
di
fi
t
Ri
6
11/03/2014
Complessità
• Nel 1975, Garey e Johnson hanno dimostrato che il
problema generale di trovare una schedulazione
fattibile è di tipo NP hard.
• Tuttavia è possibile trovare algoritmi di complessità
polinomiale
li
i l in
i casii particolari:
ti l i
¾ Singolo processore
¾ Task completamente preemptive
¾ Attivazioni simultanee
¾ Restrizioni sui vincoli
Problema dello scheduling
Dato un insieme Γ di n task, un insieme P di m
processori, e un insieme R di r risorse, una
schedulazione è un assegnamento di P e R a Γ in ogni
intervallo temporale [t, t+1):
Importanza della complessità
• Si consideri un’applicazione con n = 30 task su una
macchina in cui il passo elementare impiega 1 μs
• Si considerino tre algoritmi con complessità:
A1: O(n)
O( )
A2: O(
O(n8)
A3: O(8n)
Γ
P
Scheduling
algorithm
σ
30 μs
40.000
miliardi di anni
182 ore
R
Problema dello scheduling
Misura di prestazioni
• Una schedulazione σ si dice fattibile se soddisfa un
insieme di vincoli specificati sui task in fase di progetto.
• Fattibilità:
∀i
Ri ≤ Di
• Un insieme di tasks Γ si dice schedulabile con un
algoritmo A, se A genera una schedulazione fattibile.
• Tempo medio di risposta:
R =
1 n
∑ ( fi − ai )
n i =1
Esempi di vincoli
• Tempo di completamento:
tc = max ( f i ) − min (ai )
• Massima Lateness:
Lmax = max( f i − d i )
¾ Temporali:
attivazione, completamento, esecuzione.
¾ di precedenza: impongono un ordinamento tra i task.
¾ su risorse:
sincronizzazione per mutua esclusione.
• Numero di late task:
i
i
i
N late =
n
∑ HS ( f
i =1
i
− di )
7
11/03/2014
Algoritmi Classici
Shortest Job First (SJF)
¾ First Come First Served
Seleziona il task con il tempo di calcolo più corto.
¾ Shortest Job First
ƒ Può essere eseguito in modo preemptive o
non p
preemptive
p
¾ Priority Scheduling
ƒ Minimizza il tempo di risposta medio
¾ Round Robin
46
First Come First Served
SJF - Ottimalità
Assegna la CPU ai task in base al loro tempo di
arrivo (intrinsecamente non preemptive):
τ3
σ
τ1
τ2
τ1
τ2
a1 a2 a3 a4
s2
≠ SJF
L
σ’
Ready queue
τ4
σ
CPU
τ3
s3
S
S
r0
L
fS’ < fL
t
fL’ = fS
fS’ + fL’ ≤ fS + fL
τ4
s4
t
f4
R (σ') =
1 n
1 n
( f 'i − ri ) ≤ ∑ ( f i − ri ) = R (σ)
∑
n i =1
n i =1
47
First Come First Served
SJF - Ottimalità
‐ Imprevedibilità
σ
I tempi di risposta dipendono dai tempi di arrivo.
a1 a2 a3
R1 = 20
R2 = 26
4
8
a3 a2 a1
τ3
0
12
R1 = 26
16
R2 = 8
τ2
4
20
24
τ3
28
t
12
16
20
R3 = 2
28
σ*
≥ R (σ*)
R (σ SJF ) è il minimo tempo di risposta
t
24
...
...
σ* = σSJF
32
τ1
8
σ’’
R (σ) ≥ R (σ') ≥ R (σ' ' )
R3 = 26
τ2
τ1
0
σ’
ottenibile da un algoritmo
32
45
48
8
11/03/2014
SJF è adatto per il Real-Time?
‐ Non è ottimo nel senso della fattibilità
τ2
τ1
0
4
8
12
16
4
8
12
d3
28
32
d2
d3
28
32
τ3
20
24
d1
SJF not feasible
τ3
τ2
0
d2
d1
A ≠ SJF feasible
16
20
24
‐ La coda ready è gestita con FCFS, ma ...
‐ Ogni task τi non può eseguire per più di Q
unità di tempo (Q = time quantum).
‐ Esaurito Q,
Q τi viene inserito in coda pronti.
pronti
t
τ1
Round Robin
READY queue
CPU
t
Q expired
49
52
Scheduling Prioritario
Round Robin
‐ Ogni task ha una priorità: Pi ∈ [0, 255]
n = numero di task nel sistema
‐ Il task selezionato per l’esecuzione è quello
con la priorità più elevata.
nQ
nQ
t
‐ Task
T k a parii priorità
i ità sono serviti
iti con FCFS.
FCFS
C
Ri ≅ (nQ) i = nCi
Q
Q
NOTA:
pi ∝ 1/Ci
pi ∝ 1/ai
⇒
⇒
SJF
FCFS
Time sharing
Ogni task si comporta come se fosse eseguito da
solo su un processore dedicato n volte più lento.
50
53
Scheduling Prioritario
Round Robin
‐ Problema: starvation
task a bassa priorità possono subire lunghi ritardi per
la preemption di task a priorità più elevata.
‐ se Q > max (Ci) allora RR ≡ FCFS
‐ se Q ≅ context switch time (δ) allora
n(Q
(Q + δ))
n(Q
(Q + δ))
‐ Soluzione: aging
t
la priorità cresce con il tempo di attesa.
Q+δ
51
Ri ≅ n(Q + δ)
⎛Q+δ⎞
Ci
⎟⎟
= nCi ⎜⎜
Q
⎝ Q ⎠
54
9
11/03/2014
Multi-Level Scheduling
system tasks
PRIORITY
High priority
interactive tasks
Medium priority
RR
CPU
batch tasks
Low priority
FCFS
55
Multi-Level Scheduling
priority
CPU
56
10