Programmazione Concorrente e
Distribuita
Linguaggi e concorrenza
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
2
Programmazione Concorrente e
Distribuita
La programmazione concorrente nasce per gestire i Sistemi
Concorrenti 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
3
Programmazione Concorrente e
Distribuita
Per sistema concorrente intendiamo:
 un sistema software
 implementato su vari tipi di hardware
 che porta avanti contemporaneamente una molteplicita’ di attivita’
diverse
 tra di loro correlate
possono cooperare ad un goal comune
possono competere per risorse condivise
PCD 2006-2007
Linguaggi e concorrenza
4
Programmazione Concorrente e
Distribuita
Algoritmi, Programmi, Processi
 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:
descrizione dell’algoritmo mediante un opportuno formalismo
(linguaggio di programmazione) che renda possibile l’esecuzione su un
particolare elaboratore;
 Processo:
sequenza di eventi cui dà luogo l’elaboratore quando opera sotto il
controllo di un particolare programma.
PCD 2006-2007
Linguaggi e concorrenza
5
Programmazione Concorrente e
Distribuita
Algoritmi, Programmi, Processi
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.
PCD 2006-2007
Linguaggi e concorrenza
9
Programmazione Concorrente e
Distribuita
Grafo 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).
PCD 2006-2007
Linguaggi e concorrenza
10
Programmazione Concorrente e
Distribuita
Grafo di precedenza ad ordinamento totale del
processo che valuta l'espressione:
(3 * 4) + (2 + 3) * (6 - 2)
INIZIO
3 * 4 = 12
2+3=5
6-2=4
5 * 4 = 20
12 + 20 = 32
FINE
PCD 2006-2007
Linguaggi e concorrenza
11
Programmazione Concorrente e
Distribuita
Processi 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.
PCD 2006-2007
Linguaggi e concorrenza
12
Programmazione Concorrente e
Distribuita
Grafo di precedenza ad ordinamento parziale
INIZIO
3*4 = 12
6–2=4
2+3=5
5 * 4 = 20
12+20 = 32
FINE
PCD 2006-2007
Linguaggi e concorrenza
13
Programmazione Concorrente e Distribuita
INIZIO
L1
E1
S1
Ln
En
Sn
FINE
PCD 2006-2007
Linguaggi e concorrenza
14
Programmazione Concorrente e
Distribuita
INIZIO
L1
E1
S1
L2
E2
S2
L3
E3
S3
Ln
En
Sn
FINE
PCD 2006-2007
Linguaggi e concorrenza
15
Programmazione Concorrente e
Distribuita
Abbiamo visto che:
alcuni problemi possono essere risolti mediante processi di calcolo non
sequenziali 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 parallelo, in grado cioe’ di eseguire un
numero arbitrario di operazioni contemporaneamente.

Occorre quindi un linguaggio 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 Concorrente.
PCD 2006-2007
Linguaggi e concorrenza
16
Programmazione Concorrente e
Distribuita
Hardware
Sist. Operativi
Sist. Real Time
Sist. Di Rete
Software
Di base
Programmazione
concorrente
Sist. Distribuiti
Linguaggi di
Programm.
PCD 2006-2007
Linguaggi e concorrenza
17
Programmazione Concorrente e
Distribuita
Hardware per sistemi concorrenti
uniprocessore
Nuove architetture
dataflow e
macch. funzionali
CPU unica
+ processori
dedicati
LAN
Local internet
Vector e
Array processor
PCD 2006-2007
Multiprocessori
Memoria condivisa
Linguaggi e concorrenza
Sistemi
LAN/WAN
18
Programmazione Concorrente e
Distribuita
Architetture per sistemi concorrenti
 SISD: Single instruction stream, single data stream
Modello uniprocessore convenzionale (macchina di von Neumann)
 SIMD: Single instruction stream, multiple data stream
Piu’ processori che eseguono la stessa istruzione su dati diversi
(array o vector instruction)
 MIMD: Multiple instruction stream, multiple data stream
Piu’ 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
19
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
 permettere ai processi di sincronizzarsi => deve fornire meccanismi
primitivi 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
20
Programmazione Concorrente e
Distribuita
Un po’ di terminologia:
 sistema parallelo: sistema in cui l’esecuzione dei programmi si
sovrappone nel tempo (parallelismo reale )
 sistema concorrente: sistema in cui l’esecuzione dei programmi può
(ma non necessariamente deve) sovrapporsi nel tempo
(parallelismo apparente)
La concorrenza è 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
23
Programmazione Concorrente e
Distribuita
Concorrenza come “interleaving” di istruzioni atomiche
Definizione:
Un programma concorrente consiste di un insieme finito di processi
sequenziali. I processi sono scritti usando un insieme finito di
istruzioni atomiche. L’esecuzione di un programma concorrente è
ottenuta interfogliando in maniera arbitraria le istruzioni dei
processi. Il risultato di questo interleaving viene detto
computazione.
PCD 2006-2007
Linguaggi e concorrenza
24
Programmazione Concorrente e
Distribuita
Istruzioni 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
25
Programmazione Concorrente e
Distribuita
Istruzioni atomiche
E’ importante specificare con precisione quali siano le istruzioni
atomiche.
Es. lo statement di assegnazione e’ atomico:
n := 0
n := n + 1
n := 0
n := n + 1
temp := n
n:= temp +1
PCD 2006-2007
Linguaggi e concorrenza
temp := n
n:= temp +1
26
Programmazione Concorrente e
Distribuita
Correttezza
Nei 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 “safety”:
La proprieta’ P deve sempre essere vera
(P e’ vera in ogni stato della computazione)
 Proprieta’ di “liveness”:
La proprieta’ P prima o poi sara’ vera
(in ogni computazione esiste uno stato in cui P e’ vera)
PCD 2006-2007
Linguaggi e concorrenza
27
Programmazione Concorrente e
Distribuita
Fairness
Ogni 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 “fairness”:
una computazione e’ fair se per ogni suo stato e’ vero che uno
statement sempre abilitato, prima o poi sara’ eseguito
n := 0
flag := false
while flag = false
n := n + 1
PCD 2006-2007
flag := true
Linguaggi e concorrenza
28
Programmazione Concorrente e
Distribuita
 Le interazioni tra i processi possono essere classificate:
 cooperazione: interazione prevedibile e desiderata
(sincronizzazione diretta o esplicita)
scambio di segnali temporali
scambio di informazione
 competizione: interazione prevedibile e non desiderata, ma
necessaria
(sincronizzazione indiretta o implicita)
mutua esclusione
PCD 2006-2007
Linguaggi e concorrenza
29
Programmazione Concorrente e
Distribuita
Programma sorgente
scritto nel
linguaggio
L
Compilatore
Programma tradotto
nel linguaggio
oggetto per
la macchina M
Compilazione di programmi concorrenti
PCD 2006-2007
Linguaggi e concorrenza
30
PCD
Architettura di una macchina concorrente
La macchina concorrente M in realta’ e’ una macchina virtuale o
astratta 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 time del compilatore del linguaggio concorrente.
Un nucleo fornisce sempre due meccanismi basilari:
 meccanismo di multiprogrammazione
 meccanismo di sincronizzazione/comunicazione
PCD 2006-2007
Linguaggi e concorrenza
31
PCD
Architettura di una macchina concorrente
Meccanismo di multiprogrammazione
Meccanismo di sincronizzazione
Macchina fisica M’
Macchina virtuale e macchina fisica
PCD 2006-2007
Linguaggi e concorrenza
32
PCD
Architettura di una macchina concorrente
Due diverse organizzazioni logiche:
 gli elaboratori sono collegati ad una unica
memoria comune (modello a memoria comune)
 gli elaboratori sono collegati da una sottorete di
comunicazione, ma non condividono memoria (modello
a rete)
PCD 2006-2007
Linguaggi e concorrenza
33
Programmazione concorrente e distribuita
Esprimere 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
35
Programmazione concorrente e distribuita
Esprimere la concorrenza
Costrutti linguistici per la concorrenza:
Coroutines
Processi
Fork/ Join
Cobegin/Coend
Task
PCD 2006-2007
Linguaggi e concorrenza
36
Programmazione concorrente e distribuita
Esprimere la concorrenza
Coroutines
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
37
Programmazione concorrente e distribuita
Esprimere 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
42
Programmazione concorrente e distribuita
Esprimere la concorrenza
Coroutine X
<dich. dati locali>
Coroutine Y
<dich. dati locali>
Coroutine Z
<dich. dati locali>
begin
….
….
resume Y
….
….
….
begin
….
resume Z
….
resume X
….
….
begin
….
….
resume Y
….
…..
….
end
end
end
PCD 2006-2007
Linguaggi e concorrenza
43
Programmazione concorrente e distribuita
Esprimere 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
44
Programmazione concorrente e distribuita
Esprimere 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
45
Programmazione Concorrente e
Distribuita
1 programma
1 programma
1 processo
1 processo
Codice per
una procedura
Codice per una
procedura
Codice per gestire procedure separate
Sistema runtime
Sistema runtime
del linguaggio
del linguaggio
Supporto runtime
Gestione dello stack e
dello heap
Kernel del SO
Linguaggio di programmazione
sequenziale: attività diverse nel
codice utente
PCD 2006-2007
Linguaggi e concorrenza
46
Programmazione Concorrente e
Distribuita
1 programma
1 programma
1 processo
1 processo
Codice
coroutine
Codice
coroutine
Codice
coroutine
Codice creazione e gestione coroutine
Sistema runtime
Sistema runtime
del linguaggio
del linguaggio
sistema runtime
Kernel del SO
Linguaggio di programmazione
sequenziale: attività diverse nel
codice utente
PCD 2006-2007
Linguaggi e concorrenza
47
Programmazione concorrente e distribuita
Esprimere 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 runtime
Gestione della memoria
heap
PCD 2006-2007
Uno stack
ed un
blocco di
controllo
per
ciascuna
coroutine
Supporto per la creazione e
il trasferimento di
controllo:
co-create
kill
call
suspend
resume
Linguaggi e concorrenza
48
Programmazione concorrente e distribuita
Esprimere la concorrenza
Consideriamo i seguenti problemi:
Un file server per una rete gira su una macchina dedicata. Riceve
richieste
dai
clienti
e
lavora
a
più
richieste
contemporaneamente.
Un SO controlla un certo numero di periferici e l’insieme delle
routine di gestione.
Il sistema computerizzato di un impianto chimico
periodicamente preleva ed esamina dati da sensori e gestisce le
situazioni critiche
Un sistema multiprocessre è utlizzato per ricerche parallele su
grandi quantità di dati.
PCD 2006-2007
Linguaggi e concorrenza
49
Programmazione concorrente e distribuita
Esprimere la concorrenza
Il file server.
Una possibile implementazione di questo problema con le coroutines si
può ottenere creando una coroutine per ogni cliente del file server. Il server,
in un loop, decide quale coroutine servire, il codice delle coroutine termina
con una suspend.
Questa soluzione va bene se il SO offre dell system call non bloccanti e se
non è necessaria una risposta immediata agli eventi.
Coroutine A
Main
suspend
Call A
Call B
Coroutine B
suspend
PCD 2006-2007
Linguaggi e concorrenza
50
Programmazione concorrente e distribuita
Esprimere la concorrenza
Controllo Periferici.
Una possibile implementazione di questo problema con le coroutines si
può ottenere creando una coroutine per ogni periferico. Il main è costituito da
un polling loop in cui le routine dei periferici sono chiamate l’una dopo
l’altra in un ordine prefissato.
Questa soluzione va bene se non ci sono tempi critici di risposta ai devices.
Altri Problemi
Il problema del controllo computerizzato di un impianto chimico non si
può realizzare per problemi di tempo reale, mentre quello dell’elaborazione
parallela per mancanza di parallelismo effettivo!
PCD 2006-2007
Linguaggi e concorrenza
51
Programmazione Concorrente e
Distribuita
1 programma
1 programma
1 processo
più processi
Codice per un
processo
...
Codice per un
processo
Codice per gestire la creazione di processi e
il passaggio di controllo
Sistema runtime
Sistema runtime
del linguaggio
del linguaggio
Supporto runtime
Kernel del SO
heap
Gestione dei processi
Supporto per la
creazione e lo
scheduling dei
processi
Linguaggio di programmazione
concorrente: processi gestiti dal
linguaggio
PCD 2006-2007
Linguaggi e concorrenza
52
Programmazione concorrente e distribuita
Esprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/Join
Espressione 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
A:
B:
fork X
<istruzione
successiva alla fork>
X:
<prima istruzione
procedura invocata fork>
PCD 2006-2007
B
Linguaggi e concorrenza
X
53
Programmazione concorrente e distribuita
Esprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/Join
per congiungere più flussi di controllo si usa l’istruzione join:
var cont: integer
:
join cont
l’istruzione join in forma indivisibile esegue queste azioni;
cont := cont -1
if cont = 0 then <terminazione del processo>
PCD 2006-2007
Linguaggi e concorrenza
54
Programmazione concorrente e distribuita
Esprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/Join
Esempio
begin
cont := 3
A
fork E1
B
fork E2
D
go to E3
E1: C
F
go to E3
E2: E
E3: join cont
G
end
PCD 2006-2007
A
C
B
F
D
E
G
Linguaggi e concorrenza
55
Programmazione concorrente e distribuita
Esprimere la concorrenza
Specifica, creazione e cancellazione di processi.
Fork/Join
Alternativa al join con contatore:
 la fork restituisce un valore
 tale valore è utilizzato per specificare lóperando della join
X
P:= fork X
P:= fork X
begin
join P
end
join P
PCD 2006-2007
Linguaggi e concorrenza
56
Programmazione concorrente e distribuita
Esprimere la concorrenza
var P1, P2:process
procedure E1
begin
C
F
end
procedure E2
begin
E
end
begin
A
P1 :=fork E1
B
P2:=fork E2
D
join P1
join P2
G
end
PCD 2006-2007
Linguaggi e concorrenza
57
Scarica

Programmazione Concorrente e Distribuita