Distribution Programación Concurrente y Distribuı́da Algoritmos para Distribución Camilo Rueda 1 slides basados en el texto “Introduction to Distributed Algorithms” de Gerard Tel 1 Universidad Javeriana-Cali 3 de mayo de 2010 Distribution basics Algoritmos de “olas” Computación: colección C de eventos Los eventos están ordenados por precedencia causal (≺) Hay un evento especial interno llamado decidir Un algoritmo de olas: Intercambia un número finito de mensajes y realiza después una decisión. La decisión depende causalmente de algún evento del proceso Distribution basics Algoritmos de “olas”: definición formal Es un algoritmo distribuido que satisface: 1 Terminación (cada computación es finita): ∀C. |C| < ∞ 2 Decisión (cada computación contiene al menos un evento “decidir”): ∀C. ∃e. e es evento decidir 3 Dependencia (evento “decidir” está precedido de otro): ∀C. ∀e ∈ C : (decidir (e) ⇒ ∀p ∈ P. ∃f ∈ Cp : f ≺ e) Cada computación se denomina ola Distribution basics Tipos de algoritmos de ola Centralizado: hay exactamente un proceso iniciador en cada computación Descentralizado: varios procesos pueden iniciar Topologı́a: algoritmos especı́ficos para cierta topologı́a Conocimiento inicial. Ejemplos: Identidad del proceso Identidad de los vecinos Número de decisiones Complejidad: número de mensajes intercambiados. Distribution basics Propiedades de algoritmos de ola Sea N el número de procesos y E el número de conexiones. PROP1: PROP2: PROP3: PROP4: para cada evento e ∈ C, existe un iniciador p y un evento f ∈ Cp tal que f e sea dp ∈ C un evento de decisión en el proceso p. ∀q 6= p : ∃f ∈ Cq : (f dp ∧ f es evento send) En un algoritmo con un iniciador p ∈ C tal que un evento de decisión dp ocurre en el proceso p, al menos N mensajes se intercambian En un algoritmo sin comocimiento de identidades, al menos E mensajes se intercambian Distribution basics Sincronización global En cada proceso q debe ejecutarse un evento aq , y en algunos procesos se ejecuta un evento bp , tal que toda ejecución de aq ocurre antes que cualquiera de los bp Distribution basics Algoritmo de ola de árbol var recp [q], para cada q ∈ vecinosp init false /* recp [q] = true si p ha recibido mensaje de q */ begin while #{q : recp [q] = false} > 1do begin receive htok i from q; recp [q] := true end /* ahora solamente hay un q0 con recp [q0 ] = false */ send htoki to q0 ; x : receive htokifrom q0 ; recp [q0 ] := true ; decide /* informar la decisión forall q ∈ Vecinosp , q 6= q0 do send htok i to q */ end Las hojas del árbol son iniciadores Distribution basics Algoritmo centralizado del eco (Chang) var recp : integer init 0 /* número de mensajes recibidos*/ padrep : P init undef Para el iniciador: begin forall q ∈ Vecinosp do send htoki to q ; while recp < #(Vecinosp ) do receive htoki ; recp := recp + 1 end ; decide end Para no-iniciadores: begin receive htok i from vecino q; padrep := q; recp := recp + 1; forall q ∈ Vecinosp , q 6= padrep do send htok i to q; while recp < #(Vecinosp ) do receive htoki ; recp := recp + 1 end ; send htok i to padrep end Distribution basics Elección de lı́der en árboles Cada proceso puede estar en los estados: dormido, lider , pierde Cada iniciador despierta a sus vecinos Una vez todo proceso está despierto, se ejecuta el algoritmo de ola para árbol Variables: wsp : controla que cada proceso p envı́e mensajes de despertar una sola vez wrp : número de mensajes despertar recibidos por p vp : identificador del proceso p Distribution basics Elegir lı́der en árbol: algoritmo (1) var wsp : boolean init false ; wrp : integer init 0; recp [q] : boolean init false , para cada q ∈ Vecinosp vp : P init undef statep : {dormido, lider , pierde} init dormido; begin if iniciador (p) then wsp := true ; forall q ∈ Vecinosp do send hdespiertei to q end ; while wrp < #(Vecinosp ) do receive hdespiertei ; wrp := wrp + 1; if not(wsp ) then wsp := true ; forall q ∈ Vecinosp do send hdespiertei to q end end ; /* empezar el algoritmo de ola */ ... Distribution basics Elegir lı́der en árbol: algoritmo (2) ... /* empezar el algoritmo de ola */ begin while #{q : recp [q] = false } > 1do begin receive htok, r i from q; recp [q] := true ; vp := min(vp , r ) end ; /* ahora solamente hay un q0 con recp [q0 ] = false */ send htok , vp i to q0 ; receive htok, r ifrom q0 ; vp := (min, vp , r ); /* decidir: respuesta=vp */ if vp = p then statep := lider else statep := pierde end ; /* informar la decisión forall q ∈ Vecinosp , q 6= q0 do send htok, vp i to q */ end Distribution basics Algoritmo centralizado de extinción Para redes de cualquier topologı́a Procede por “oleadas”, empezando por el iniciador Cada ola tiene un identificador El lı́der de la ola envı́a mensajes a todos los demás. Estos incluyen el ID de la ola Cada proceso se asocia a alguna ola Si el ID de la ola de un proceso es menor que el que recibe como mensaje, se ignora el mensaje Si es mayor, reinicializa variables y comienza ola con el valor recibido Si es igual, el mensaje se trata como en el algoritmo usual de ola Cuando la ola inicada por q llega a punto de decisión, es el lı́der. Distribution basics Algoritmo centralizado de extinción (1) var cawp : P init undef recp : integer init 0 /* número de htok, cawp i recibidos*/ padrep , winp : P init undef ; /* winp es la identidad del lı́der */ lrecp : integer init 0; /* num de hldr , r i recibidos*/ begin if iniciador (p) then cauwp := p; forall q ∈ Vecinosp do send htok , pi to q ; end ; while lrecp < #(Vecinosp ) do receive msg from q; if msg = hldr , r i then if lrecp = 0 then forall q ∈ Vecinosp do send hldr , r i to q ; end ; lrecp := lrecp + 1; winp := r else /* un mensaje htok, r i */ ...... Distribution basics Algoritmo centralizado de extinción (2) else /* un mensaje htok, r i */ begin if r < cawp ∨ cawp = undef then /* reiniciar */ cauwp := r ; recp := 0 : padrep := q ; forall s ∈ Vecinosp , s 6= q do send htok, r i to s end : if r = cawp then recp := recp + 1; if recp = #(Vecinosp ) then if cawp = p then forall s ∈ Vecinosp do send hldr , pi to s ; else send htok, cawp i to padrep end end end end end ; if winp = p then statep := lider else statep := pierde end end Distribution basics Trabajo de programación distribuida Implemente el algoritmo de Chang para n procesos Úselo para construir un árbol de los procesos Sobre ese árbol implemente el algoritmo de elección de leader