Concetti di base della Programmazione Concorrente.

30
Concetti di base della Programmazione Concorrente

Transcript of Concetti di base della Programmazione Concorrente.

Page 1: Concetti di base della Programmazione Concorrente.

Concetti di base della

Programmazione Concorrente

Page 2: Concetti di base della Programmazione Concorrente.

Programmazione Sequenziale

La programmazione è di solito insegnata con riferimento ad un esecutore sequenziale

Un esecutore sequenziale svolge una sola azione alla volta sulla base di un programma sequenziale

L’esecuzione di un programma sequenziale origina un processo sequenziale che conferisce un ordinamento totale alle azioni eseguite

La programmazione di un esecutore concorrente, ovvero in grado di eseguire più istruzioni contemporaneamente, sebbene più difficile di quella tradizionale, ha forti motivazioni didattiche e pratiche

Page 3: Concetti di base della Programmazione Concorrente.

Programmazione Concorrente: Motivazioni

Migliorare la comprensione di un SO che regola diverse attività parallele

Sfruttare le prestazioni ottenibili da architetture multi-processor un programma sequenziale non giova di una architettura

parallela Migliorare la reattività delle applicazioni all’input

dell’utente durante lunghe operazioni di I/O o di elaborazione

La maggiore naturalezza con la quale si possono scrivere alcune tipologie di applicazioni (server, robotica, giochi, simulazioni di attività concorrenti)

Page 4: Concetti di base della Programmazione Concorrente.

Utilizzo dei Processori: Applicazione mono-thread

Page 5: Concetti di base della Programmazione Concorrente.

Utilizzo dei Processori: Applicazione multi-thread

Page 6: Concetti di base della Programmazione Concorrente.

Legge di Amdahl

Nel riquadro viene indicata la frazione sequenziale del calcolo

Page 7: Concetti di base della Programmazione Concorrente.

Istruzione ed Area Memoria

Per ragionare a vari livelli di granularità, consideriamo astrattamente i due concetti di istruzione ed area di memoria Istruzione; alcune possibili esemplificazioni:

istruzione macchina istruzione firmware uno statement java un metodo di una classe java un intero programma una stored-procedure di un DBMS la scrittura di un blocco del gestore della concorrenza di un DBMS

Area di Memoria; alcune possibili esemplificazioni: un bit, un byte, una parola macchina un campo di una struttura dati, una struttura dati intera un attributo, una tupla, una tabella, un intero db un blocco di un dispositivo di memoria secondaria

Page 8: Concetti di base della Programmazione Concorrente.

Processi Paralleli o Concorrenti

Un processo sequenziale definisce un ordinamento totale sulle istruzioni

Un processo parallelo definisce un ordinamento parziale sulle istruzioni su alcune istruzioni l’esecutore è libero di scegliere quali

iniziare prima e/o di eseguirle contemporaneamente

Esempio: consideriamo un banale programma per calcolare e stampare le prime quattro potenze di un valore X. Si supponga di disporre di tre sole tipologie di istruzione:

leggi <variabile> scrivi <variabile> <variabile> ← <variabile> * <variabile>

Page 9: Concetti di base della Programmazione Concorrente.

Diagramma delle Precedenze

begin 1. leggi X; 2. scrivi X; 3. X2 ← X * X; 4. scrivi X2; 5. X3 ← X2 * X; 6. scrivi X3; 7. X4 ← X2 * X2; 8. scrivi X4;end

Algoritmo sequenziale

Page 10: Concetti di base della Programmazione Concorrente.

Diagramma delle Precedenze

begin 1. leggi X; 2. scrivi X; 3. X2 ← X * X; 4. scrivi X2; 5. X3 ← X2 * X; 6. scrivi X3; 7. X4 ← X2 * X2; 8. scrivi X4;end

Algoritmo sequenziale

leggi X

scrivi X

scrivi X2 X3 ←X2*X

scrivi X3

scrivi X4

X2 ←X*X

X4←X2*X2

Algoritmo parallelo

Page 11: Concetti di base della Programmazione Concorrente.

Esercizi

Costruire un diagramma delle precedenze che esprima il massimo grado di parallelismo nel calcolo delle seguenti espressioni sullo stile dell’esempio appena visto:

(A+B)*(C+D)

Page 12: Concetti di base della Programmazione Concorrente.

Esecuzioni Sequenziale e Parallele

Sia i una generica istruzione, in generale può essere divisibile in istruzioni più elementari

Siano Ii e Fi gli eventi di inizio e fine esecuzione

Date due istruzioni a e b consideriamo i 6 possibili ordinamenti in cui occorrono i quattro eventi Ia, Fa, Ib, Fb

Ia Ib Fa Fb

Ia Fa Ib Fb Ia Ib Fb Fa

Ib Fb Ia Fa Ib Ia Fa Fb

Ib Ia Fb Fa

esecuzioni sequenziali esecuzioni parallele

Page 13: Concetti di base della Programmazione Concorrente.

Sequenze di Esecuzione Ammissibili

Una sequenza di esecuzione ammissibile è una sequenza di questi eventi che rispetta i vincoli espressi dal diagramma delle precedenze

Ad un certo diagramma delle precedenze corrispondono molteplici sequenze di esecuzione ammissibili

Ad es., con riferimento al precedente diagramma:

Ii1Fi

1Ii

2Ii

3Fi

2Fi

3Ii

4Ii

7Ii

5Fi

5Fi

7Fi

4Ii

6Fi

6Ii

8Fi

8

Page 14: Concetti di base della Programmazione Concorrente.

Sequenze di Interleaving

Un caso speciale ma rilevante di sequenza di esecuzione ammissibile; consideriamo: un solo esecutore fisico istruzioni indivisibili due processi sequenziali A e B con istruzioni

a1a2a3a4…

b1b2b3b4…

Diciamo sequenza di interleaving la sequenza scelta dall’esecutore, ad esempio: a1b1b2a2b3a3a4b4…

Analogamente per tre o più processi

Page 15: Concetti di base della Programmazione Concorrente.

Processori Virtuali

Nei sistemi operativi moderni, molteplici esecutori virtuali possono essere implementati con uno o più processori fisici attraverso tecniche di context-switching

In base al numero di processori fisici disponibili ed al numero di processi esistenti, risultano possibili varie situazioni per far avanzare concorrentemente i processi interleaving overlapping una combinazione di queste due

Page 16: Concetti di base della Programmazione Concorrente.

Overlapping ed Interleaving

L’esecutore può eseguire più istruzioni concorrentemente mediante

overlapping

interleaving

combinazione

CPUCPU00

CPUCPU11

CPUCPU00

CPUCPU00

CPUCPU00

CPUCPU00

CPUCPU00

CPUCPU11

CPUCPU11

CPUCPU00

t

t

t

t

t

t

Pa

Pb

Pa

Pb

Pa

Pb

Page 17: Concetti di base della Programmazione Concorrente.

Quando Eseguire Concorrentemente?

Dato un programma sequenziale, non è difficile costruire un equivalente diagramma delle precedenze

Tuttavia è opportuno stabilire un criterio generale per capire se due istruzioni possono essere eseguite concorrentemente o meno: per ottenere diagrammi delle precedenze che

esprimono il massimo grado di parallelismo possibile per automatizzare il calcolo dei vincoli che esprimono

Quando è lecito eseguire

concorrentemente due istruzioni ia e ib ?

Page 18: Concetti di base della Programmazione Concorrente.

Dominio e Rango

Indichiamo con A, B, … X, Y, … un’area di memoria Una istruzione i

dipende da una o più aree di memoria che denotiamo domain(i), ovvero dominio di i

altera il contenuto di una o più aree di memoria che denotiamo range(i) di i, ovvero rango di i

Ad es. per la procedura Pprocedure Pbegin X ← A + X; Y ← A * B;end

domain(P) = {A, B, X}

range(P) = {X, Y}

Page 19: Concetti di base della Programmazione Concorrente.

Condizioni di Bernstein

Quando è lecito eseguire

concorrentemente due istruzioni ia e ib ?

se valgono le seguenti condizioni, dette Condizioni di Bernstein:

1. range(ia) ∩ range(ib) = Ø

2. range(ia) ∩ domain(ib) = Ø

3. domain(ia) ∩ range(ib) = Ø

Page 20: Concetti di base della Programmazione Concorrente.

Condizioni di Bernstein (2)

Si osservi che non si impone alcuna condizione su

domain(ia) ∩ domain(ib)

Sono banalmente estendibili al caso di tre o più istruzioni

Esempi di violazione per le due istruzioni: X ← Y + 1; X ← Y – 1; (violano la 1.) X ← Y + 1; Y ← X - 1 ; (violano la 2. e la 3.) scrivi X; X ← X + Y; (violano la 3.)

Page 21: Concetti di base della Programmazione Concorrente.

Effetti delle Violazioni

Quando un insieme di istruzioni soddisfa le condizioni di Bernstein, il loro esito complessivo sarà sempre lo stesso indipendentemente dall’ordine e dalle velocità relative con cui vengono eseguite in altre parole, indipendentemente dalla particolare

sequenza di esecuzione seguita dai processori ovvero, sarà sempre equivalente ad una loro

esecuzione seriale

Al contrario, in caso di violazione, gli errori dipendono dall’ordine e dalle velocità relative generando il fenomeno dell’interferenza

Page 22: Concetti di base della Programmazione Concorrente.

Esempio di Interferenza (1)

procedure Prenotabegin Ra ← POSTI - 1; POSTI ← Ra ;end

La disponibilità di un volo di una compagnia aerea è memorizzata in POSTI=1. Due signori nel medesimo istante ma da due postazioni distinte, chiedono rispettivamente di prenotare l’ultimo posto e di disdire la prenotazione già effettuata

Le due richieste vengono tradotte in queste sequenze di istruzioni elementari indivisibili:

procedure Disdicibegin Rb ← POSTI + 1; POSTI ← Rb ;end

Page 23: Concetti di base della Programmazione Concorrente.

Esempio di Interferenza (2)

L’esecuzione concorrente da luogo ad una qualsiasi delle possibili sequenze di interleaving. Consideriamo un campione di tre sequenze:

Ra ← POSTI - 1;

Rb ← POSTI + 1;POSTI ← Rb ;POSTI ← Ra ;

(POSTI=0)

Ra ← POSTI - 1;POSTI ← Ra ;

Rb ← POSTI + 1;POSTI ← Rb ;

(POSTI=1)

Rb ← POSTI + 1;

Ra ← POSTI - 1;POSTI ← Ra ;POSTI ← Rb ;

(POSTI=2)

esecuzione sequenziale

Page 24: Concetti di base della Programmazione Concorrente.

Interferenza

Si ha interferenza in presenza di due o più flussi di esecuzione almeno un flusso di esecuzione eseguente scritture

Perché un flusso esegue un cambio di stato dell’area di

memoria in maniera non atomica gli stati transienti che intercorrono tra quello iniziale a

quello finale sono visibili a flussi di esecuzione diversi da quello che li sta producendo

Page 25: Concetti di base della Programmazione Concorrente.

Origine dei Fenomeni di Interferenza

stato consistente

iniziale

stato consistente

finale

flusso di esecuzione

flusso di esecuzione scrittore

stato transiente

stato transiente

stato transiente

Page 26: Concetti di base della Programmazione Concorrente.

Errori Dipendenti dal Tempo

L’interferenza causa errori particolarmente temibili perché dipendenti dalla sequenza di interleaving effettivamente eseguita

Questi errori sono particolarmente temibili perché ciascuna sequenza di esecuzione può produrre

effetti diversi la scelta della particolare sequenza adottata è (dal

punto di vista del programmatore) casuale

Page 27: Concetti di base della Programmazione Concorrente.

Caratteristiche degli Errori Dipendenti dal Tempo

irriproducibili: possono verificarsi con alcune sequenze e non con altre

indeterminati: esito ed effetti dipendono dalla sequenza

latenti: possono presentarsi solo con sequenze rare

difficili da verificare, e testare: perché le tecniche di verifica e testing si basano sulla

riproducibilità del comportamento

Page 28: Concetti di base della Programmazione Concorrente.

Il Programmatore e gli Errori Dipendenti dal Tempo

Il programmatore non può fare alcuna assunzione: sulla particolare sequenza di interleaving eseguita, ovvero sulle velocità relative dei vari processori virtuali su un qualsiasi altro tipo di sincronismo legato alla

specifica implementazione dei processori virtuali

Un programma che implicitamente od esplicitamente basa la propria correttezza su ipotesi circa la velocità relativa dei vari processori, è scorretto

Esiste una sola assunzione che possono fare i programmatori sulla velocità dei processori virtuali…

Page 29: Concetti di base della Programmazione Concorrente.

Assunzione di Progresso Finito

Tutti i processori virtuali hanno

una velocità finita non nulla

Questa assunzione è l’unica che si può fare sui processori virtuali e sulle loro velocità relative

Page 30: Concetti di base della Programmazione Concorrente.

Starvation & Deadlock

Esistono due diverse situazioni che possono invalidare l’assunzione di progresso finito starvation: quando un processo rimane in attesa di

un evento che pure si verifica infinite volte un sistema di processi che garantisce contro questa

evenienza si dice che gode della proprietà di fainess deadlock (o stallo): quando due o più processi

rimangono in attesa di eventi che non potranno mai verificarsi a causa di condizioni cicliche nel possesso e nella richiesta di risorse esempio classico: un processo Pa possiede una risorsa

R1 e richiede una risorsa R2 già posseduta da un altro processo Pb; quest’ultimo a sua volta richiede l’uso di R1