Elezione di un leader in una rete ad anello

Transcript

Elezione di un leader in una rete ad anello
Elezione di un leader in una rete ad anello
Corso di Algoritmi Distribuiti
Prof. Roberto De Prisco
Lezione n° 3
a cura di Rosanna Cassino e Sergio Di Martino
Introduzione
In questa lezione viene presentato il primo problema da risolvere usando il modello delle reti
sincrone: il problema dell’elezione di un unico leader.
Descrizione del problema.
Assumiamo di avere una rete ad anello G costituita da n nodi, numerati da 1 a n in senso orario
(Figura 1). Nel caso generale gli indici dei processi associati ai nodi di G non sono noti.
n
n-1
1
2
n-2
3
4
5
Figura 1: Una rete ad anello.
Ad ogni processo è associata una variabile di stato che può assumere due valori: leader o non
leader. La richiesta del problema è che alla fine della computazione esattamente un processo deve
dire se è il leader o non lo è valorizzando la propria variabile di stato a leader.
Ci sono diverse versioni del problema:
1. La richiesta del problema è che alla fine della computazione ogni processo non leader deve
dire che non è il leader ponendo a non leader la propria variabile di stato.
2. La rete ad anello può essere unidirezionale o bidirezionale. Se è unidirezionale, i messaggi
possono essere inviati solo in senso orario.
3. Il numero di nodi n nella rete può essere noto o non noto ai processi. Se è noto, i processi
possono usare il valore n nei loro programmi. Se non è noto, i processi non possono usare
l’informazione sulla taglia della rete.
4. I processi possono essere identici o possono essere distinti attraverso un unico identificatore
(UID) ∈ Ν+. Si assume che l’UID di ogni processo è diverso da ogni altro nella rete, ma che
non c’è nessun vincolo sull’ordine di apparizione sulla rete (per esempio, gli interi non
1
devono essere necessariamente consecutivi). In tale situazione si possono verificare due
casi:
a. i processi non conoscono l’UID dei vicini;
b. i processi conoscono l’UID dei vicini.
TEOREMA 1. Sia A un sistema di n processi, n > 1, disposti in una rete
bidirezionale sincrona. Se tutti i processi in A sono identici, allora in A il
problema dell’elezione di un unico leader è irrisolvibile.
DIMOSTRAZIONE.
Supponiamo che esiste un sistema A che risolve il problema dell’elezione del leader. Con il
discorso che segue, vogliamo ottenere una contraddizione. Senza perdere di generalità
possiamo assumere che ogni processo di A ha esattamente una stato iniziale. Consideriamo
la seguente invariante (proprietà del sistema sempre vera).
INVARIANTE. All’inizio di ogni round tutti i processi si trovano nello stesso
stato.
Se dimostriamo l’invariante asseriamo che i processi sono tutti nello stesso stato, quindi nessuno di
essi è leader.
DIMOSTRAZIONE DELL’INVARIANTE.
Per induzione sul numero di round.
Base. Numero di round = 0. Banale dall’ipotesi del teorema: “se tutti i processi in A sono
identici”.
Passo induttivo. Supponiamo che l’invariante è vera all’inizio del round r. Proviamo che
risulta vera al round r+1. Per dimostrare ciò dobbiamo assumere che i processi conoscano il
proprio nome. Il seguente algoritmo ci aiuta a dimostrare il passo induttivo.
Algoritmo LCR.
L’algoritmo usa solo comunicazione unidirezionale e non dipende dalla conoscenza della taglia
della rete. Solo il leader rilascia l’output. L’algoritmo usa solo operazioni di confronto sugli UID.
Descrizione informale dell’algoritmo.
1
UID1
2
6
UID6
UID2
UID5
UID3
3
5
UID4
4
Ogni processo invia il proprio identificatore lungo la rete. Quando un processo riceve un
identificatore inviato, lo confronta con il proprio. Se l’identificatore inviato è più grande del
2
proprio, trasmette l’identificatore; se è più piccolo non fa niente; se è uguale, il processo si
dichiara leader. In questo modo sulla rete transita sempre l’identificatore più grande.
Descrizione formale dell’algoritmo.
Sia M = { UID } l’insieme degli id.
Per ogni i la variabile di stato statoi è costituita dalle seguenti componenti:
u : UID , inizialmente UID = i;
send : messaggio da spedire, un UID o null, inizialmente UID è i;
stato : con valori in { unknown, leader }, inizialmente unknown.
Per ogni i la funzione di generazione del messaggio msgsi è definita come:
spedisce il corrente valore di send al processo i +1
Per ogni i la funzione di transizione transi è definita dal seguente pseudocodice:
send := null
if il messaggio
case
v > u
v = u
v < u
che ricevo è v, un UID, then
: send := v
: status := leader
: niente
Eseguendo l’algoritmo, ad un certo punto il leader dirà che è leader e gli altri processi non
diranno nulla.
Prova di correttezza dell’algoritmo LCR
Per dimostrare la correttezza dell’algoritmo LCR, utilizziamo due lemmi. Il primo afferma che solo
il processo imax dichiarerà di essere leader dopo n round, mentre il secondo afferma che nessun
processo diverso da imax dichiarerà di essere leader. Questi due risultati dimostrano quindi la
correttezza dell’algoritmo LCR.
Lemma 1: Il processo imax dichiara di essere leader dopo n round.
La dimostrazione del lemma 1 richiede due inviarianti:
Invariante 1: Per 0 ≤ r ≤ n-1, dopo r rounds, si ha che sendi max +r = umax
Informalmente, questa invariante afferma che il valore massimo appare nella variabile send
nella posizione a distanza r da imax, cioè che al round 1, umax sarà a distanza 1 da imax, ed in
generale al round r-mo, tutti i processori tra imax ed imax+r manderanno il messaggio umax,
come in figura 2.
3
imax+r
imax+r+1
imax
Figura 2
Prova per induzione su r
Base:
Per r=0, l’inizializzazione ci assicura che sendi max = umax
Passo induttivo:
Assunto vero per r, dimostriamo che vale per r+1.
All’inizio del round r+1, l’algoritmo fa sì che il processo imax+r spedisca umax. Il processo
imax+r+1 riceverà quindi il messaggio umax, eseguendo quindi il primo case dell’algoritmo. Il
risultato di tale istruzione sarà sendi max +r = umax, provando quindi l’invariante 1
Invariante 2: Dopo n rounds, si ha che statusi max = leader
Dall’invariante 1, usata con r=n-1, si ha che sendi max -1 = umax.
Al round n, imax riceverà il messaggio umax (per definizione della funzione generatrice).
Essendo nel case 2 dell’algoritmo, quindi, status imax sarà posto a leader ed il nodo non
spedirà più alcun messaggio.
L’invariante 2 prova quindi il lemma 1.
Lemma 2: Un qualsiasi processo i≠ imax non dichiarerà mai di
essere leader.
Anche la dimostrazione del lemma 2 richiede l’utilizzo di un’inviariante:
Invariante 3: ∀round r e qualsiasi i,j si ha che dopo r rounds se i≠j e j ∈[imax, i), allora
sendj ≠ ui
DIMOSTRAZIONE:
Prova per induzione sul numero del round r
Base:
Per r=0, fissati i,j tali che i≠j (per hip), si ha che sendj = uj ≠ ui
Passo induttivo:
Assunto vero per r-1, dimostriamo che vale per r.
Dobbiamo considerare due casi:
• ∀ j’ ∈ [imax, j-1), per ipotesi induttiva risulta che sendj’ = uj.
4
•
Se invece j’ = imax-1, allora la dimostrazione si ottiene semplicemente applicando la
funzione generatrice.
imax≤j<i
i
UIDi
imax
UIDmax
Figura 3
Teorema 2: L’algoritmo LCR risolve il problema dell’elezione di un unico
leader in una rete ad anello sincrono.
DIMOSTRAZIONE:
La dimostrazione deriva dei lemma 1 e 2.
Complessità dell’algoritmo LCR.
Complessità di tempo:
Banalmente, l’algoritmo LCR richiede n round per essere eleggere il leader, risultando quindi
lineare sul numero di processi.
Complessità di messaggi
Informalmente, ogni messaggio è inviato sulla rete al più di n volte. Avendo n messaggi, la
complessità risultante sarà O(n2).
Formalmente, analizziamo il caso pessimo che si ottiene quando gli UID sono ordinati in ordine
decrescente. In questo caso, il messaggio del leader deve attraversare tutti i nodi, quello con UID
immediatamente inferiore al leader, tutti i nodi meno 1, e così via.
La complessità risultante sarà quindi data dalla sommatoria:
n
Σ
i =
O (n2)
i =1
5