Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Programmazione Concorrente e Distribuita
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 Linguaggi e concorrenza
3
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 Linguaggi e concorrenza
4
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 Linguaggi e concorrenza
5
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 Linguaggi e concorrenza
6
Programmazione Concorrente e Distribuita
Algoritmi, Programmi, Processi Un esempio: Il M.C.D. tra due numeri naturali x e y Algoritmo: 1. controllare se i due numeri naturali x e y sono uguali tra loro, nel qual caso il loro M.C.D. coincide con il loro valore; 2. se sono diversi valutarne la differenza; 3. tornare al punto 1, prendendo in considerazione il più piccolo fra i due e la loro differenza. PCD Linguaggi e concorrenza
7
Algoritmi, Programmi, Processi
Un esempio: Il M.C.D. tra due numeri naturali x e y Programma: begin a:= x; b:= y; while a <> b do if a > b then a := a - b; else b := b - a; end. PCD Linguaggi e concorrenza
8
Algoritmi, Programmi, Processi
Un esempio: Il M.C.D. tra due numeri naturali x e y Processo: Per esprimere lo stato dell’elaboratore ci limitiamo ai valori delle variabili a, b, x e y (dati di ingresso). Siano x = 18 e y = 24: Stato iniziale Stato finale x y a b PCD Linguaggi e concorrenza
9
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 Linguaggi e concorrenza
10
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 Linguaggi e concorrenza
11
Programmazione Concorrente e Distribuita
PCD Linguaggi e concorrenza
12
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 Linguaggi e concorrenza
13
Programmazione Concorrente e Distribuita
Grafo di precedenza ad ordinamento parziale PCD Linguaggi e concorrenza
14
Programmazione Concorrente e Distribuita
PCD Linguaggi e concorrenza
15
Programmazione Concorrente e Distribuita
PCD Linguaggi e concorrenza
16
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 Linguaggi e concorrenza
17
Programmazione Concorrente e Distribuita
Hardware Sist. Operativi Sist. Real Time Sist. Di Rete Programmazione concorrente Software Di base Sist. Distribuiti Linguaggi di Programm. PCD Linguaggi e concorrenza
18
Programmazione Concorrente e Distribuita
Hardware per sistemi concorrenti uniprocessore CPU unica + processori dedicati Multiprocessori Memoria condivisa Nuove architetture dataflow e macch. funzionali Vector e Array processor LAN Local internet Sistemi LAN/WAN PCD Linguaggi e concorrenza
19
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 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 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 Linguaggi e concorrenza
21
Programmazione Concorrente e Distribuita
Un programma sequenziale: sequenza di dichiarazioni e istruzioni che verranno eseguite sequenzialmente Un programma concorrente: un insieme di programmi sequenziali che verranno eseguiti in parallelo PCD Linguaggi e concorrenza
22
Programmazione Concorrente e Distribuita
Un programma concorrente descrive l’ elaborazione come un insieme di moduli sequenziali asincroni interagenti. Un linguaggio concorrente dovra’ contenere: costrutti che permettano di dichiarare moduli di programma destinati ad essere eseguiti come processi sequenziali distinti strumenti linguistici per specificare le interazioni tra i moduli. PCD Linguaggi e concorrenza
23
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 Linguaggi e concorrenza
24
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 Linguaggi e concorrenza
25
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 Linguaggi e concorrenza
26
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 temp := n n:= temp +1 temp := n n:= temp +1 PCD Linguaggi e concorrenza
27
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 Linguaggi e concorrenza
28
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 flag := true PCD Linguaggi e concorrenza
29
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 Linguaggi e concorrenza
30
Programmazione Concorrente e Distribuita
Programma sorgente scritto nel linguaggio L Programma tradotto nel linguaggio oggetto per la macchina M Compilatore Compilazione di programmi concorrenti PCD Linguaggi e concorrenza
31
P C D 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 Linguaggi e concorrenza
32
P C D Architettura di una macchina concorrente
Macchina virtuale e macchina fisica PCD Linguaggi e concorrenza
33
P C D 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 Linguaggi e concorrenza
34
Programmazione Concorrente e Distribuita
Esecuzione di un programma come processo linguaggio sequenziale: un programma -> un processo linguaggio concorrente: un programma -> più processi PCD Linguaggi e concorrenza
35
Programmazione concorrente e distribuita Esprimere la concorrenza
PCD 2002/2003 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 Linguaggi e concorrenza
36
Programmazione concorrente e distribuita Esprimere la concorrenza
Costrutti linguistici per la concorrenza: Coroutines Processi Fork/ Join Cobegin/Coend Task PCD Linguaggi e concorrenza
37
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 Linguaggi e concorrenza
38
Programmazione Concorrente e Distribuita
PCD 2002/2003 Programmazione Concorrente e Distribuita Sistema runtime del linguaggio 1 programma 1 processo 1 programma 1 processo 1 programma più processi 1 programma più processi Sistema runtime del linguaggio Sistema runtime del linguaggio Sistema runtime del linguaggio Kernel del SO Kernel del SO Linguaggio di programmazione sequenziale Linguaggio di programmazione concorrente senza supporto del SO PCD Linguaggi e concorrenza
39
Programmazione Concorrente e Distribuita
più processi 1 programma più processi Sistema runtime del linguaggio Sistema runtime del linguaggio Kernel del SO Linguaggio di programmazione concorrente con supporto del SO PCD Linguaggi e concorrenza
40
Programmazione Concorrente e Distribuita
Stato di un processo nel SO (inseriti nel PCB, nel kernel) Program Counter Valore dei registri (contesto) Partizioni di memoria .. File aperti Stato di un processo nel linguaggio Valore delle variabili accessibili al processo in un dato istante: variabili del codice programma utente supporto runtime routine di libreria variabili dei dati statici dinamici (heap) variabili dello stack PCD Linguaggi e concorrenza
41
Programmazione Concorrente e Distribuita
1 processo Codice del programma utente 1 programma 1 processo Supporto runtime Sistema runtime del linguaggio Sistema runtime del linguaggio Gestione dello stack e dello heap Kernel del SO Linguaggio di programmazione sequenziale = Spazio indirizzi utente PCD Linguaggi e concorrenza
42
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 Linguaggi e concorrenza
43
Programmazione concorrente e distribuita Esprimere 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 Linguaggi e concorrenza
44
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 Linguaggi e concorrenza
45
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 Linguaggi e concorrenza
46
Programmazione Concorrente e Distribuita
1 processo 1 programma 1 processo Codice per una procedura Codice per una procedura Codice per gestire procedure separate Sistema runtime del linguaggio Sistema runtime del linguaggio Supporto runtime Gestione dello stack e dello heap Kernel del SO Linguaggio di programmazione sequenziale: attività diverse nel codice utente PCD Linguaggi e concorrenza
47
Programmazione Concorrente e Distribuita
1 processo 1 programma 1 processo Codice coroutine Codice coroutine Codice coroutine Codice creazione e gestione coroutine Sistema runtime del linguaggio Sistema runtime del linguaggio sistema runtime Kernel del SO Linguaggio di programmazione sequenziale: attività diverse nel codice utente PCD Linguaggi e concorrenza
48
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 Supporto per la creazione e il trasferimento di controllo: co-create kill call suspend resume Uno stack ed un blocco di controllo per ciascuna coroutine heap PCD Linguaggi e concorrenza
49
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 Linguaggi e concorrenza
50
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 Linguaggi e concorrenza
51
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 Linguaggi e concorrenza
52
Programmazione Concorrente e Distribuita
più processi 1 programma 1 processo ... Codice per un processo Codice per un processo Codice per gestire la creazione di processi e il passaggio di controllo Sistema runtime del linguaggio Sistema runtime del linguaggio Supporto runtime Gestione dei processi heap Supporto per la creazione e lo scheduling dei processi Kernel del SO Linguaggio di programmazione concorrente: processi gestiti dal linguaggio PCD Linguaggi e concorrenza
53
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: fork X B: <istruzione successiva alla fork> X: <prima istruzione procedura invocata fork> A B X PCD Linguaggi e concorrenza
54
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 Linguaggi e concorrenza
55
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 E2: E E3: join cont G end A C B F D E G PCD Linguaggi e concorrenza
56
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 P:= fork X join P X P:= fork X begin end join P PCD Linguaggi e concorrenza
57
Programmazione concorrente e distribuita Esprimere la concorrenza
var P1, P2:process procedure E1 begin C F end procedure E2 E A P1 :=fork E1 B P2:=fork E2 D join P1 join P2 G PCD Linguaggi e concorrenza
Presentazioni simili
© 2025 SlidePlayer.it Inc.
All rights reserved.