Upload
debora-giusti
View
228
Download
4
Tags:
Embed Size (px)
Citation preview
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
Linguaggi e concorrenza
PCD 2006-2007 Linguaggi e concorrenza 2
Programmazione Concorrente e Distribuita
Bibliografia: Ancillotti- Boari. Principi e Tecniche di Programmazione
Concorrente. Utet Libreria
Ben-Ari. Principles of concurrent and distributed programming. Addison wesley (second edition)
Raynal. Distributed Algorithms and Protocols. Wiley & Sons
Lynch. Distributed Algorithms. Morgan Kaufman
PCD 2006-2007 Linguaggi e concorrenza 3
Programmazione Concorrente e Distribuita
La programmazione concorrente nasce per gestire i Sistemi Sistemi
ConcorrentiConcorrenti cioe’ sistemi in grado di supportare piu’ utenti (o programmi) contemporaneamente
Sistemi intrensecamente concorrenti • Sistemi Real Time
• Sistemi operativi
• Gestione di basi di dati
Applicazioni potenzialmente concorrenti• Uso di algoritmi paralleli per computazioni:
– su grandi quantita’ di dati
– con grande mole di calcolo
– vincoli di tempo reale
PCD 2006-2007 Linguaggi e concorrenza 4
Programmazione Concorrente e Distribuita
Per sistema concorrentesistema concorrente intendiamo: un sistema softwaresoftware implementato su vari tipi di hardwarevari tipi di hardware che porta avanti porta avanti contemporaneamentecontemporaneamente una molteplicita’ di attivita’
diverse tra di loro correlatecorrelate
possono cooperarecooperare ad un goal comune possono competerecompetere per risorse condivise
PCD 2006-2007 Linguaggi e concorrenza 5
Algoritmi, Programmi, ProcessiAlgoritmi, Programmi, Processi Algoritmo:Algoritmo:
procedimento logico che deve essere seguito per risolvere un problema, solitamente specificato da una sequenza di passi che l’esecutore dell’algoritmo deve seguire;
Programma:Programma:
descrizione dell’algoritmo mediante un opportuno formalismo (linguaggio di programmazione) che renda possibile l’esecuzione su un particolare elaboratore;
Processo:Processo:
sequenza di eventi cui dà luogo l’elaboratore quando opera sotto il controllo di un particolare programma.
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 9
Algoritmi, Programmi, ProcessiAlgoritmi, Programmi, Processi
ATT!ATT! Il programma è una unità statica il processo è una unità dinamica
Se l’elaboratore e’ sequenziale => il processo è sequenziale: => la sequenza di eventi che costituisce il processo è
totalmente ordinata=> rappresentando il processo mediante il grafo orientato
dei suoi eventi (grafo di precedenza) il grafo risulterà totalmente ordinato.
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 10
Grafo di precedenza di un processoGrafo di precedenza di un processo
nodi del grafo rappresentano i singoli eventi
archi del grafo rapprresentano le precedenze temporali
se il processo è sequenziale, il grafo sarà a ordinamento totale: cioè ogni nodo avrà un predecessore (eccetto il nodo iniziale) ed un successore (eccetto il nodo finale).
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 11
G ra fo d i p receden za ad o rdin am ento tota le d elp ro cesso che va lu ta l'esp ress io n e:
(3 * 4) + (2 + 3) * (6 - 2)
F IN E
1 2 + 2 0 = 32
5 * 4 = 20
6 - 2 = 4
2 + 3 = 5
3 * 4 = 12
IN IZ IO
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 12
Processi ConcorrentiProcessi Concorrenti
L’ ordinamento totale del grafo è solo in parte dovuto alla natura del problema da risolvere, in parte è dovuto alla natura sequenziale del calcolatore.
La natura del problema cioè impone di fatto solo un ordinamento parziale tra gli eventi.
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 13
Grafo di precedenza ad ordinamento parziale
3*4 = 12 6 – 2 = 42 + 3 = 5
5 * 4 = 20
FINE
12+20 = 32
INIZIO
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 14
Programmazione Concorrente e Distribuita
INIZIO
L1
S1
Ln
Sn
FINE
E1
En
PCD 2006-2007 Linguaggi e concorrenza 15
Programmazione Concorrente e Distribuita
INIZIO
E1L1
S1
E2L2
S2
E3L3
S3
EnLn
Sn
FINE
PCD 2006-2007 Linguaggi e concorrenza 16
Abbiamo visto che:alcuni problemi possono essere risolti mediante processi di calcolo non sequenzialisequenziali cioè rappresentati da un grafo ad ordinamento parziale in questo caso il problema puo’ essere risolto da alcuni moduli sequenziali che lavorano in parallelo.
Occorre quindi un elaboratore paralleloelaboratore parallelo, in grado cioe’ di eseguire un numero arbitrario di operazioni contemporaneamente.
Occorre quindi un linguaggio di programmazionelinguaggio di programmazione con il quale poter descrivere questi algoritmi non sequenziali.
Lo studio di questi linguaggi, dei loro compilatori e delle loro applicazioni prende il nome di Programmazione ConcorrenteProgrammazione Concorrente.
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 17
Programmazione Concorrente e Distribuita
Programmazione concorrente
Programmazione concorrente
HardwareHardware
Software Di base
Software Di base
Linguaggi diProgramm.
Sist. OperativiSist. Operativi
Sist. Di ReteSist. Di Rete
Sist. Real TimeSist. Real Time
Sist. DistribuitiSist. Distribuiti
PCD 2006-2007 Linguaggi e concorrenza 18
Programmazione Concorrente e Distribuita
Hardware per sistemi concorrentiHardware per sistemi concorrenti
uniprocessoreuniprocessore
CPU unica+ processori
dedicati
CPU unica+ processori
dedicati
MultiprocessoriMemoria condivisa
MultiprocessoriMemoria condivisa
Nuove architetturedataflow e
macch. funzionali
Nuove architetturedataflow e
macch. funzionali
Vector eArray processor
Vector eArray processor
LANLAN
Local internetLocal internet
SistemiLAN/WANSistemi
LAN/WAN
PCD 2006-2007 Linguaggi e concorrenza 19
Programmazione Concorrente e Distribuita
Architetture per sistemi concorrentiArchitetture per sistemi concorrenti
SISD: SISD: Single instruction stream, single data streamSingle instruction stream, single data streamModello uniprocessore convenzionale (macchina di von Neumann)
SIMD: SIMD: Single instruction stream, multiple data streamSingle instruction stream, multiple data streamPiu’ processori che eseguono la stessa istruzione su dati diversi(array o vector instruction)
MIMD: MIMD: Multiple instruction stream, multiple data streamMultiple instruction stream, multiple data streamPiu’ processori che eseguono istruzioni diverse; possiamo ulteriormente
distinguere tra: Sistemi multiprocessori con memoria comune Sistemi a rete (senza memoria comune)
PCD 2006-2007 Linguaggi e concorrenza 20
Programmazione Concorrente e Distribuita
La macchina su cui un programma concorrente deve andare in esecuzione deve quindi essere in grado di :
eseguire un certo numero n di processi sequenziali (n > 1) => la sua architettura deve essere quella di un multielaboratore multielaboratore
permettere ai processi di sincronizzarsi => deve fornire meccanismi meccanismi primitivi di sincronizzazione e/o di comunicazioneprimitivi di sincronizzazione e/o di comunicazione, sfruttati dal compilatore per tradurre i costrutti linguistici di sincronizzazione fornite dal linguaggio ad alto livello.
PCD 2006-2007 Linguaggi e concorrenza 23
Programmazione Concorrente e Distribuita
Un po’ dipo’ di terminologia: terminologia:
sistema parallelo: sistema parallelo: sistema in cui l’esecuzione dei programmi si sovrappone nel tempo (parallelismo reale )
sistema concorrente: sistema concorrente: sistema in cui l’esecuzione dei programmi può (ma non necessariamente deve) sovrapporsi nel tempo (parallelismo apparente)
La concorrenzaconcorrenza è una forma di astrazione del parallelismo e permette di trattare in maniera uniforme varie situazioni: Multitasking di sistemi mono –processori Sistemi fortemente connessi (multiprocessori) Sistemi di rete
PCD 2006-2007 Linguaggi e concorrenza 24
Programmazione Concorrente e Distribuita
Concorrenza come “Concorrenza come “interleavinginterleaving” di istruzioni ” di istruzioni atomicheatomiche
Definizione::
Un programma concorrenteprogramma concorrente consiste di un insieme finito di processi sequenziali. I processi sono scritti usando un insieme finito di istruzioni atomicheistruzioni atomiche. L’esecuzione di un programma concorrente è ottenuta interfogliando in maniera arbitraria le istruzioni dei processi. Il risultato di questo interleaving viene detto computazionecomputazione.
PCD 2006-2007 Linguaggi e concorrenza 25
Programmazione Concorrente e Distribuita
Istruzioni atomicheIstruzioni atomiche
Un’ istruzione atomica viene eseguita completamente senza possibilita’ di interruzioni.
Proprieta’ delle istruzioni atomiche:
Il risultato ottenuta dall’esecuzione “simultanea” di due istruzioni atomiche e’ lo stesso che si otterrebbe dalla loro esecuzione sequenziale (in un qualsiasi ordine).
PCD 2006-2007 Linguaggi e concorrenza 26
Programmazione Concorrente e Distribuita
Istruzioni atomicheIstruzioni atomiche
E’ importante specificare con precisione quali siano le istruzioni atomiche.
Es. lo statement di assegnazione e’ atomico:
n := 0
n := n + 1n := n + 1
n := 0
temp := nn:= temp +1
temp := nn:= temp +1
PCD 2006-2007 Linguaggi e concorrenza 27
Programmazione Concorrente e Distribuita
CorrettezzaCorrettezzaNei programmi concorrenti alcune computazioni possono essere corrette altre no, ma le normali tecniche di debugging non funzionano poiche’ diverse esecuzioni dello stesso programma possono dare risultati diversi!!.
Ci sono due tipi di proprieta’ di correttezza:
Proprieta’ di “safetysafety”: La proprieta’ P deve sempresempre essere vera(P e’ vera in ogni stato della computazione)
Proprieta’ di “livenessliveness”: La proprieta’ P prima o poiprima o poi sara’ vera(in ogni computazione esiste uno stato in cui P e’ vera)
PCD 2006-2007 Linguaggi e concorrenza 28
Programmazione Concorrente e Distribuita
FairnessFairnessOgni possibile interleaving di iststruzioni e’ considerato essere una computazione di un programma concorrente, pero’ questo comporta che in alcune computazioni ci siano statement che non sono mai eseguiti. La proprieta’ di “fairness” esclude queste computazioni.Proprieta’ di “fairnessfairness”:
una computazione e’ fairfair se per ogni suo stato e’ vero che uno statement statement sempre abilitatosempre abilitato, prima o poiprima o poi sara’ eseguito
n := 0flag := false
while flag = falsen := n + 1
flag := true
PCD 2006-2007 Linguaggi e concorrenza 29
Le interazioni tra i processi possono essere classificate: cooperazionecooperazione: interazione prevedibile e desiderata
(sincronizzazione diretta o esplicita) scambio di segnali temporali scambio di informazione
competizionecompetizione: interazione prevedibile e non desiderata, ma necessaria
(sincronizzazione indiretta o implicita) mutua esclusione
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 30
Compilazione di programmi concorrenti
Programma sorgentescritto nel linguaggio
L
Compilatore
Programma tradottonel linguaggio
oggetto perla macchina M
Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita
PCD 2006-2007 Linguaggi e concorrenza 31
La macchina concorrente M in realta’ e’ una macchina virtuale o macchina virtuale o astrattaastratta aventi la caratteristiche funzionali desiderate, ma realizzata con tecniche software, basandosi su una macchina fisica M’ molto piu’ semplice.
In particolare M’: puo’ avere un numero molto inferiore di processori (anche uno solo) puo’ essere priva di primitive di sincronizzazione/comunicazione:
queste saranno data da uno strato di software che funzionalmente rappresenta il nucleo (kernel) del SO e che viene chiamato supporto run timesupporto run time del compilatore del linguaggio concorrente.
Un nucleo fornisce sempre due meccanismi basilari: meccanismo di multiprogrammazionemultiprogrammazione meccanismo di sincronizzazione/comunicazionesincronizzazione/comunicazione
P C DArchitettura di una macchina concorrente
PCD 2006-2007 Linguaggi e concorrenza 32
Meccanismo di multiprogrammazioneMeccanismo di sincronizzazione
Macchina fisica M’
Macchina virtuale e macchina fisica
P C DArchitettura di una macchina concorrente
PCD 2006-2007 Linguaggi e concorrenza 33
Due diverse organizzazioni logiche:
gli elaboratori sono collegati ad una unica memoria comune (modello a memoria comunememoria comune)
gli elaboratori sono collegati da una sottorete di comunicazione, ma non condividono memoria (modello modello a retea rete)
P C DArchitettura di una macchina concorrente
PCD 2006-2007 Linguaggi e concorrenza 35
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
In un linguaggio per la concorrenza occorrono costrutti linguistici per:
dichiarare, creare, attivare, terminare processi sequenziali che lavorino in parallelo;
permettere l’interazione (comunicazione e sincronizzazione) tra processi concorrenti.
PCD 2006-2007 Linguaggi e concorrenza 36
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Costrutti linguistici per la concorrenza: Coroutines Processi
Fork/ JoinCobegin/Coend Task
PCD 2006-2007 Linguaggi e concorrenza 37
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
CoroutinesCoroutines costrutto presente nei linguaggi Simula (68),
BLISS, Modula, ec.. utile per simulare l’elaborazione non
sequenziale in ambiente monoprocessore meccanismo di passaggio di controllo simile al
go to realizza un trasferimento di controllo non
locale, cioè tra contesti diversi
PCD 2006-2007 Linguaggi e concorrenza 42
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
La coroutine è costituita da: un insieme di dati locali insieme di istruzioni (body)
Nel body ci può essere l’istruzione : resume X X è il nome della coroutine chiamata l’esecuzione della resume X trasferisce il controllo dalla
coroutine chiamante alla coroutine X, previo salvataggio di contesto;
X viene attivata a partire dall’inizio (se è la prima volta che viene chiamata) oppure a partire dall’istruzione successiva all’ultimo resume da lei eseguito
PCD 2006-2007 Linguaggi e concorrenza 43
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Coroutine X Coroutine Y Coroutine Z
<dich. dati locali> <dich. dati locali> <dich. dati locali>
begin begin begin…. …. ….…. resume Z ….resume Y …. resume Y…. resume X ….…. …. …..…. …. ….
end end end
PCD 2006-2007 Linguaggi e concorrenza 44
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Oltre all’istruzione resume, occorrono altre istruzioni per: creare: co-id:= co-create (name, start-
address, stack-size) cancellare: kill (co-id)
chiamare: call (co-id)
sospendere: suspend
una coroutine
PCD 2006-2007 Linguaggi e concorrenza 45
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Caratteristiche delle coroutines: in ogni istante una sola coroutine è attiva l’ordine di esecuzione è controllato dal
programmatore sono utili per specificare particolari strategie di
esecuzione in ambiente monoprocessore non sono adatte per programmare algoritmi
concorrenti per ambienti multiprocessore
PCD 2006-2007 Linguaggi e concorrenza 46
Programmazione Concorrente e Distribuita
1 programma
1 processo
Kernel del SO
Sistema runtime
del linguaggio
1 programma
1 processo
Linguaggio di programmazione sequenziale: attività diverse nel
codice utente
Supporto runtime
Gestione dello stack e dello heap
Sistema runtime
del linguaggio
Codice per una procedura
Codice per una procedura
Codice per gestire procedure separate
PCD 2006-2007 Linguaggi e concorrenza 47
Programmazione Concorrente e Distribuita
1 programma
1 processo
Kernel del SO
Sistema runtime
del linguaggio
1 programma
1 processo
Linguaggio di programmazione sequenziale: attività diverse nel
codice utente
sistema runtime
Sistema runtime
del linguaggio
Codice coroutine
Codice coroutine
Codice coroutine
Codice creazione e gestione coroutine
PCD 2006-2007 Linguaggi e concorrenza 48
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Codice di una coroutine
Codice di una coroutine
Codice di una coroutine
Codice per la creazione di coroutine e per il passaggio di controllo
Sistema runtimeGestione della memoria Supporto per la creazione e
il trasferimento di controllo:co-createkillcallsuspendresume
heap
Uno stack ed un blocco di controllo per ciascuna coroutine
PCD 2006-2007 Linguaggi e concorrenza 49
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Consideriamo i seguenti problemi:
Un file serverfile server per una rete gira su una macchina dedicata. Riceve richieste dai clienti e lavora a più richieste contemporaneamente.
Un SO controllacontrolla un certo numero di perifericiperiferici e l’insieme delle routine di gestione.
Il sistema computerizzato di un impianto chimico periodicamente preleva ed esamina dati da sensoripreleva ed esamina dati da sensori e gestisce le situazioni critiche
Un sistema multiprocessre è utlizzato per ricerche ricerche paralleleparallele su grandi quantità di dati.
PCD 2006-2007 Linguaggi e concorrenza 50
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Il Il file serverfile server..Una possibile implementazione di questo problema con le Una possibile implementazione di questo problema con le coroutines si può ottenere creando una coroutines si può ottenere creando una coroutine per ogni clientecoroutine per ogni cliente del file server. Il server, in un loop, decide quale coroutine servire, del file server. Il server, in un loop, decide quale coroutine servire, il codice delle coroutine termina con una il codice delle coroutine termina con una suspendsuspend..
Questa soluzione va bene se il SO offre dell Questa soluzione va bene se il SO offre dell system call non system call non bloccantibloccanti e se non è e se non è necessaria una risposta immediata agli necessaria una risposta immediata agli eventieventi..
Call A
Call B
suspend
suspend
Main
Coroutine A
Coroutine B
PCD 2006-2007 Linguaggi e concorrenza 51
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Controllo PerifericiControllo Periferici..Una possibile implementazione di questo problema con le Una possibile implementazione di questo problema con le coroutines si può ottenere creando una coroutines si può ottenere creando una coroutine per ogni coroutine per ogni perifericoperiferico. Il main è costituito da un polling loop in cui le routine dei . Il main è costituito da un polling loop in cui le routine dei periferici sono chiamate l’una dopo l’altra in un ordine prefissato. periferici sono chiamate l’una dopo l’altra in un ordine prefissato.
Questa soluzione va bene se non ci sono Questa soluzione va bene se non ci sono tempi critici di rispostatempi critici di risposta ai ai devices.devices.
Altri ProblemiAltri ProblemiIl problema del controllo computerizzato di un impianto chimico non si può realizzare per problemi di tempo realeproblemi di tempo reale, mentre quello dell’elaborazione parallela per mancanza di parallelismo effettivomancanza di parallelismo effettivo!
PCD 2006-2007 Linguaggi e concorrenza 52
Programmazione Concorrente e Distribuita
1 programma
1 processo
Kernel del SO
Sistema runtime
del linguaggio
1 programma
più processi
Linguaggio di programmazione concorrente: processi gestiti dal
linguaggio
Supporto runtime Gestione dei processiSistema runtime
del linguaggio
Codice per un processo
Codice per un processo
Codice per gestire la creazione di processi e il passaggio di controllo
...
heap
Supporto per la creazione e lo scheduling dei processi
PCD 2006-2007 Linguaggi e concorrenza 53
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/JoinFork/JoinEspressione linguistica proposta da Conway [63], Dennis[66]:
L’istruzione fork ha un comportamento analogo ad una chiamata di procedura (call), ma il programma chiamante prosegue assieme al programma chiamato:
A: fork XB: <istruzione
successiva alla fork>
X: <prima istruzioneprocedura invocata fork>
AA
BB XX
PCD 2006-2007 Linguaggi e concorrenza 54
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/JoinFork/Joinper congiungere più flussi di controllo si usa l’istruzione join::
var cont: integer
: join cont
l’istruzione join in forma indivisibileindivisibile esegue queste azioni;cont := cont -1if cont = 0 then <terminazione del processo>
PCD 2006-2007 Linguaggi e concorrenza 55
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Specifica, creazione e cancellazione di processi.Fork/JoinFork/Join
EsempioEsempio
begincont := 3Afork E1Bfork E2Dgo to E3
E1: CF go to E3
E2: EE3: join cont
Gend
AA
EE
CCBB
FF
GG
DD
PCD 2006-2007 Linguaggi e concorrenza 56
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/JoinFork/JoinAlternativa al join con contatore: la fork restituisce un valore tale valore è utilizzato per specificare lóperando della join
P:= fork X
join P
P:= fork X begin
end
X
join P
PCD 2006-2007 Linguaggi e concorrenza 57
Programmazione concorrente e distribuitaProgrammazione concorrente e distribuita
Esprimere la concorrenzaEsprimere la concorrenza
var P1, P2:process
procedure E1beginCFend
procedure E2beginEend
beginAP1 :=fork E1BP2:=fork E2Djoin P1join P2G
end