0% ont trouvé ce document utile (0 vote)
155 vues70 pages

3 Synchronisation

Transféré par

Wided Ben Abid
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
155 vues70 pages

3 Synchronisation

Transféré par

Wided Ben Abid
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Chapitre 3 - Synchronisation

Processus concurrents et parallélisme


Chapitre 3 - Synchronisation

Gabriel Girard

4 janvier 2017

1/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation

Chapitre 3 - Synchronisation
1 Présentation et définition
Synchronisation
Communication
2 Exclusion mutuelle
Introduction
Solutions avec attente active
3 Sémaphores
Introduction
Implantation
Utilisations
Évaluation
4 Exemples classiques
Tampon fini
Lecteurs/écrivains
Philosophes
5 Conclusion
2/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Présentation et définition
Synchronisation

Pourquoi la synchronisation ?

Deux processus peuvent s’exécuter en même temps s’ils sont


disjoints

Pas très commode ! ! ! ! ! ! !

Les processus partagent souvent des ressources

4/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Synchronisation

Principe de base de la synchronisation

Comportement anormal dû aux interférences incontrôlées

On élimine ce comportement si on empêche le chevauchement


des points non disjoints

Il suffit de contrôler l’ordonnancement des événements dans le


temps

On appelle cet ordonnancement la synchronisation

5/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Synchronisation

Définition et utilité

Définition
La synchronisation est donc un terme général pour toutes les
contraintes sur l’ordonnancement des opérations dans le temps

La synchronisation permet à des processus non disjoints de


s’exécuter concurremment et de produire de bons résultats

6/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Synchronisation

Types de synchronisation

1 Synchronisation conditionnelle

2 Exclusion mutuelle

7/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Communication

Qu’est-ce que la communication ?

La coopération inter-processus implique une certaine forme de


communication

La communication permet à l’exécution d’un processus


d’influencer l’exécution d’un autre processus

Elle se fait par des variables communes ou par messages

8/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Communication

Exemples de communication

Deux processus accédant une même variable x

Producteur/consommateur

9/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Communication

Producteur/consommateur

On utilise un ensemble de tampons

Remplis par le producteur

Vidés par le consommateur

Doivent se synchroniser pour ne pas consommer un élément


non produit ou produire dans un tampon contenant déjà un
message non-consommé

Ne doivent pas accéder simultanément à la structure de


donnée dans le but de la modifier

10/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Présentation et définition
Communication

type item = ...


var tampon : array[0..n-1] of item;
in, out : 0..n;
nextp, nextc : item;
in := 0; out := 0;
parbegin
producteur : consommateur :
begin begin
repeat repeat
... while(in=out) ;
produire un item nextc := tampon[out]
... out := out+1 mod n;
while((in+1 %n)=out); ...
tampon[in] := nextp; traiter un item
in := in + 1 mod n; ...
until false; until false;
end; end;

parend
11/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Présentation et définition
Communication

type item = ...


type tampon : record element : item ;
suiv : pointer to tampon ;
end ;
var premier, p, c : pointer to tampon ;
nextp, nextc : item ;
premier := nil ;
parbegin
| consommateur :
producteur : | begin
begin | repeat
repeat
... | while (prem=nil) ;
produire item nextp | c := prem; // 1
... | prem:=prem.suiv;//6
new(p);// 2 | nextc := c.elem;//7
p.elem := nextp;//3 | dispose(c);//8
p.suiv := prem;//4 | ...
prem := p;//5 | traiter item nextc
until false; | ...
end; | until false;
| end;
parend

12/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Introduction

Section critique et atomicité

Pour remédier aux problèmes, on doit regrouper et


synchroniser l’exécution des énoncés qui manipulent la liste

Ces énoncés doivent s’exécuter en exclusion mutuelle

Section critique (SC)


Séquence d’instructions qui doit s’exécuter en exclusion mutuelle

Aussi appelé atomicité

14/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Introduction

Problème !
Comment assurer l’exclusion mutuelle ?

15/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Introduction

On ajoute un protocole avant et après chaque section critique

Ces protocoles assureront l’exclusion mutuelle

16/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Introduction

process Pi(i=1..n)
loop
... section non-critique ...

protocole d’entrée
section critique (SC)
protocole de sortie

endloop

17/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Introduction

Contraintes

Contraintes à respecter pour que les solutions soient acceptables :


1 aucune supposition sur le matériel (sauf atomicité des
instructions)
2 aucune supposition sur les vitesses relatives des processus
3 un processus qui n’est pas en SC ne doit pas pouvoir
empêcher les autres processus d’entrer dans leur SC
4 on ne doit pas remettre indéfiniment la décision qui consiste à
admettre un processus, parmi plusieurs, en SC

18/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Attente active

Un processus boucle sur une condition fausse jusqu’à ce


qu’elle soit vraie

Le processus teste de façon répétitive la condition (attente


active)

19/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Problème simplifié

Le problème général est complexe


Simplification : solution avec deux processus
process Pi(i=1..2)
loop
section non critique
protocole d’entrée
section critique
protocole de sortie
endloop

20/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 1

var libre: boolean;


begin
libre := vrai;
parbegin
P1: repeat
repeat until libre;
libre := faux;
section critique
libre := vrai;
section non-critique
forever;
P2: repeat
repeat until libre;
libre := faux;
section critique
libre := vrai;
section non-critique
forever;
parend
end.
21/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 2

var tour: integer;


begin
tour := 1; (ou 2)
parbegin
P1 : repeat
while tour = 2 do /* rien */ ;
section critique
tour := 2;
section non-critique
forever};
P2 : repeat
while tour = 1 do /* rien */;
section critique
tour := 1;
section non-critique
forever;
parend
end.
22/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 3

var c1, c2: boolean;


begin
c1 := c2 := faux;
parbegin
P1 : repeat
while c2 do /*rien*/;
c1 := vrai;
section critique
c1 := false;
section non-critique
forever;
P2 : repeat
while c1 do /*rien*/;
c2 := vrai;
section critique
c2 := faux;
section non-critique
forever;
parend
end.
23/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 4

var c1, c2: boolean;


begin
c1 := c2 := faux;
parbegin
P1 : repeat
c1 := vrai;
while c2 do /*rien*/;
section critique
c1 := false;
section non-critique
forever;
P2 : repeat
c2 := vrai;
while c1 do /*rien*/;
section critique
c2 := faux;
section non-critique
forever;
parend
end.
24/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 5
var c1, c2: boolean;
c1 := c2 := faux;
parbegin
P1 : while(1) { c1 := vrai;
while(c2) { c1 := faux;
while (c2) /*rien*/;
c1 := vrai; }
...section critique
c1 := false;
... section non-critique ... }

P2 : while(1) { c2 := vrai;
while(c1) { c2 := faux;
while (c1) /*rien*/;
c2 := vrai; }
... section critique
c2 := false;
... section non-critique... }
parend
25/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 6 - Algorithme de Dekker


var c1, c2: boolean; tour : integer;
c1 := c2 := faux; tour := 1;
parbegin
P1 : while(1) { c1:=vrai;
while (c2) if tour=2 { c1 := faux;
while (tour=2);
c1 := vrai; }
... section critique
c1 := false; tour := 2;
... section non-critique... }

P2 : while(1) { c2 := vrai;
while (c1) if tour=1 { c2:=faux;
while (tour=1);
c2 :=vrai; }
...section critique
c2 := false; tour := 1;
... section non-critique... }
parend
26/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Preuve du bon fonctionnement

Exclusion mutuelle garantie


Vrai car Pj entre seulement si Ci = faux

Pas d’interblocage (contraintes 3-4)


1 Pi est le seul à demander l’accès
2 Pi et Pj demandent l’accès
Vitesse ou tour empêchent l’interblocage

27/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 7 (généralisation à n processus)

begin /* programme */
flag := idle; /* pour tous */
tour := ?; /* une valeur entre 0 et N-1 */
parbegin
P(1); P(2); P(3); P(4); ... P(N-1);
parend;
end. /* programme */

28/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 7 - Algorithme de Dijkstra


var flag: array[0..N-1] of (idle, want-in, in-cs);
tour : 0..N-1;
Procedure P(i : integer)
var j : integer;
begin /* procedure */
repeat
{ repeat
{ flag[i]:=want-in;
while (tour!=i)
{ if (flag[tour]=idle) tour := i; }
flag[i] := in-cs; j:= 0;
while (j< N) and (j=i or flag[j] != in-cs)
j:= j+1;
} until j>=N;
...section critique
flag[i]:=idle;
...section non-critique
} forever;
end; /* procedure */
29/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Preuve du bon fonctionnement

Exclusion mutuelle garantie


Vrai car
1 Pj entre seulement si tous les flag[i] 6= in-cs
2 Pj teste flag[i] après avoir modifié le sien

Pas d’interblocage (contraintes 3-4)


1 flagi = in-cs n’implique pas que tour = i
2 si tour = i et flagi 6= idle , tour ne sera plus modifié
3 au tour suivant, un seul passe

30/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Contrainte supplémentaire

5. Il doit y avoir un nombre fini de processus autorisés à passer


en SC après qu’un processus quelconque ait fait une demande
d’entrée et avant que cette entrée soit autorisée.

31/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 8 - Algorithme de Eisenberg et McGuire


Procedure P(i : integer)
var j : integer;
begin /* procedure */
repeat
{ repeat
{ flag[i] := want-in;
j := tour;
while (j!=i) if flag[j]!=idle then j:=tour;
else j:=j+1 mod N;
flag[i] := in-cs; j:= 0;
while (j<N) and (j = i or flag[j]!=in-cs) do
j:= j+1;
} until (j>=N) and (tour=i or flag(tour)=idle);
tour := i;
...section critique ...
j:=tour+1 mod N;
while ((j!=tour) and (flag[j]=idle)) j:=j+1 mod N;
tour := j; flag[i] := idle;
... section non-critique ...
} forever;
end; /* procedure */

32/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme de la boulangerie (2 processus)


var c1, c2, n1, n2: boolean;
begin
c1 := c2 := n1 := n2 := 0;
parbegin
P1 : repeat
c1 := 1; n1 := n2 + 1; c1 := 0;
while c2!=0 do /* rien */;
while (n2 != 0) and (n2<n1) do /*rien*/;
.... section critique
n1 := 0;
.... section non-critique
forever;
P2 : repeat
c2:=1; n2 := n1 + 1; c2 :=0;
while c1!=0 do /*rien*/;
while (n1!=0) and (n1 <= n2) do /*rien*/;
.... section critique
n2 := 0;
.... section non-critique
forever;
parend
end.
33/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme de la boulangerie 2 (2 pcs)


var n1, n2: boolean;
begin
n1 := n2 := 0;
parbegin
P1 : repeat
n1 := 1; n1 := n2 + 1;
while (n2!=0) and (n2<n1) do /*rien*/;
.... section critique
n1 := 0;
.... section non-critique
forever;
P2 : repeat
n2 := 1; n2 := n1 + 1;
while (n1!=0) and (n1<=n2) do /*rien*/;
.... section critique
n2 := 0;
.... section non-critique
forever;
parend
end.
34/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 11 - Algorithme la boulangerie (n processus)


var choosing : array[0..n-1] of boolean;
number : array[0..n-1] of integer;
begin
choosing[0..n-1]:=faux;
number[0..n-1] := 0;
process Pi(1..n)
{ repeat
{ choosing[i] := vrai;
number[i] := max(number[0], ..., number[n-1])+1;
choosing[i] := faux;
for (j:=0 to n-1)
{ while choosing[j] do /*rien*/;
while (number[j]!=0) and
((number[j],j)<(number[i],i)) do /*rien*/;
}
.... section critique
number[i] := 0;
.... section non-critique
} forever;
}
end
35/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 12 - Algorithme de Peterson (2 processus)

begin /* programme */
flag[0] := flag[1] := faux;
tour := ?; /*une valeur entre 0 et 1 */
parbegin
P(0); P(1);
parend;
end. /*programme*/

36/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 12 - Algorithme de Peterson (2 processus)

var flag : array[0..1] of boolean;


tour : 0..1;
Procedure P(i : integer); /* i=0 ou 1 et j=i+1 mod 2*/
var j : integer;
begin /* procedure */
j := i + 1 mod 2;
repeat
flag[i] := vrai;
tour := j;
while (flag[j] and tour = j) /*rien*/;
.... section critique
flag[i] := faux;
.... section non-critique
forever;
end; /*procedure*/

37/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Preuve du bon fonctionnement

Exclusion mutuelle garantie


Supposons que les deux sont en section critique....
1 flagi = flagj = vrai
2 tour = i ou tour = j avec affectation défavorable
Pas d’interblocage (contraintes 3-4)
1 flagi = faux alors Pj passe
2 Si flagi = flagj = vrai alors tour débloque un processus

38/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 13 - Algorithme de Peterson (n processus)

begin /* programme */
flag[0..n-1] := -1;
tour[0..n-2] := 0;
parbegin
P(0); P(1); P(2); ...; P(n-1);
parend;
end. /* programme */

39/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme 13 - Algorithme de Peterson (n processus)

var flag : array[0..n-1] of -1..n-2;


tour : array[0..n-2] of 0..n-1;
Procedure P(i : integer);
var j : integer;
begin /*procedure*/
repeat
{ for (j:=0 to n-2)
{ flag[i] := j;
tour[j] := i;
Repeat /*rien*/
until ((forall k!=i : flag[k] < j) or (tour[j] != i));
}
.... section critique
flag[i] := -1;
.... section non-critique
} forever;
end; /* procedure */

40/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Preuve du bon fonctionnement

Exclusion mutuelle garantie

Pas d’interblocage ni famine (contraintes 3-4)

41/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Algorithme avec instructions machines

Certaines machines fournissent des instructions spéciales qui


permettent à un processus de tester et modifier le contenu de
la mémoire ou d’échanger le contenu de deux zones mémoire
de façon atomique.

Exemple : tst, swap, fadd, rmw, ...

42/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

tst et swap

procedure tst(var a,b : boolean)


begin
a:=b;
b:=true;
end

procedure swap(var a,b : boolean)


begin
var temp : boolean;
temp := a;
a := b;
b := temp;
end

43/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Exclusion mutuelle avec tst


var active : boolean = false;
libre : boolean;

procedure P(i)
var libre : boolean;

repeat
libre = true;
while libre do tst(libre, active);
... section critique
active = false;
forever;

44/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Exclusion mutuelle avec swap

var active : boolean = false;

procedure P(i)
var cle : boolean;

repeat
cle = true;
repeat
swap(active,cle);
until cle=false;
... section critique
active = false;
forever;

45/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exclusion mutuelle
Solutions avec attente active

Problèmes avec les algorithmes d’attente active

Difficile à concevoir et à prouver correct

Interblocage possible à cause des politiques

Utilisation inutile du temps de la machine

Synchronisation dépend de l’usager

Solutions peu lisibles (utilisation des variables, ...)

Solutions difficiles à généraliser

46/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Introduction

Introduction

Introduits par Dijkstra dans les années 60

Un sémaphore est une variable entière sur laquelle on définit


deux opérations atomiques : P (wait) et V (signal)

Un sémaphore peut être initialisé à une valeur n ≥ 0

48/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Introduction

Introduction

Soit un sémaphore S

P(S) bloque le processus appelant jusqu’à ce que S > 0

Une file d’attente est associée à chaque sémaphore pour


contenir les processus bloqués.

V (S) débloque le 1er processus en attente s’il y en a un, sinon


les signaux s’accumulent

49/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Implantation

Implantation

class semaphore {
int valeur;
listeDePcs liste;
public:
void P();
void V();
}

50/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Implantation

semaphore::void P()
{ valeur--;
if (valeur < 0)
{ état du processus courant = bloqué;
liste.ajoute(processus courant);
}
}
semaphore::void V()
{ process processus;
valeur++;
if (valeur <= 0)
{ processus = liste.retire();
processus.etat = prêt;
}
}
51/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Sémaphores
Implantation

semaphore::void P()
{ if (valeur = 0)
{ état du processus courant = bloqué;
liste.ajoute(processus courant);
}
else valeur--;
}
semaphore::void V()
{ process processus;
if (!liste.vide())
{ processus = liste.retire();
processus.etat = prêt;
}
else valeur++;
}
52/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Sémaphores
Implantation

Problème

File d’attente :
on l’implante où et comment ?
son implantation assure ou non l’équité...

Atomicité :
les opérations P et V doivent être atomiques (sections
critiques)
comment y parvenir (mono et multi processeur) ?

53/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Utilisations

Exclusion mutuelle

semaphore mutex;

mutex.init(1);

repeat
P(mutex)
.....section critique
V(mutex)
.....section non-critique
forever

54/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Utilisations

Synchronisation conditionnelle

semaphore cond;

cond.init(0);

P1 : . P2 : .
. .
. .
S1; P(cond);
V(cond); S2;
. .
. .
. .

55/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Utilisations

Synchronisation conditionnelle

E1

Var a,b,c,d,e,f,g : semaphores (=0)


begin
E2 E3
parbegin
begin E1; V(a); V(b); end;
begin P(a); E2; E4; V(c); V(d); end;
E4
begin P(b); E3; V(e); end;
begin P(c); E5; V(f); end;
E5
begin p(d); P(e); E6; V(g); end;
E6
begin P(f); P(g); E7; end;
parend;
E7 end;

56/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Utilisations

Limiter les accès

Soit un tampon contenant n espaces

On peut initialiser un sémaphore à n pour détecter que le


tampon est plein

Utilisé dans le problème des producteurs/consommateurs

Sémaphore général

57/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Évaluation

Avantages

Assurent l’exclusion mutuelle avec facilité

Évitent l’interblocage

Sont-ils équitables ?

58/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Sémaphores
Évaluation

Inconvénients

connaissance des compétiteurs

opérations toujours difficiles à utiliser

on peut oublier de mettre des éléments en section critique

les mêmes primitives assurent l’exclusion mutuelle et la


synchronisation conditionnelle

les opérations P et V ne donnent aucune idée sur la ressource


visée

59/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Tampon fini

Tampon fini

On possède un tampon contenant n éléments chacun


contenant un item

Pour la synchronisation on utilise 3 sémaphores


mutex (exclusion mutuelle)
plein et vide (synchronisation conditionnelle)

61/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Tampon fini

Sémaphores - tampon fini

type item : ...

var plein, vide, mutex : semaphore ;


tampon : array[0..n-1] of item ;
nextp, nextc : item ;

62/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Tampon fini

begin
plein := n ; vide := 0 ; mutex := 1 ;

parbegin
producteur : repeat
produire un "item" dans nextp ;
P(plein) ; P(mutex) ;
dépose nextp dans tampon ;
V(mutex) ; V(vide) ;
forever ;

consommateur : repeat
P(vide) ; P(mutex) ;
lire nextc de tampon ;
V(mutex) ; V(plein) ;
traite nextc ;
forever ;
parend
end ;
63/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exemples classiques
Tampon fini

Sémaphores - Système "batch"


Program OPSYS ;
var in_mutex, out_mutex : semaphore initial (1,1) ;
nun_in, num_out : semaphore initial (0,0) ;
free_in, free_out : semaphore initial (n,n) ;
tampon_in : array[0..n-1] of entree ;
tampon_out : array[0..n-1] of sortie ;

process lecteur ;
var ligne : entree ;
loop
lecture ligne ;
P(free_in) ; P(in_mutex) ;
dépose ligne dans tampon_in ;
V(in_mutex) ; V(num_in) ;
end ;
end process ;

64/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Tampon fini

Process traitement ;
var ligne : entree ; resultat : sortie ;
loop
P(num_in) ; P(in_mutex) ;
lecture ligne de tampon_in ;
V(in_mutex) ; V(free_in) ;
traitement de ligne et génération de resultat ;
P(free_out) ; P(out_mutex) ;
dépose resultat dans tampon_out ;
V(out_mutex) ; V(num_out) ;
end ;
end process ;

Process imprimante ;
var resultat : sortie ;
loop
P(num_out) ; P(out_mutex) ;
lecture resultat de tampon_out ;
V(out_mutex) ; V(free_out) ;
impression de resultat ;
end ;
end process ;
65/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exemples classiques
Lecteurs/écrivains

Lecteurs/écrivains

Un objet peut être partagé par plusieurs processus

Certains peuvent faire des lectures et d’autres des mises à jour

Cette distinction est importante :


lectures simultanées seulement → pas de problème.
écritures simultanées → risque d’incohérences
lectures et écriture simultanées → risque d’incohérences

66/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Lecteurs/écrivains

Lecteurs/écrivains
Exemple
Compte en banque A contient $500
Transaction B ajoute $10 sur A
Transaction C ajout $1000 sur A

Séquence :
1 B lit A ($500)
2 C lit A ($500)
3 C ajoute $1000
4 C écrit A ($1500)
5 B ajoute $10
6 B écrit A ($510) ⇒ A contient à la fin $510

67/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Lecteurs/écrivains

Lecteurs/écrivains

Solutions :

Permet plusieurs lecteurs simultanées

Accès exclusif aux écrivains

Variations :
on ne fait attendre aucun lecteur
on ne fait attendre aucun écrivain
autres ? ? ?

68/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Lecteurs/écrivains

Exemple de solution

2 sémaphores : mutex (1) et wrt (1)

1 entier (nblecteur)

69/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Lecteurs/écrivains

Exemple de solution
Lecteur : P(mutex)
nblecteur++
if (nblecteur=1) P(wrt)
V(mutex)
.... lecture.....
P(mutex)
nblecteur--
if (nblecteur=0) V(wrt)
V(mutex)

Écrivain: P(wrt)
.... écriture .....
V(wrt)
70/75 Processus concurrents et parallélisme
Chapitre 3 - Synchronisation
Exemples classiques
Philosophes

Philosophes

Introduit par Dijkstra (1965)

5 philosophes passent leur vie à penser et manger

Ils partagent une table circulaire, 5 chaises, 5 plats de riz et 5


baguettes

Pour manger il doit prendre 2 baguettes (les plus rapprochées)

Si une des baguettes n’est pas disponible, il attend

71/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Exemples classiques
Philosophes

Var baguette : array[0..4] of semaphore;


Procedure phil(i:integer)
begin
repeat
P(baguette[i])
P(baguette[i+1mod5])
...mange ...
V(baguette[i]
V(baguette[i+1mod5])
... pense ...
forever
end
begin
baguette[0..4] :=1
cobegin
phil(0); phil(1); phil(2); phil(3); phil(4)
coend
end

72/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Conclusion

Conclusion

Tout semble beau... En théorie ! !


Les algorithmes supposent une certaine cohérence de la
mémoire
Cette cohérence est absente sur la plupart des ordinateurs
modernes ! ! !
Sans compter que les compilateurs ré-ordonnent certains
énoncés ! ! !
Les algorithmes de Dekker et de Peterson ne fonctionnent
donc plus ! ! ! !

74/75 Processus concurrents et parallélisme


Chapitre 3 - Synchronisation
Conclusion

Conclusion

Exemples : Dekker et Peterson


Disponibles sur le site Web...

75/75 Processus concurrents et parallélisme

Vous aimerez peut-être aussi