35
Programmation concurrente Ex´ ecution “simultan ´ ee” de plusieurs parties d’un programme Ex´ ecution sur diff ´ erents thread, process, processeur, machine quasi-parall ´ elisme, pseudo-parall ´ elisme, Parall´ elisme r ´ eel Distinguer programmation concurrente, parall ` ele, et distribu ´ ee Stefan Monnier IFT-2245 1

Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Programmation concurrente

Execution “simultanee” de plusieurs parties d’un programme

Execution sur differents thread, process, processeur, machine

quasi-parallelisme, pseudo-parallelisme, Parallelisme reel

Distinguer programmation concurrente, parallele, et distribuee

Stefan Monnier IFT-2245 1

Page 2: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Objectifs et problemes

Objectifs:

• Parallelisme: Accelerer l’execution d’une application

• Concurrence: Gerer plus efficacement certaines ressources

• Distribution: Faire collaborer plusieurs machines instables

• Genie logiciel : Mieux organiser le code

Problemes:

• Partitionnement : Decomposer en processus

• Communication: Echanger les donnees a traiter

• Synchronisation: Ne pas se marcher dessus

Stefan Monnier IFT-2245 2

Page 3: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Support materiel d’execution concurrente

Un ensemble de processeurs lies par un systeme de communication

Processeurs: homogenes, mais pas forcement

Communication: cache partagee, memoire partagee, memoires

interconnectees par un reseau specialise (bus, hypercube, tore,

crossbar), reseau ethernet, ...

Stefan Monnier IFT-2245 3

Page 4: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Modeles de communication

Comment les processus communiquent et se synchronisent

Memoire partagee:

Un seul tas: acces mutuel aux donnees des autres

La communication est souvent implicite, liee a la synchronisation

Typiquement une machine SMP ou SMT

Passage de messages:

Chaque processus a son propre tas: les donnees sont exclusives

La synchronisation est souvent implicite, liee a la communication

Typiquement un super-ordinateur, ou un systeme distribue

Stefan Monnier IFT-2245 4

Page 5: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

L’illusion d’une memoire partagee

Le modele de communication ne reflete pas forcement la technique de

communication sous-jacente

• Gestion par le compilateur et le systeme d’execution (partitioning)

• Gestion par le systeme de pagination (distributed shared memory )

• Gestion par le systeme de memoire cache (directory )

Meme si il y a une memoire physique partagee, les caches la ... cachent

Bien sur, une memoire peut aussi s’utiliser pour envoyer des messages

Stefan Monnier IFT-2245 5

Page 6: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

The first problems

incr c = swapMVar c (1 + readMVar c)

go count 0 = return ()

go count n = do incr count

go count (n - 1)

main = do c <- newMVar 0

forkIO (go c 100000)

forkIO (go c 100000)

print (readMVar c)

Stefan Monnier IFT-2245 6

Page 7: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

The first problems (2e essai)

incr c = do cv <- readMVar c

swapMVar c (1 + cv)

go count 0 = return ()

go count n = do incr count

go count (n - 1)

main = do c <- newMVar 0

forkIO (go c 100000)

forkIO (go c 100000)

cv <- readMVar c

print cv

Stefan Monnier IFT-2245 7

Page 8: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Problemes

Le resultat n’est pas 200000:

• Entrelacement des differentes operations

• Il y a une condition de course

• incr est une section critique

• Il faut assurer l’exclusion mutuelle dans incr⇒ ¡Synchronisation!

Le resultat n’est toujours pas 200000:

• Attendre la fin des autres processus

• ¡¡Synchronisation!!

¿Combien d’entrelacements possibles?

Stefan Monnier IFT-2245 8

Page 9: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Synchronisation

Outils disponibles:

• Masquer les interruptions

• Mutex : lock M ... unlock M

• Semaphores

• Moniteur

• Dataflow : variables vides/pleines

Comment implanter un mutex?

Attente active ou passive

Stefan Monnier IFT-2245 9

Page 10: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Mutex

Les mutex veulent garantir l’exclusion mutuelle.

lock M =

while M unlock M =

wait M := false

M := true

lock s’appelle aussi acquire, et unlock s’appelle aussi release.

Stefan Monnier IFT-2245 10

Page 11: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Lock lock

lock M1 lock M2

lock M2 lock M1

x1 = x1 - 100 x2 = x2 + 100

x2 = x2 + 100 x1 = x1 - 100

unlock M2 unlock M1

unlock M1 unlock M2

Stefan Monnier IFT-2245 11

Page 12: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Lock lock

lock M1 lock M2

lock M2 lock M1

x1 = x1 - 100 x2 = x2 + 100

x2 = x2 + 100 x1 = x1 - 100

unlock M2 unlock M1

unlock M1 unlock M2

¡Deadlock!

Example classique: philosophes demunis

Stefan Monnier IFT-2245 11

Page 13: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Concurrent Haskell: dataflow

incr c = do cv <- takeMVar c

putMVar c (1 + cv)

...

main = do c <- newMVar 0

forkIO (go c 100000)

forkIO (go c 100000)

<magie>

cv <- takeMVar c

print cv

Stefan Monnier IFT-2245 12

Page 14: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Attendre un autre processus

Compte a numero dans une banque Suisse:

incr c n = do cv <- takeMVar c

putMVar c (n + cv)

depot c n | n > 0 = incr c n

retrait c n = do << waitfor c >= n >>

incr c (- n)

Comment attendre?

Stefan Monnier IFT-2245 13

Page 15: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Attente active

retrait c n = do cv <- readMVar c

if cv >= n

then incr c (- n)

else do yield

retrait c n

Problemes:

• Gaspillage de CPU

• Condition de course

Stefan Monnier IFT-2245 14

Page 16: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Attente active correcte

retrait c n = do cv <- takeMVar c

if cv >= n

then putMVar c (cv - n)

else do putMVar c cv

yield

retrait c n

C’est quand meme encore de l’attente active

Stefan Monnier IFT-2245 15

Page 17: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Attente active: avec mutex

depot c n | n > 0 = do lock M

c = c + n

unlock M

retrait c n = do lock M

if c >= n

then do c = c - n

unlock M

else do unlock M

retrait c n

Stefan Monnier IFT-2245 16

Page 18: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Attente avec moniteur

Variable de condition C

depot c n | n > 0 = do lock M

c = c + n

signal C

unlock M

retrait c n = do lock M

if c >= n

then do c = c - n

unlock M

else do release&wait M C

retrait c n

Stefan Monnier IFT-2245 17

Page 19: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Attente avec moniteur

Imbrication

depot c n | n > 0 = do lock M

c = c + n

signal C

unlock M

retrait c n = do lock M

while c < n

release&wait M C

c = c - n

unlock M

Stefan Monnier IFT-2245 18

Page 20: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Problemes pour le compilateur

Certaines optimisations invalidees par les courses

lock L1 lock L2

write B = 1 write A = 1

t1 = read A t2 = read B

write B = 2 write A = 2

unlock L1 unlock L2

Stefan Monnier IFT-2245 19

Page 21: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Problemes pour le compilateur

Certaines optimisations invalidees par les courses

lock L1 lock L2

write B = 1 write A = 1

t1 = read A t2 = read B

write B = 2 write A = 2

unlock L1 unlock L2

Si le compilateur elimine les deux write .. = 1

¡¡ on peut obtenir t1 = 0 et t2 = 0 !!

Stefan Monnier IFT-2245 19

Page 22: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Conditions pour etre “sans course”

Une course est un acces a une variable pendant qu’elle est modifiee

Pas de course pour les variables non partagees

Pas de course si chaque acces est protege par un mutex

Attention a utiliser le meme mutex

Chaque mutex protege un ensemble particulier de variables

Pas de course 6⇒ correct

Stefan Monnier IFT-2245 20

Page 23: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Composition difficile

On veut deplacer de l’argent entre 2 comptes

retrait c1 n

depot c2 n

Le moniteur protege retrait et depot

On aimerait maintenir l’etat intermediaire cache

Il faut exporter le lock M, etc...

Stefan Monnier IFT-2245 21

Page 24: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Difficultes liees aux mutex

Il est trop facile de les utiliser incorrectement:

• Oublis

• Usage du mauvais verrou

• acquire sans le release correspondant

• Appels repetes: acquire(x); ...; acquire (x);

• ...

Risque d’interblocage

Mauvaises performances si la granularite est trop grossiere

Mauvaises performances si la granularite est trop fine

Stefan Monnier IFT-2245 22

Page 25: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Atomicite

Les mutex sont un outil pour obtenir l’atomicite

Pas de course 6⇒ atomique

Monad STM en Haskell:

atomically :: STM a -> IO a

newTVar :: a -> STM (TVar a)

readTVar :: TVar a -> STM a

writeTVar :: TVar a -> a -> STM ()

Stefan Monnier IFT-2245 23

Page 26: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Le retour du compte suisse

depot c n | n > 0

= atomically (do cv <- readTvar c

writeTVar c (cv + n))

retrait c n

= atomically

(do cv <- readTVar c

if cv < n

then retry

else writeTVar c (cv - n))

L’operation retry :: STM α correspond a release&wait

Stefan Monnier IFT-2245 24

Page 27: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Composer les deux

depot c n | n > 0 = do cv <- readTvar c

writeTVar c (cv + n)

retrait c n = do cv <- readTVar c

if cv < n

then retry

else writeTVar c (cv - n)

on peut alors faire

atomically (do { retrait c1 n; depot c2 n })

Exporter le lock M sans risque de deadlock ni d’oubli de lock

Stefan Monnier IFT-2245 25

Page 28: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Comment ne pas attendre

Autre composition: orElse :: STM α→ STM α→ STM α

retrait’ :: TVar Int -> Int -> STM Bool

retrait’ c n = do {retrait c n; return True}

‘orElse‘ return False

Ou encore

retraitRiche :: [TVar Int] -> Int -> STM ()

retraitRiche [] _ = retry

retraitRiche (c:cs) n

= retrait c n

‘orElse‘ retraitRiche cs n

Stefan Monnier IFT-2245 26

Page 29: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Comment ca marche

retry attend un unlock parmis ceux utilises

Quels mutex utiliser:

• Un gros mutex

• Un mutex par variable

• Demande au programmeur

• Analyse par le compilateur pour inferer des mutex

• Synchronisation optimiste

Stefan Monnier IFT-2245 27

Page 30: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Synchronisation optimiste

Dans le cas ideal, les conflits sont rares

lock est une operation couteuse, et conservatrice

On peut a la place, detecter les conflits post-facto

Stefan Monnier IFT-2245 28

Page 31: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Synchronisation optimiste

Dans le cas ideal, les conflits sont rares

lock est une operation couteuse, et conservatrice

On peut a la place, detecter les conflits post-facto

• Chaque lecture et ecriture note l’etat de la variable

• On garde ausi un log des variables accedees

• A la fin d’une transaction, on verifie si l’etat a change

• Si oui rollback, sinon commit

Stefan Monnier IFT-2245 28

Page 32: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Implementation de STM

Chaque TVar contient un numero de version

Chaque lecture stocke la variable et sa valeur dans un log

Chaque ecriture stocke variable, et valeur dans un log

Ecritures ne changent pas immediatement les variables

Commit a la fin de atomically:

acquire (stm_lock);

if (!check_consistency (log))

{ release (stm_lock); free (log); goto start; }

perform_updates (log);

release (stm_lock);

Stefan Monnier IFT-2245 29

Page 33: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

STM: Programmation concurrente facile

Probleme Solution

Oublier lock..unlock Type STM a inutile sans atomically

Usage du mauvais mutex Pas besoin de specifier quel mutex

lock sans unlock atomically fait les deux d’un coup

lock repete/recursif Type de atomically pas “imbricable”

Interblocage Synchronisation optimiste

Distinguer vars partagees Type TVar a different

Rollback impossible Type STM a restreint aux cas possibles

Stefan Monnier IFT-2245 30

Page 34: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Erreurs impossibles

La synchronisation optimiste introduit de nouvelles erreurs

atomic { atomic {

scale = a+b; a -= n;

c = c / scale; b += n;

} }

Stefan Monnier IFT-2245 31

Page 35: Programmation concurrente - Université de Montréalmonnier/2035/notes-concur.pdfunlock M Stefan Monnier IFT-2245 18. Problemes pour le compilateur` ... depot c n | n > 0 = do cv

Erreurs impossibles

La synchronisation optimiste introduit de nouvelles erreurs

atomic { atomic {

scale = a+b; a -= n;

c = c / scale; b += n;

} }

¡ si n = a+ b, alors scale peut etre 0 !

Stefan Monnier IFT-2245 31