Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Slide: 1
Concurrence1
Mémoire partagée
Georges Gonthier INRIA -- Rocquencourt
Georges.Gonthier@inria.fr
Slide: 2
Pourquoi la concurrence?
Programmer des machines multi-processeur.
Piloter de périphériques lents.
Les humains sont concurrents.
Un serveur a plusieurs clients.
Réagir sur plusieurs échelles de temps.
Approche minimaliste : plusieurs programmes (ordinaires) opèrent
simultanément sur les mêmes données.
Slide: 3
Communication implicite
Soit x une variable globale; initialement, x=0.
Considérons S = [x := x+1; x := x+1 || x:= 2*x]
T = [x := x+1; x := x+1 || wait(x=1); x := 2*x]
Après S, on a x Î {2,3,4}. Après T, on a x Î {3,4}. T peut rester bloqué!
Conclusion : S et T interagissent via x (variable partagée).
Slide: 4
Atomicité
Soit x une variable globale; initialement, x=0
Considérons S = [x := x+1 || x := x+1]
Après S, on a x=2.
Cependant si [x := x+1] se compile en [A := x+1; x := A].
Alors S = [A := x+1; x := A] || [A := x+1; x := A]
et après S, on a x Î {1,2}.
Conclusion :
[x := x+1] n'est pas forcément atomique.
Le degré d'atomicité est important.
Slide: 5
Sections critiques -- exclusion mutuelle
Soit
P1 = [···; A; ···] et
P2 = [···; B; ···];
On dit que A et B sont des sections critiques si
elles ne doivent pas être exécutées simultanément. Implmentation?
Solution 1
Initialement, turn = 1.
P1 = [···; while turn = 2 do ; A; turn := 2; ···] P2 = [···; while turn = 1 do ; B; turn := 1; ···] P1 est avantagé (défaut d'équité).
Solution 2
Initialement, c1 = 1, c2 = 1.
P1 = [···; while c2 = 0 do ; c1 := 0; A; c1 := 1;
···] P2 = [···; while c1 = 0 do ; c2 := 0; B; c2 := 1;
···] Mauvais.
Solution 3
Initialement, c1 = 1, c2 = 1.
P1 = [···; c1 := 0; while c2 = 0 do ; A; c1 := 1; ···] P2 = [···; c2 := 0; while c1 = 0 do ; B; c2 := 1; ···] Blocage; ni P1 ni P2 ne peuvent s'exécuter.
Slide: 6
L'algorithme de Dekker
Solution 4
Initialement, c1 = 1, c2 = 1.
P1 = [
···
c1 := 0;
while c2 = 0 do
if turn = 2 then begin
c1 := 1;
while turn = 2 do ;
c1 := 0;
end ;
A;
turn := 2; c1 := 1;
···;
]
P2 = [
···
c2 := 0;
while c1 = 0 do
if turn = 1 then begin
c2 := 1;
while turn = 1 do ;
c2 := 0;
end ;
A;
turn := 1; c2 := 1;
···;
]
Slide: 7
L'algorithme de Peterson (IPL Juin 81)
Initialement, c1 = 0, c2 = 0.
P1 = [
···
c1 := 1;
turn := 1;
wait c2 = 0 or turn = 2;
A;
c1 := 0;
···;
]
P2 = [
···
c2 := 1;
turn := 2;
wait c1 = 0 or turn = 1;
B;
c1 := 0;
···;
]
Exercice: montrer la correction.
Slide: 8
Et dans la réalité...
En fait, dans une machine moderne, il n'y a plus qu'un
ordre partiel sur les lectures-écritures en mémoire.
Il est donc nécessaire de disposer de primitives de synchronisation
explicites. Au niveau assembleur on trouve :