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 • xy non è vera • yx 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 ij 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