Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi Sistemi distribuiti Lezione n°7 Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi AA 2010 - 2011 1
Algoritmo pari/dispari L’idea base è quella di far lavorare prima tutti i processori di indice pari e poi quelli di indice dispari per evitare letture e scritture concorrenti nei confronti. for s = 1 to n/2 do for i = 0 to i < n-1 step 2 pardo Pi: if x[i] > x[i+1] then swap(x[i], x[i+1]) for i = 1 to i < n-1 step 2 pardo Richiede tempo O(n) su una PRAM EREW con O(n) processori. Il costo complessivo è O(n2). 1 2 3 4 5 6 s=1 pari 8 9 s=1 dispari s=2 pari s=2 dispari s=3 pari s=3 dispari Fine AA 2010 - 2011 2
Algoritmo pari/dispari con p < n processori Ogni processore Pi gestisce un blocco Si composto di b = n/p elementi. for i = 0 to p-1 pardo Pi: ordina Si in modo sequenziale for s = 0 to p/2 do for i = 0 to i < p-1 step 2 pardo Pi: Si' = Merge(Si, Si+1) Si = Si' [0, b-1] Si+1 = Si' [b, 2b-1] for i = 1 to i < p-1 step 2 pardo I tempo richiesto è Tp = O(n/p log (n/p)) + p/2 O(n/p). Quando abbiamo p = O(log n) il tempo Tp diventa O(n): in tal caso il costo totale è O(n log n). AA 2010 - 2011 3
Ordinamento su PRAM CRCW Sfruttiamo la scrittura concorrente per ottenere un semplice algoritmo di ordinamento. Assumiamo una PRAM CRCW con scrittura concorrente della somma dei valori scritti. for i = 0 to n-1 pardo for j = 0 to n-1 pardo Pi,j: if (x[ i ] > x[ j ]) or (x[ i ] = x[ j ] and i > j) then c[ i ] = 1 Pi,1: x[ c[ i ] ] = x[ i ] Con n2 processori il tempo richiesto è O(1) Il costo totale è quindi O(n2) xiniz 7 1 5 2 3 8 4 C 3 1 2 4 xfin 3 1 5 2 7 4 8 Risultati dei confronti effettuati i j 1 2 3 4 F V AA 2010 - 2011 4
Sistema Distribuito Un Sistema Distribuito è un insieme interconnesso di computer, processi o processori, ciascuno definito in modo autonomo. Un sistema distribuito si può pensare semplicemente come un sistema fisico (computer connessi da una rete) o più in generale come un sistema logico: insieme di processi connessi da un meccanismo di scambio di messaggi. “... è un sistema in cui la caduta di un computer del quale ignoravi persino l’esistenza, può rendere il tuo computer inutilizzabile” Lensi Lamport “... è un modo di organizzare e considerare una famiglia di risorse indipendenti e possibilmente distanti (o debolmente connesse), come se facessero parte di un unico grande pacchetto” Andrew Tannenbaum AA 2010 - 2011 5
Differenza fra sistema distribuito e parallelo Sistema parallelo sistema multiutente che si riferisce ad ambienti di lavoro di tipo collaborativi è pensato per essere usato da un singolo utente o processo per garantire la massima velocizzazione di una singola applicazione computer, processi o processori non omogenei e asincroni processori omogenei sincroni computer, processi o processori fra loro autonomi processori usati insieme per un’unica computazione problemi di sicurezza connessi alla rete (perdita di messaggi, cadute di sitema, condivisione dei dati, etc…) in genere è considerato come un sistema fisicamente e logicamente inaccessibile AA 2010 - 2011 6
Trasmissione dell’informazione Nei sistemi distribuiti, la trasmissione dell’informazione assume un ruolo fondamentale. A seconda del sistema preso in considerazione, la rete di interconnessione può consistere in connessioni punto a punto (in tal caso ogni connessione gestisce il traffico esclusivamente fra due processori) o in canali di trasmissione (broadcast channels) che distribuiscono l’informazione a tutti i processori appartenenti ad un agglomerato (cluster) predefinito. I processori non condividono fisicamente alcuna memoria e quindi lo scambio di informazioni fra essi deve per forza passare lungo la specifica rete di interconnessione. AA 2010 - 2011 7
Task Definiamo task un frammento di codice sequenziale che deve essere eseguito da un singolo processore. Quando due task debbono comunicare fra loro durante l’esecuzione, ma i processori che li stanno eseguendo non sono connessi direttamente nella rete, non c’è modo di effettuare tale comunicazione in modo diretto. Ogni processore nel sistema deve pertanto, sia eseguire il task che gli è stato assegnato, sia ridistribuire l’informazione secondo le necessità del caso. Queste due operazioni, per quanto possibile, non devono interferire fra di loro. In tal modo ogni processore viene visto dal sistema come una coppia di entità logiche che lavorano in modo indipendente: l’entità di processo che esegue il proprio compito e l’entità di comunicazione che trasmette l’informazione nella rete. AA 2010 - 2011 8
Algoritmo Distribuito Un algoritmo distribuito D si può rappresentare come un grafo G = (P, C), dove l’insieme dei nodi è l’insieme dei processori e l’insieme degli spigoli orientati è un insieme di canali di comunicazione (generalmente unidirezionali). Tutti i processori, con l’eccezione di un sottoinsieme al quale è permesso di mandare messaggi “spontaneamente”, sono reattivi, ovvero eseguono un qualunque task come risposta al ricevimento di un messaggio da un altro task. Un solo blocco di processori Pinit può inizialmente eseguire un task a scopo di inizializzazione. AA 2010 - 2011 9
Schema base di un algoritmo distribuito begin Pinit: exec eventuali operazioni di inizializzazione; send messaggio ai vicini repeat Pi: receive messaggio M e BM è vero exec qualche operazione send messaggi ai vicini until un segnale di terminazione globale arriva a D end La operazione di send invia un messaggio su uno o più canali di comunicazione uscenti da Pi. Ogni processore ha una coda di messaggi ricevuti. La receive estrae un messaggio dalla coda di Pi. AA 2010 - 2011 10
Complessità distribuita complessità dei messaggi (Md): è il numero totale di messaggi spediti tra nodi vicini durante la computazione; complessità temporale (Td): tempo speso per la comunicazione durantela computazione del caso peggiore fino a quando l’output richiesto è stato raggiunto (o il sistema va in halt) AA 2010 - 2011 11
La rete ad anello Si suppone che i nodi dell’anello siano identificati da valori diversi scelti in un insieme di positivi qualunque, senza alcun vincolo di ordine. L’anello si considera unidirezionale. I singoli processi non conoscono la dimensione della rete; sono però in grado di distinguere fra vicino sinistro e vicino destro. AA 2010 - 2011 12
Broadcast in un sistema distribuito ad anello P0 ha l’informazione da distribuire nella variabile inf begin P0: send inf al successore repeat Pi: receive inf da predecessore send inf al successore until P0 riceve messaggio dal predecessore end In una rete ad anello ad n nodi, vengono inviati n messaggi in n passi P0 P2 Pn-1 P1 P3 AA 2010 - 2011 13
Broadcast in una qualsiasi rete a connessione fissa Assumiamo connessioni unidirezionali e rete aciclica begin Pinit: Ninit = { q : q è un vicino di Pinit } send messaggio ad ogni q in Ninit repeat Pi: receive messaggio da un vicino p Ni = { q : q è un vicino di Pi } send messaggio ad ogni q in Ni until … end Si ricorda che Pi invia lo stesso messaggio a tutti i suoi vicini contemporaneamente però sia i processori sia i canali di comunicazione sono eterogenei, quindi il tutto è asincrono. In una rete di n nodi, vengono inviati O(m) messaggi in O(d) passi m = numero archi d = diametro della rete Manca il segnale di terminazione globale Pinit AA 2010 - 2011 14
Broadcast con eco in una qualsiasi rete a connessione fissa Per risolvere il problema della terminazione si usa l’eco Servono connessioni bidirezionali begin Peco: Neco= { q : q è un vicino di Peco } send messaggio ad ogni q in Neco conteco = 0 while conteco < | Neco | receive messaggio da un vicino incrementa conteco termina Pi≠ eco: receive messaggio da un vicino p che chiamo padre Ni = { q p : q è un vicino di Pi } send messaggio ad ogni q in Ni conti = 0 while conti < | Ni | incrementa conti send messaggio al padre p end AA 2010 - 2011 15
Complessità del broadcast con eco Durante una esecuzione dell’algoritmo di Broadcast con eco vengono inviati in totale Md = 2m messaggi (2 per ogni arco) e l’algoritmo richiede Td = O(d) passi di comunicazione (dove d è il diametro della rete). AA 2010 - 2011 16
Esempio broadcast con eco 1 0/4 Processore non raggiunto dal Broadcast Processore raggiunto dal Broadcast (all’interno sono riportati i valori di conti e di |Ni|) Messaggio di Broadcast Processore che ha ricevuto conferma da tutti i vicini (incluso l’eco) Messaggio di eco Peco Ogni processore manda solo due messaggi: uno di broadcast ai suoi vicini dopo averlo ricevuto dal padre (prime istruzioni del processore Pi) e uno di eco dopo aver ricevuto messaggi da tutti i suoi vicini (al termine del ciclo while). La distinzione tra messaggi di broadcast e di eco è soltanto logica, di fatto i messaggi sono identici. Nell’esempio, al passo 2, abbiamo due tipi di processori che ricevono messaggi: quelli ancora in attesa del padre e quelli che già sono nel ciclo while. In particolare il processore Pc riceve un messaggio sia da Pa che da Pb. Supponiamo che Pa sia il padre, in quanto il messaggio da lui inviato è finito in testa alla coda. Pc invierà subito un messaggio a Pb, che incrementa il suo contatore, mentre invierà un messaggio a Pa soltanto dopo aver ricevuto Nc messaggi dai suoi vicini (incluso quello inviato da Pb). Il contatore di Pd ha già raggiunto il suo valore massimo e quindi Pd è pronto per mandare un eco al padre. Passo 1: Inizializzazione 0/2 0/4 1/2 2/2 1/4 Pa Pc Pd Pb Passo 2 AA 2010 - 2011 17
Esempio broadcast con eco 2 0/2 1/4 2/2 1/1 2/2 2/4 4/4 Passo 3 Passo 4 4/4 Passo 5 Passo 6 AA 2010 - 2011 18