programmation concurrente - université de montréalmonnier/2035/notes-concur.pdfunlock m stefan...
TRANSCRIPT
![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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/1.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/2.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/3.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/4.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/5.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/6.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/7.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/8.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/9.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/10.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/11.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/12.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/13.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/14.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/15.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/16.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/17.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/18.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/19.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/20.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/21.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/22.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/23.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/24.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/25.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/26.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/27.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/28.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/29.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/30.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/31.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/32.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/33.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/34.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022051812/602d00b83279fc3a3337e9a2/html5/thumbnails/35.jpg)
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