Sistemi Distribuiti - Dipartimento di Ingegneria Industriale e dell

Transcript

Sistemi Distribuiti - Dipartimento di Ingegneria Industriale e dell
Sistemi Distribuiti
Sincronizzazione distribuita
1
Sincronizzazione nei Sistemi Distribuiti
• Come si possono sincronizzare i processi in
un sistema distribuito?
– I metodi classici (semafori, etc.) non sono
utilizzabili (per assenza di memoria condivisa)
– Si possono adottare:
• soluzioni centralizzate (diventano pesanti
all’aumentare del numero delle macchine coinvolte
e introducono un single point of failure)
• soluzioni distribuite sono complesse dal momento
che i processi possono utilizzare solo informazioni
locali e non possono contare sulla presenza di un
“orologio globale”
2
1
Sincronizzazione orologi
• Esempio di problemi a causa della mancata
sincronizzazione degli orologi
– Programma make di unix
• Serve per compilare file sorgenti di un progetto
• Se la data del file sorgente è superiore alla data del file
compilato, significa che sono state fatte modifiche e quindi
occorre ricompilare il sorgente
– Scenario centralizzato
• Nessun problema di gestione
– Scenario
S
i distribuito
di ib i
• Problemi se file sorgente e file compilato sono memorizzati su
macchine diverse
3
Sincronizzazione orologi
Computer su cui
esegue il compilatore
Computer su cui
esegue l’editor
2144
2145
2146
2147
creato prog.o
2142
2143
2144
2145
clock
locale
modificato prog.c
Tempo reale
Se lancio “make” e questo si basa sulla data e ora di
aggiornamento locale, non ricompila prog.c
4
2
Orologi Virtuali
• Come funziona l’orologio del computer?
– Un timer al quarzo genera impulsi ad una
frequenza
q
fissa.
– Questi impulsi sono usati per gestire un
contatore
– Il valore del contatore rappresenta la data+ora
– Non importa che l’ora del computer
corrisponda all’ora del mondo reale ma la sua
consistenza
i
– Su computer diversi abbiamo clock diversi non
sincronizzati
5
Network Time Protocol
’
’
Richiesta del tempo ad un time server.
T  T3 
(T2  T1 )  (T4  T3 )
2
6
3
The Berkeley Algorithm
Esempio di algoritmo per la sincronizzazione
periodica di clock di macchine diverse
7
Orologi Virtuali
• Osservazioni fatte da Lamport:
– Non è necessaria una sincronizzazione assoluta
– Se due processi non interagiscono tra di loro non è
necessario sincronizzarli
– Ai processi non interessa sapere il valore dell’orologio,
ma solo l’ordine in cui accadono gli eventi
8
4
Orologi Virtuali
• Relazione introdotta da Lamport
– “happens-before” denotata con il simbolo 
– A B, significa che A accade prima di B
• Possibili situazioni
– Se A B sono eventi nello stesso processo e A accade
prima di B, allora A B è vera
– Se A è un evento di invio messaggio e B è l’evento di
ricezione del msg, allora A  B è vera
9
Orologi Virtuali
• Proprietà relazione
– Transitiva
• Se A B e B C allora A C
– Se due eventi x,y accadono su diversi processi e
non comunicano fra di loro, allora
• xy non è vera
• yx
 non è vera
Si parla di eventi concorrenti
10
5
Orologi Virtuali
0
6
12
18
24
30
36
42
48
54
60
A
D
0
8
16
24
32
40
48
56
64
72
80
B
C
0
10
20
30
40
50
60
70
80
90
Il valore
l
d li
degli
orologi locali
non rispecchia
la relazione
happens-before
100
11
Ordinamento totale degli eventi
• Come assegnare il tempo C(e) ad un evento e per
ottenere un ordinamento totale degli eventi?
– Se A accade prima di B sullo stesso processo
allora C(A) < C(B)
– Se A e B sono gli eventi di spedizione e ricezione
messaggio, allora C(A)<C(B)
– Per ogni A,B allora C(A)C(B)
– Correzioni del tempo possono essere fatto solo
spostando in avanti il tempo
L’algoritmo ci permette di stabilire un ordine totale
degli eventi (per evitare che due eventi di processi
diversi possano avere lo stesso valore basta
appendere l’id del processo)
12
6
Ordinamento di Lamport
• Soluzione di Lamport:
– Il messaggio trasporta il valore dell
dell’orologio
orologio
del sender
– All’arrivo questo valore è confrontato con
l’orologio del ricevente
– Se l’orologio del ricevente ha un tempo
inferiore allora si aggiorna in modo che il
inferiore,
tempo sia superiore a quello arrivato con il
messaggio
13
Ordinamento di Lamport
0
6
12
18
24
30
36
42
48
54
60
A
D
0
8
16
24
32
40
48
56
64
72
80
B
C
0
10
20
30
40
50
60
70
80
90
100
0
6
12
18
24
30
36
42
48
70
76
A
D
0
8
16
24
32
40
48
61
69
77
85
B
C
0
10
20
30
40
50
60
70
80
90
100
14
7
Esempio algoritmo di Lamport:
Totally-Ordered Multicasting
inc. di 1%
inc. di 1000
Stato inconsistente
a)
b)
c)
d)
e)
Per ottenere un ordinamento degli eventi uguale per tutti va inviato un messaggio di
multicast a tutti.
Ogni processo che riceve il messaggio lo mette in una coda ordinata in base al
timestamp del messaggio
Il ricevente invia un ack in multicast agli altri processi
Se si assume che i messaggi non si perdano e che i messaggi dallo stesso mittente
arrivano nell’ordine con cui sono stati inviati, si ottiene una coda uguale per tutti i
processi e quindi un ordine totale degli eventi
Il messaggio in testa alla coda può essere smistato all’applicazione se sono arrivati gli
ack relativi da tutti i processi
15
Lamport non cattura la casualità
Se A accade prima di B allora C(A) < C(B),
ma se C(A) < C(B) non posso dire che A accade prima di B.
Non posso dire
che l’invio di m1
precede l’invio
di m2
16
8
Lamport non cattura la casualità
Se A accade prima di B allora C(A) < C(B), ma se C(A) < C(B) non
posso dire che A accade prima di B. Devo introdurre i vector
timestamps:
•
Ogni processo mantiene un proprio vettore locale Vj (di N elementi se
ci sono N processi coinvolti); il valore di Vj[i] indica quali eventi
avvenuti nel processo i sono noti al processo j;
• Ad ogni nuovo evento (incluse ricezioni di messaggi) il processo i
incrementa Vi[i], inoltre ad ogni invio di un messaggio il processo
spedisce il proprio vettore insieme al messaggio.
• Ogni
g volta che arriva un messaggio,
gg , questo
q
porta
p
indicazione di tutti gli
g
eventi che lo hanno “causato” (direttamente o indirettamente): ogni
elemento del vettore del ricevente viene aggiornato al max tra il valore
precedente e il valore ricevuto.
Se e1 ed e2 hanno timestamp vt1 e vt2 allora
e1  e2 se e solo se vt1[j]  vt2[j] per ogni j
17
Vector Timestamps
Esempio:
[1,0,0]
[0,1,0]
[0,0,1]
[2,0,0]
[0,2,0]
[0,0,2]
[2,3,0]
[0,0,3]
[3,0,2]
[2,4,3]
[4,0,2]
[2,5,3]
[4,0,4]
[4,5,5]
18
9
Vector Timestamps
Accenno di dimostrazione:
a) e1  e2 implica vt1[j]  vt2[j] per ogni j
ipotesi: esiste un
percorso da e1 a e2 (formato da uno o più archi); per come sono
definiti i vettori,
vettori la relazione vale per ciascun arco,
arco e quindi per
transitività vale per tutto il percorso;
b) vt1[j]  vt2[j] per ogni j implica e1  e2
ipotesi: vt1[j]  vt2[j] per ogni j; supponiamo per assurdo che non è
vero che e1  e2: questo può significare o che esiste un percorso di
direzione opposta, e2  e1, o che non esiste alcun percorso che collega
i due eventi. Nel primo caso, per quanto dimostrato al punto a)
d
dovrebbe
bb essere vt2[j]
t2[j]  vt1[j]
t1[j] per ognii j,
j in
i contraddizione
t ddi i
con
l’ipotesi. Consideriamo il secondo caso: e1 ed e2 devono appartenere a
processi diversi, altrimenti esisterebbe certamente un percorso che li
collega; sia e1 un evento del processo di indice i ed e2 un evento del
processo di indice k: ma se Pk non ha visto l’evento e1 di Pi allora
necessariamente vt2[i]<vt1[i], in contraddizione con l’ipotesi.
19
Vector Timestamps
Esempio:
[0,0,1]
[2,0,0]
[0,2,0]
[0,0,2]
[2,3,0]
[0,0,3]
[3,0,2]
e1

e2
[2,4,3]
[4,0,2]
[2,5,3]
[0,0,4]
[2,5,5]


[0,1,0]

e1
[1,0,0]
e2
20
10
Comunicazione causale
I vector timestamps possono essere utilizzati per garantire
l’ordine corretto dei messaggi e delle risposte ai messaggi in un
bullettin board service in rete.
rete (Multicast causalmente ordinato)
Next
21
Vector timestamps (esempio)
•
Si assume il valore di Vi[i] viene incrementato dal processo Pi solo
all’invio di un messaggio;
•
Quando un processo Pi invia un messaggio a, invia un multicast a
tutti con timestamp vt(a) uguale a Vi.
•
Se un Processo Pj reagisce al messaggio a invierà a tutti un
messaggio r con vt(r) uguale a Vj con vt(r)[j]>vt(a)[j].
•
Un processo Pk, all’atto della ricezione del messaggio r, consegnerà
il messaggio solo se:
•
1.
vt(r)[j]= Vk[j]+1
2.
vt(r)[i]Vk[i] per  ij
La prima condizione assicura che r è il prossimo messaggio che Pk
attende da Pj; la seconda assicura che Pk ha visto tutti i messaggi già
visti da Pj (in questo caso ad es. il messaggio a)
22
11
Ringraziamenti
Questi lucidi sono un adattamento e un aggiornamento del
materiale preparato dal prof.ssa Giuliana Franceschinis per
il corso di Sistemi Operativi II, A.A. 2002/2003
23
12