Вы находитесь на странице: 1из 72

Cnam - Laboratoire Cedric

Mmoire
Rpartie
Partage

Eric Gressier-Soudan

Cnam - 1996

Plan

Introduction
Environnement Multiprocesseur
Environnement Faiblement Coupl
Conclusion

INTRODUCTION

Pourquoi rpartir les donnes


a) amliorer les services rendus par le systme:
- performance / efficacit
- disponibilit
- tolrance aux pannes
b) meilleure adquation au modle d'excution :
- le paralllisme des processus1
- communication par variables partages vs communication par messages
- objets
c) reprsentation/manipulation physique de donnes abstraites -> utilisation d'adresses virtuelles
- correspondance avec pages relles

(dj connu en univers centralis)


offrir aux programmes l'illusion 2 qu'ils sont les seuls utiliser une mmoire uniforme centralise

Migration de processus plus facile avec une Mmoire Virtuelle Rpartie


Toujours la proprit "Single System Image" vision uniformise des ressources
offertes par un systme
1
2

Hirarchie de mmoire (1)

Mmoire
Centrale
Cache

Disque

Processeur

vitesse d'accs :

Processeur< Cache < Mmoire Centrale < Disque

Hirarchie de mmoire (2)


Registres CPU
unit d'accs : mot 32 bits
dans une ligne de cache (32o)

Cache
a
Mmoire Centrale

b
unit d'accs : ligne
dans une page (4Ko)

B b
a
Page A
Disque
Fichier 1
B b
a
Page A

unit d'accs : page


dans une suite de pages

Problme de la rpartition des donnes


(1)
Problme en centralis monoprocesseur ?

Cache
Registres

Cache
externe
donnes

Mmoire
Centrale
banc
mmoire

Processeur

Disque

Rseau
Serveur de
fichiers

Problme de la rpartition des donnes


(2)
Il faut considrer le problme en multiprocesseur et en rparti !

Mmoire Partage

Mmoire Partage Rpartie


. problme de copies multiples (caches/mmoires)
. de cohrence des copies

Orientation du cours
Nous ne traitons que des problmes de gestion rpartie des donnes au niveau de la mmoire.

. La Gestion de Fichiers Rpartis concerne ce sujet mais est hors du propos de ce cours.
. La Gestion de Transactions pourrait aussi concerner ce sujet, mais elle ne sera pas traite.

Architectures Considres :
les architectures parallles de type MIMD3

Multiple Instruction streams over Multiple Data streams (flots d'instructions et de

donnes multiples)

Machines Fortement Couples (1)


Multiprocesseur => la mmoire est partage
. Accs uniforme la mmoire (UMA4) : tous les processeurs accdent la mmoire physique,
le temps d'accs un mot mmoire est identique
CPU

Bus
Mmoire Commune
commutateur

E/S

Mmoires

Commutation de Circuits
O

Rseau Maill

multiprocesseur symtrique : les processeurs ont les mmes capacits, ils


peuvent excuter le systme et faire des E/S.
multiprocesseur asymtrique : certains processeurs sont spcialiss, un
processeur excute le systme et fait des E/S, les autres sont ddis l'excution
de programmes utilisateur.

Uniform Memory Access

Machines Fortement Couples (2)


. Accs non uniforme la mmoire (NUMA5): le temps d'accs la mmoire diffre en
fonction de la localisation des donnes cause de la traverse du rseau d'interconnexion

Les mmoires locales sont adressables par les processeurs


distants, elles forment un espace d'adressage global.
CPU

Mmoire
locale

rseau d'interconnexion

multiprocesseur BBN Butterfly


Mmoires
globales

Rseau d'interconnexion global

Cluster

Cluster

Cluster

multiprocesseur Cedar (Universit Illinois)

Non Uniform Memory Access

Machines Fortement Couples (3)


. Architecture mmoire cache uniquement (COMA6): c'est un cas particulier de
machine NUMA

L'accs un cache distant utilise un mcanisme de rpertoire.


Le rpertoire contient pour chaque bloc des informations sur
son tat et sa localisation. Il peut y avoir une hirarchie de
plusieurs niveaux de rpertoires.

Rseau d'interconnexion
R

CPU

CPU

CPU

CPU

C : Cache
R : Rpertoire

Cache-Only Memory Architecture

Machines Faiblement Couples


multiordinateur -> processeurs en rseau

la communication entre processeurs s'effectue uniquement par


messages, les mmoires sont prives et ne sont accessibles que
par le processeur local
pas d'accs distance la mmoire (NORMA7)

mmoire
prive

CPU
Rseau d'interconnexion

Rseau :
Rseau Local, Anneau, Anneau "Chordal", Arbre binaire,
Etoile, Hypercube, Rseau maill, Tore, Mesh...

Anneau Chordal
de degr 2

Mesh 3x3

No Remote Memory Access

Mesh (Illiac) 3x3

Tore 3x3

Principes de la rpartition des donnes


en mmoire
1. L'efficacit de la rpartition des donnes repose sur la
proprit de localit des rfrences aux informations en
mmoire.
-Localit dans le temps: Pendant un certain temps, les mmes
informations seront accdes.
-Localit dans l'espace: Les rfrences faites par un
programme, donnes comme instructions, se trouvent dans des
zones d'adresses proches.
"espace de travail - Working Set "
2. Gestion de la concurrence des accs :
-> ajout de mcanismes de synchronisation ct du partage de
la mmoire
-> smantique de cohrence des copies plus ou moins forte

Mmoire virtuelle rpartie partage (1)


Mmoire virtuelle pour offrir un espace d'adressage plus grand que la mmoire physique disponible.
On considre une mmoire virtuelle lorsqu'on travaille en univers rparti (multiordinateur) :
l'espace d'adressage est global un ensemble de processeurs, il recouvre les
espaces d'adressages virtuels privs pouvant tre associs chaque processeur.
-> Mise en uvre Matrielle :
Unit de gestion mmoire (MMU8)

-> Mise en uvre Logicielle :

Gestionnaire de Mmoire(externe au noyau) ->


. indpendance vis vis du matriel
. rpartition facile
.smantique de la cohrence spcifique l'utilisateur
Micro-Noyau
Hardware - MMU

Memory Management Unit

Mmoire virtuelle rpartie partage (2)


Convergence des Problmes quelle que soit la base des solutions : matrielle ou logicielle
=
Algorithmique rpartie

Environnement
Multiprocesseur

Objectifs de la conception d'un cache


- maximiser la probabilit de trouver une rfrence (hit 9ratio) dans le cache
- minimiser le temps d'accs l'information
- minimiser le dlai introduit par un dfaut (miss ) dans le cache
- minimiser le temps de mise jour de la copie de rfrence (la mmoire)

invisible l'utilisateur ou aux programmes

"hit", succs lors d'une requte au cache, au contraire de "miss", qui est employ
lors d'un dfaut d'accs au cache
9

Points principaux d'un cache


Adresse
Donnes

Adresse
Donnes
Donnes
Processeur

Adresse
Instructions

Cache
Donnes

Donnes
Adresse Mmoire
Instructions Principale

Cache
Instructions Instructions Instructions

1. Les donnes sont accompagnes d'une marque/tiquette


"tag". Un tag contient l'adresse de l'information archive dans le
cache.
Lorsque le processeur effectue un accs une variable en mmoire, l'adresse
de cette information est envoye au cache, une recherche s'effectue alors,
l'information est retrouve grce sa marque, si elle est prsente dans le cache.
Si l'adresse ne correspond aucun tag, l'adresse est passe l'extrieur pour
tre servie soit par la mmoire principale, soit par un autre cache dans le cas d'un
multiprocesseur. Au retour, l'information est stocke dans le cache.

2. L'unit mmoire de gestion d'un cache est une ligne ou un


bloc (16 32 octets voire 128 et mme 256 octets pour mieux
bnficier des effets de localit), il y a une marque associe
chaque ligne.
ligne de cache = tag + information
<bit de validit, bit de modification, [cl],
adresse de l'information>
<information>
bit de validit : indique si la ligne contient des informations en service, valides
bit de modification : indique si la ligne a t modifie depuis son chargement
dans le cache, ce bit sert pour la mise jour d'autres caches ou de la mmoire
principale suivant la stratgie de cohrence choisie.

Correspondance
Centrale

Cache

Mmoire

1. Caches correspondance directe


N ligne tag

Adresse
fonction de hachage

index

donnes

0
1
2
3

Donnes
...

2. Caches associatifs

Adresse
index
fonction de hachage de
groupe

groupe ligne tag


...0
0
n
...0
1
n
...0
2
n

donnes

Donnes
...

Mcanismes de base d'un cache


1. Accs aux donnes
2. Cache avec adresses virtuelles ou physiques
3. Cache donnes-cache instructions
4. Stratgie de remplacement des informations dans le cache / vidage du cache
5. Mise jour de la mmoire : cache mise jour immdiate 10 ou cache mise jour
retarde11
6. Intgration des oprations d'E/S avec la cohrence du cache

fonctionnement du cache en mode Write-through


11 fonctionnement du cache en mode Write-back
10

Caches sur adresses Physiques


Ad.
Virt

MMU

Ad.
Phys

Ad.
Phys
Cache
en ad.
Physiques

CPU

Mmoire
Principale

Donnes
Donnes
L'adresse physique est calcule chaque accs.
Type de cache rserv au caches hors puce processeur.

Faiblesse des politiques de mise jour


cache-mmoire pour le maintien de la
cohrence
Situation initiale :

P1

P0
Caches
Mmoire
Commune

P1

P0

->
Load X
sur
X
P0 et P1
Les copies sont cohrentes

Mise jour immdiate :

P1

P0

X'
->
Store X'
sur P0

P1

P0

X'

Les copies sont incohrentes


Mise jour retarde :

P1

P0

X
X

P1

P0

X'
->
Store X'
sur P0

Les copies sont incohrentes


Mcanismes Insuffisants pour le maintien de la cohrence

Protocoles Multiprocesseur
par espionnage
Exemple :Firefly

Le contrleur de cache espion -

Snoopy

Cache Controler

CPU

P1

P2

Pn

Mmoire
Cache
Snoopy

...

Bus

[Contrleur
de Mmoire]

Mmoire Commune

Arbitre
de bus

Le processeur cherche la donne dont il a besoin dans le cache, s'il ne la trouve pas, il est mis en
attente jusqu' ce que celle-ci y soit amene depuis un autre cache ou depuis la mmoire commune.
Principe :
Le contrleur de cache gre le protocole de cohrence pour un processeur, il maintient la cohrence
en espionnant les transactions sur le bus effectues par les autres processeurs.
L'espionnage porte sur le tag des donnes contenues dans le cache.

Protocole de maintien de la Cohrence


(1)
Le maintien de la cohrence se fait par coopration des diffrents contrleurs:

Mmoire
Cache
Snoopy

...

Bus

Arbitre
de bus
Mmoire Commune

L'arbitre de bus a un rle prpondrant puisqu'il attribue le bus un processeur ou un autre quand
il y a conflit.
Les protocoles sont dpendants de la stratgie de mise jour de la mmoire commune adopte pour
les caches.

Protocole de maintien de la Cohrence


(2)
Deux protocoles :
1. Protocoles invalidation sur criture :
Lorsqu'un processeur modifie une donne toutes les copies de cette donne sont invalides, seul
l'crivain possde une copie jour.

Repose sur la notion de propritaire (dernier crivain sinon mmoire commune)


Protocole Berkeley [4]
2. Protocole diffusion des critures :
A chaque criture sur une copie, toutes les autres copies prsentes dans les autres caches sont mises
jour.
La mmoire commune est mise jour en fonction de la gestion de cache adopte : chaque criture
(write-through), au vidage du dernier cache (write-back).

Protocole de maintien de la Cohrence


(3)
Multiprocesseur avec caches de type mise jour immdiate

Situation initiale :
P1

P0

X
X

Effet d'une invalidation sur criture lors de la modification de X


en X' sur P0 :
P1

P0

X'

X'
I pour invalide
Effet d'une diffusion de l'criture lors de la modification de X en
X' sur P0 :
P1

P0

X'

X'

X'
NB : La mmoire centrale est mise jour cause de la politique
write-through

L'algorithme du Firefly - DEC [5] (1)


2 stratgies simultanment:
. Mise jour retarde pour les donnes non partages
. Mise jour immdiate pour les donnes partages et donc Diffusion des Ecritures
conomise l'utilisation du bus, et tente un bon compromis entre performance et maintien de la
cohrence entre la mmoire et le cache

L'algorithme du Firefly (2)


Etats d'un Bloc dans un cache :
1 bit SHARED : partag
1 bit DIRTY12 :

modifi

Important :
Un signal sur le bus, "MShared", sert dtecter si un bloc
est partag par d'autres caches. Quand un cache effectue une
transaction sur le bus, les caches qui possdent une copie de la
donne associe cette transaction positionnent Mshared pour
indiquer qu'ils la partagent.
La gestion du bus est faite de telle faon que tous les caches
puissent rpondre pendant un cycle.
une transaction sur le Bus : 4 cycles
100 ns

Comptition
acquisition du
bus
+
Adresse donne
accde

MWrite
(donne)

MShared

MRead
donnes fournies
par autre cache
(MShared)
ou mmoire

seul type de bloc qui peut-tre recopi en mmoire commune, lorsque le cache du
dernier crivain sera vid
12

L'algorithme du Firefly (3)


Les tats-changements d'tats sont causs soit :
- par le processeur associ au cache (P),
- par des transactions observes sur le bus mmoire (M).
Situations observes :

PRead

PRead, PWrite

n-Shared
0
n-Dirty
PMiss
(n-MShared)

PWrite
2

PWrite (n-MShared)
8
MRead,
MWrite PWrite (n-MShared)
4

n-Shared
Dirty

MWrite
7

PMiss
MWrite 10
(MShared)
Shared
5
n-Dirty
11 PWrite (MShared)
PRead,
MRead,
PWrite (MShared)
Mwrite
12 13

"n-X" veut dire "not X"

MRead

Write-Back
6
Write-Through

Shared
Dirty
PRead MRead
14 15

L'algorithme du Firefly (4)


Actions lies la scrutation du bus :
Lorsqu'un contrleur de cache dtecte une lecture sur le bus
(MRead), et qu'il possde une copie chez lui, il sert la copie au
demandeur13.
Lorsqu'un contrleur de cache dtecte une criture
(MWrite), il met jour sa copie, pendant le cycle suivant il
positionne MShared.
Vidage du cache :
Lors d'un dfaut (Read Miss ou Write Miss), s'il y a une
place vide dans le cache, la donne est charge cet endroit. S'il
n'y a pas de place vide, la cellule slectionne (cellule victime)
par l'algorithme de remplacement est d'abord recopie dans la
mmoire commune avant que la lecture ne soit termine. Cette
recopie en mmoire n'a lieu que si ce processeur est le dernier
avoir une copie de la cellule dans son cache.
Ecriture sur un bloc partag :
La modification n'est pas faite tant que le contrleur de
cache n'a pas pu diffuser sa mise jour, ce qui suppose
l'acquisition du bus.

Plusieurs caches peuvent servir la requte simultanment ... le rsultat sur le bus
est bon puisque toutes les copies sont identiques d'aprs le protocole de gestion de la
cohrence.
13

L'algorithme du Firefly (Hypothses de fonctionnement d'aprs [5] )


a. L'unit de donne sur laquelle s'applique le protocole est une cellule ("line" dans la
terminologie de l'article). Elle "mesure/pse" 4 octets soit un mot mmoire VAX.
b. Lors d'un dfaut, si la donne demande n'est dans aucun cache, la mmoire
commune fournit la donne. Si elle est prsente dans un ou plusieurs caches, elle
est crite sur le bus de donnes pendant le 4me slot du cycle de transaction-bus.
Tous ceux qui dtiennent un exemplaire crivent ... ils fournissent la mme valeur
cause du protocole de cohrence. La mmoire commune est inhibe et ne peut
servir la donne.
c. Les donnes non partages accdes en lecture comme en criture le sont dans le
cache local. Dans ce cas, aucune action sur le bus n'est provoque... en particulier,
il n'y a pas d'acquisition du bus par le "snoopy" pour informer les autres caches
des oprations qu'il est en train d'effectuer. La cellule ne sera recopie en mmoire
que lorsqu'elle quittera le cache pour faire de la place (politique write-back).
d. Les donnes partages (prsentes simultanment dans plusieurs caches) sont
accdes en lecture dans le cache local au processeur. Dans le cas d'une criture, le
cache diffuse son criture aux autres caches. L'criture n'a d'effet localement
qu'aprs le succs de la diffusion de la nouvelle valeur (hypothse d'atomicit)
Compte tenu du fonctionnement des transactions sur le bus, la diffusion de
l'criture a lieu pendant le 2me cyle. Si l'crivain doit dcouvrir qu'il ne partage
plus la cellule, il ne peut le faire qu'au 3me cycle. Si tel est le cas, il modifie le bit
de partage en indiquant qu'elle n'est plus partage. Il passe en politique write-back.
Les oprations en mode partag sont toujours vues sur le bus.
e. Le dclenchement de la politique write-through est li la valeur du bit Shared
et l'opration d'criture proprement dite.

L'algorithme du Firefly (Transitions de la figure prcdente)


0. Dfaut, qq soit la nature du dfaut la page mmoire commune tait jour. La
cellule est donc non-modifie par rapport la copie de rfrence en mmoire
commune.
1. Le processeur effectue une lecture sur une cellule non paratage, rien ne change.
2. Il effectue une criture, la cellule est donc modifie par rapport la copie de
rfrence en mmoire commune.
3. Pas de modification par lecture ou criture, la copie est dj modifie.
4. Le contrleur de cache (snoopy) a dtect qu'un autre cache demandait la copie
qu'il dtient pour la lire ou pour crire ... on passe de la politique de mise jour
retarde (write-back) mise jour immdiate (write-through) ... la cellule n'tait
pas modifie, pas de pb.
5. Dfaut sur une page partage par d'autres processeurs.
6. La copie tait modifie, le snoopy dtecte une lecture, c'est ncssairement un
dfaut puisqu'il tait le seul avoir la copie ... il fournit sa version au cache
demandeur. La cellule devient partage, la mmoire commune n'a pas encore t
mise jour, elle le sera la prochaine criture cause de la politique writethrough qui pourra tre applique seulement partir de ce moment
(pour crire en mmoire il faut une criture effective)... Soit deux caches voient la
mme cellule dans deux tat diffrents : l'un Shared-Dirty, l'autre Shared-n-Dirty ... Il faut
remarquer dans la description du protocole Firefly [3], que l'tat Shared-Dirty n'existait pas !!!

7. La copie tait modifie, et non partage ... le snoopy a dtect qu'un autre cache
veut la page pour y effectuer une criture, il va lui fournir sa copie, mais
l'hypothse 3 implique une mise jour de la copie de rfrence en mmoire
commune.

8. La copie est partage, la copie est crite localement, la mmoire commune est
mise jour, le snoopy dtecte que plus personne ne la partage, qu'il est le seul
dtenir un exemplaire. La cellule passe l'tat non partag, et non-modifie.
9. idem
10. Premire criture, effectue par un autre processeur. C'est dtect lors de la
transaction bus ... la politique write-through implique la mise jour de la version
de rfrence dans la mmoire commune.
11. Idem, sauf que l'criture est locale.
12, 13. Lecture locale, Ecriture locale avec poursuite du partage, lecture ou
criture dans un autre cache ne changent pas l'tat de la cellule.
14,15. Lecture locale, lecture dans un autre cache ne dclenche pas la mise jour
de la copie de rfrence en mmoire commune ... l'tat de la cellule ne change pas.

Faiblesses des solutions base d'espions


- mauvaise extensibilit : la bande passante du bus est limite, 32 processeurs ... c'est dj beaucoup
- suivant le protocole :
* trop de diffusions qui vont mettre jour des donnes qui ne seront pas utilises.
* les invalidations d'une ligne vont provoquer des dfauts de lecture.

Ces deux derniers problmes peuvent tre agravs si le grain des lignes/blocs est trop grand, en effet
des mots peuvent tre en mmoire et ne pas tre utiliss.
On veut viser plusieurs centaines de processeurs.
solutions base de rpertoires qui contiennent des informations de localisation sur les lignes/blocs.

Environnements
Faiblement Coupls

Hypothse d'architecture
Mmoire virtuellement centralise

P1
Mmoire
Locale
Mappeur

P2

...

Pn

Rseau
Architecture de type NORMA :
. On raisonne en adresses virtuelles
. Communication par message fiable
. L'accs s'effectue l'chelle de la page
Objectif :
Offrir l'abstraction d'une mmoire commune masquant les mmoires prives.

Origine de la solution
Algorithme de gestion de la mmoire virtuelle rpartie partage tablie par Kai Li et Paul Hudak [6],
solution de type Cohrence Forte
fond sur la notion de propritaire,
utilisant les mcanismes d'invalidation sur criture 14.
=> La diffusion des critures est beaucoup trop coteuse
3 solutions :
. Gestionnaire centralis
. Gestionnaire avec rpartition statique
. Gestion Rpartie Dynamique
Les auteurs proposent des optimisations.

Adaptation du protocole de Berkeley [4] pour multiprocesseur mmoire


commune un rseau de stations
14

Gestionnaire Centralis (1)


1 site, prdfini, assure la gestion de la cohrence pour l'ensemble des pages

Structures de Donnes (version optimise):


- pour chaque site :
Table des Pages
verrou
{sites avec une copie} droits d'accs

N page

verrou
: pour verrouiller les accs locaux/distants une page
droit d'accs
: lecture, criture, invalide
15
{sites avec une copie} : n'a un sens que si le site est propritaire de la page

- pour le Gestionnaire :
Info
N page propritaire
Verrou
Gestionnaire
propritaire
Verrou-Gestionnaire

: N du site crivain le plus rcent


: pour verrouiller les demandes des diffrents sites

Un verrou n'est relach qu'une fois l'opration d'accs la page correspondante


termine, c'est dire qu'un exemplaire de la page est arriv sur le site.

15

encore appel copyset

Gestionnaire Centralis (2)


Protocole

Dfaut en Lecture :

G
Requte en Lecture

Redirection de la
demande vers le
propritaire

Dfaut
Mise jour
P
L
en
du copy set
Copie en Lecture
Lecture
Aprs rception
accs = lecture
accs = lecture

Gestionnaire Centralis (3)


Protocole

Dfaut en Ecriture :

Mise jour avec nouveau propritaire E


Redirection de la
demande vers
l'ancien
propritaire P

G
Requte en
Ecriture
Dfaut
en
Ecriture

Copie + copy set


E

copy set =
aprs
invalidation
accs = criture

accs = invalide

accs = invalide
Invalidation
des copies
partir du
copy set reu

accs = invalide

Extension du Gestionnaire Centralis au


Gestionnaire Rparti Statique
Chaque processeur est le gestionnaire d'un ensemble prdfini de pages (statique).
Lorsqu'un accs est effectu sur une page p, la requte est soumise au processeur gestionnaire
correspondant,
le numro du processeur est obtenu par une fonction f ( p , N )
o N est le nombre de processeurs qui participent la gestion de la mmoire virtuelle rpartie.

Gestion Rpartie avec Diffusion


ide : LAN => utiliser les possibilits de diffusion du support de communication pour invalider
ou localiser un propritaire de page (Broadcast ou Multicast)
problme : diffusion des demandes, on peut tre amen traiter des demandes trop anciennes
et qui n'ont plus de sens
solution : ordonner les demandes et les rponses par une Diffusion Ordonne ou des Vecteurs
d'horloge sur le contenant des pages

Gestion Rpartie
Problme
S1

avec

propritaire
de P (E)

Diffusion

S1

S3

S3

dfaut P
E
(verrou)

S2

dfaut P
E
(verrou)
t=0

S2

diffusions :
S2 passe d'abord
t+d
S1

S1

S3

S3

P
2
S2

S2 reoit P, et traite
la demande de S3
t+d"

S2

S3 reoit P, et traite
la demande de S2
t+d"'

S3 envoie la page S2, cette page ne correspond plus


aucune demande en cours, la requte de S2 par rapport la
rception de la page P est un vnement trop ancien, il aurait
du l'oublier.

Gestion Rpartie Dynamique (1)


La fonction de gestionnaire est rpartie et dynamique
Structure de donnes d'un site :

Table des Pages


N page verrou {sites avec une copie} propr probable droits d'accs

Notion de propritaire probable : le site n'a qu'une estimation du vritable propritaire de la page
(suggestion - hint).
Le copyset n'a de sens que quand on est le vritable propritaire de la page.

Gestion Rpartie Dynamique (2)


Dfaut de page (criture ou lecture) :

Le processeur envoie sa requte au propritaire probable


de la page qui est indiqu dans sa table.
- Si le propritaire probable n'est pas le vrai propritaire, il
propage la requte.
- Sinon il est le vrai propritaire, il fait comme dans l'algorithme
prcdent :
. en lecture il modifie l'accs, met jour le copy set, et
envoie une copie,
. en criture il invalide localement, et envoie la page avec le
copyset au demandeur, il mmorise que ce dernier devient le
propritaire probable.
Sur rception de la page, le demandeur invalide et devient le vrai propritaire, le copyset est vid.

Gestion Rpartie Dynamique (3)


Modification du champ propritaire probable : Sur
rception d'une demande d'criture, de lecture (sauf pour le
propritaire), ou d'invalidation -> le demandeur
ProbOwn
3

2
ProbOwn
2

ProbOwn
4

Propritaire

Propritaire

Dfaut de page en lecture de 1


ProbOwn
3

2
ProbOwn
2

ProbOwn
4

Propritaire

Propritaire

Dfaut de page en criture de 1


Problme : Borner le nombre de sites parcourus pour trouver la
page requise.
Au pire N-1, au mieux 216, en moyenne O(N + K log N) aprs K
demandes d'une page. En gnral pas plus de deux processeurs
partagent la mme page.

Juste aprs une recheche du propritaire qui a parcouru toute la chaine des
propritaires probables. Les champs de la table des pages de ces sites a t mis
jour avec la valeur du demandeur.
16

Algorithme [6]:
La mmoire fonctionne sur le principe d'une mmoire pagine. Lors d' un
dfaut de page, le processeur s'adresse un handler qui recherche la page
demande auprs des autres processeurs du rseau. Le mappeur est la partie du
systme attache un processeur qui rpond aux demandes de pages provenant des
autres processeurs du rseau. Les mappeurs communiquent entre eux pour
maintenir la cohrence entre les diffrentes copies des pages.
Les communications sont fiables: pas de perte de messages, pas de duplication
de messages, pas de corruption de messages, pas de dsquencement des messages,
ou alors, le protocole de transport est capable de le dtecter et de le corriger.
Un processeur effectue une invalidation lorsqu'il devient le propritaire d'une
page suite un dfaut en criture. Il effectue alors une demande d'invalidation.
L'invalidation consiste envoyer l'ensemble des sites (copyset) qui ont une copie
de la page une requte pour qu'ils changent le mode d'accs de celle-ci "nil". Cette
demande s'effectue l'aide de la primitive :
Invalider(page, ensemble de processeurs destinataires).
La rception et l'excution de la requte d'invalidation sur un processeur est
effectu par le serveur d'invalidation propre celui-ci.
Les informations que maintiennent les mappeurs sur les pages sont contenues
dans une table TabP[] , table des pages qui contient les champs suivants :
- access reprsente le mode d'accs la page : read, write, nil,
- copyset contient l'ensemble des processeurs qui ont une copie (en lecture) de la
page,
- lock joue le rle de variable smaphore pour l'accs en exclusion mutuelle la
page pendant un dfaut, deux primitives sont utilises :
LOCK() pour tester le smaphore et ventuellement bloquer le demandeur,
UNLOCK() pour dverrouiller l'accs,
- probOwner indique un propritaire estim (probable) de la page.
Le schma page suivante illustre ces lments.

processeur
table
des pages
TabP[]
dfaut de
page dtect
par le matriel

mappeur

handler

Serveur
d'Invalidation mappeur

processeur

handler

mappeur
message
changs entre
mappeurs
pour le maintien de
la cohrence

handler

processeur

L'algorithme de gestion distribue de la mmoire virtuelle rpartie est le suivant :


Handler de dfaut de page en lecture :
LOCK ( TabP[p].lock);
Demander TabP[p].probOwner l'accs en lecture pour la page p;
TabP[p].probOwner := processeur qui a rpondu;
TabP[p].access := read;
UNLOCK ( TabP[p].lock);
Mappeur en lecture:
LOCK ( TabP[p].lock);
IF je suis le propritaire
THEN BEGIN
TabP[p].copyset := TabP[p].copyset U {processeur demandeur};
TabP[p].access := read;
Envoyer (p au processeur demandeur);
END
ELSE BEGIN
Rediriger la requte vers le processeur (TabP[p].probOwner);
TabP[p].probOwner := processeur demandeur;
END;
UNLOCK ( TabP[p].lock);

Handler de dfaut de page en criture :


LOCK ( TabP[p].lock);
Demander TabP[p].probOwner l'accs en criture pour la page p;
Invalider (p, TabP[p].copyset);
TabP[p].probOwner := moi-mme;
TabP[p].access := write;
TabP[p].copyset := {};
UNLOCK ( TabP[p].lock);
Mappeur en criture:
LOCK ( TabP[p].lock);
IF je suis le propritaire
THEN BEGIN
TabP[p].access := nil;
Envoyer (p et TabP[p].copyset au processeur demandeur);
TabP[p].probOwner := processeur demandeur;
END
ELSE BEGIN
Rediriger la requte vers le processeur (TabP[p].probOwner);
TabP[p].probOwner := processeur demandeur;
END;
UNLOCK ( TabP[p].lock);
Serveur d'Invalidation :
TabP[p].access := nil;
TabP[p].probOwner := processeur demandeur;
On forme le graphe des propritaires probables pour une page p de la faon
suivante:
Pi->Pj si TabP[p].probOwner de Pi := Pj.

Gestion
Rpartie
copyset rparti (1)

Dynamique

avec

Le copyset ne sert qu'au moment de l'invalidation, on peut imaginer une autre faon de le grer
pourvu que l'invalidation s'effectue toujours correctement.
Maintenant un site qui dtient un exemplaire de la page peut fournir la page au demandeur en lecture.
Il ajoute alors le demandeur au copyset.
graphe des propritaires probables :

vrai propritaire

vrai propritaire

2
4

3
5

2
4

3
5

6 effectue un dfaut en lecture et est servi par 2

Gestion
Rpartie
copyset rparti (2)

Dynamique

avec

vrai propritaire

2
4

3
5

vrai propritaire
6 effectue un dfaut en criture et est servi par 1
Propagation des demandes d'invalidation

1
2
4

3
5

La distribution du copyset organise l'ensemble des noeuds en arbre.

Le graphe des propritaires probables va des feuilles vers la


racine.
Le graphe des invalidations va de la racine vers les feuilles
sens opp au prcdent.

Algorithme (suite) [6]:


L'invalidation est plus efficace si le rseau qui relie les processeurs supporte
la diffusion. En effet, le serveur qui dclenche une invalidation n'a qu' diffuser en
un seul message sa requte vers tous les processeurs. Les auteurs proposent une
nouvelle version de leur algorithme pour tenir compte des rseaux qui ne
supportent pas la diffusion.
Handler de dfaut de page en lecture : (inchang p/r la version
optimise prcdente)
LOCK ( TabP[p].lock);
Demander TabP[p].probOwner l'accs en lecture pour page p;
TabP[p].probOwner := processeur qui a rpondu;
TabP[p].access := read;
UNLOCK ( TabP[p].lock);
Mappeur en lecture:
LOCK ( TabP[p].lock);
IF TabP[p].access nil THEN BEGIN
TabP[p].copyset := TabP[p].copyset U {processeur demandeur};
TabP[p].access := read;
Envoyer (p au processeur demandeur);
END
ELSE BEGIN
Rediriger la requte vers le processeur (TabP[p].probOwner);
TabP[p].probOwner := processeur demandeur;
END;
UNLOCK ( TabP[p].lock);
Handler de dfaut de page en criture : (inchang)
LOCK ( TabP[p].lock);
Demander TabP[p].probOwner l'accs en criture pour pagep;
Invalider (p, TabP[p].copyset);
TabP[p].probOwner := moi-mme;
TabP[p].access := write;
TabP[p].copyset := {};
UNLOCK ( TabP[p].lock);

Mappeur en criture : (inchang)


LOCK ( TabP[p].lock);
IF je suis le propritaire
THEN BEGIN
TabP[p].access := nil;
Envoyer (p et TabP[p].copyset au processeur demandeur);
TabP[p].probOwner := processeur demandeur;
END
ELSE BEGIN
Rediriger la requte vers le processeur (TabP[p].probOwner);
TabP[p].probOwner := processeur demandeur;
END;
UNLOCK ( TabP[p].lock);
Serveur d'Invalidation :
IF TabP[p].access nil THEN BEGIN
Invalider (p, TabP[p].copyset);
TabP[p].copyset := {};
TabP[p].access := nil;
TabP[p].probOwner := processeur demandeur;
END
On dfinit la notion de graphe des invalidations de la faon suivante :
Pk -> Pm si Pk envoie une requte d'invalidation vers Pm.

Problmes des protocoles de gestion de


la cohrence
. TRASHING : on invalide une page de la mmoire locale alors
qu'on va en avoir besoin ...
pb qui se pose en gestion de mmoire centralise, pb du
Working Set, l'adaptation de ce problme aux caches est connu
sous le nom de Working Set Restauration
. PING-PONG : voyage d'une page d'une mmoire l'autre
sous l'effet de la demande
-> par exemple plusieurs processeurs font une exclusion mutuelle
:
while (TEST&SET (lock) = 1) do nothing ;
< section critique>
RESET (lock) ;
La page qui contiendrait la variable lock n'arrte pas de se
promener entre chaque processeur!
. FAUX PARTAGE : Une partie des donnes contenues dans
une page n'est pas partag alors que le reste l'est.
Remarque : Ces problmes existent aussi en multiprocesseur.

Typologie des architectures grant les


donnes rparties
Gestion de la cohrence
dans le matriel

Gestion par MMU

Gestion de la cohrence dans


le logiciel
Gestion par Gestion par l'environnement
le Systme
d'excution associ au
(mappeur)
langage de programmation

intermultiMPR
processeur connexion
de
sur Pages
bus
clusters
(1 cluster)

MPR
sur
Variables

fortement coupl

MPR
sur Objets
faiblement coupl

accs distant
support par le
matriel

accs distant
support par le
logiciel
machines parallles

liste indicative des projets de recherche (ncessairement incomplte) :


FIREFLY

DASH
KSR

ARIAS(IMAG)
IVY
MUNIN
MIRAGE
TREADMARK ORCA
LARCHANT(INRIA)
CLOUDS
MIDWAY
LEASES
PHOSPHORUS(ENST)
KOAN(IRISA)
MYOAN(IRISA)
GOTHIC(IRISA)
CRL
MUNGI
SAFFRES(CNAM)

Conclusion

- Convergence des Architectures


Multiprocesseur et Rseau
d'ordinateurs

=> Similitude des problmes Rsoudre


(KSR, Dash)
- Cohrence des donnes
=> Affaiblir la cohrence pour augmenter les performances
-Modle d'excution
=> Meilleur support du Paralllisme et des Objets
- Prise en compte de l'extensibilit

Rfrences Bibliographiques
Aspects Gnraux :
[1] Advanced Computer Architecture, Parallelism, Scalability,
Programmability. Kai Hwang. Mac Graw Hill.1993.
[2] Distributed Systems : concepts and Design. George Coulouris, Jean
Dollimore, Tim Kindberg. Addison Wesley 1994.
Multiprocesseurs
[3] Cache Coherence Protocols : Evaluation Using a Multiprocessor
Simulation Model. James Archibald, Jean-Loup Baer. ACM TOCS. V4. N4.
November 1986.

[4] Implementing A Cache Consistency Protocol. Katz, S. J. Eggers, D.A.


Wood, C.L. Perkins, R.G. Sheldon. Proceedings of the 12th ISOCA. IEEE. New York
1985.

[5] Firefly : A Multiprocessor Workstation. Charles P. Thacker, Lawrence


C, Stewart, Edwin Satterthwaite. IEEE TOC. V37.N8. August 1988.
Systmes faiblement coupls
[6] Memory Coherence in Shared Virtual Memory Systems. Kai Li, Paul
Hudak. ACM TOCS, V7, N4, November 1989.

Annexe
ASR-Donnes rparties

Rfrences Bibliographiques pour l'annexe :


[1] Advanced Computer Architecture, Parallelism, Scalability,
Programmability. Kai Hwang. Mac Graw Hill.1993.
[2] Unix Systems for Modern Architectures. C. Schimmel. Addison Wesley.
1994.

[3] Organisation et Conception des Ordinateurs. D. Patterson, J. Hennessy.


Dunod. 1994.

Pour plus d'informations consulter ces ouvrages. La rfrence [2] est celle qui a t
la plus utilise.

Principes fondamentaux des caches


1.
Un cache contient un sous-ensemble de la mmoire centrale. Il faut des
informations supplmentaires pour retrouver dans la mmoire ce qui est stock dans
le cache. Pour cela les donnes sont accompagnes d'une marque/tiquette "tag".
Un tag contient l'adresse de l'information archive dans le cache.
Lorsque le processeur effectue un accs une variable en mmoire, l'adresse
de cette information est envoye au cache, une recherche s'effectue alors,
l'information est retrouve grce sa marque, si elle est prsente dans le cache.
Si l'adresse ne correspond aucun tag, l'adresse est passe l'extrieur pour
tre servie soit par la mmoire principale, soit par un autre cache dans le cas d'un
multiprocesseur. Au retour, l'information est stocke dans le cache.
Lors d'un chargement du cache, un peu plus d'information que ce qui est
demand est ramen dans le cache (souvent un mot mmoire est accd mme si on a
besoin que d'un demi-mot). Pour charger le cache deux stratgies : la demande
ou prchargement.
L'unit mmoire de gestion d'un cache est une ligne ou un bloc (16 32
octets voire 128 et mme 256 octets pour mieux bnficier des effets de la localit),
il y a une marque associe chaque ligne.
Une ligne de cache c'est donc : tag + information
<bit de validit, bit de modification, [cl], adresse de l'information><information>

bit de validit : indique si la ligne contient des informations en service, valides


bit de modification : indique si la ligne a t modifie depuis son chargement
dans le cache, ce bit sert pour la mise jour d'autres caches ou de la mmoire
principale suivant la stratgie de cohrence choisie.
On parle de grain d'une ligne quand on parle de sa taille, il faut trouver un
bon rapport effet de localit/temps de transfert entre mmoire et cache. Quand le
grain est gros, la ligne peut tre dcoupe en sous-lignes. il reste toujours qu'une
marque par ligne.
2.
Le cache peut tre accd soit par l'adresse virtuelle d'une information, soit
par son adresse physique.
3.

Cache Intructions et Donnes : ensembles ou spars ?

Adresse
Donnes

Adresse
Donnes
Donnes
Processeur

Adresse
Instructions

Cache
Donnes

Donnes
Adresse Mmoire
Instructions Principale

Cache
Instructions Instructions Instructions

Ce shma est frquent


4.
Stratgie de Remplacement des blocs dans un cache quand il est plein :
FIFO : simple implanter
LRU ou pseudo LRU : plus efficace, rapide si bien implant, requiert
beaucoup d'information supplmentaire donc coteux
Le cache est trop petit pour pouvoir tenir compte de la notion de Working Set.
La stratgie de remplacement dpend de l'organisation du cache.
Il faut vider le cache : lors du remplacement d'une ligne, ou lors d'un
changement de contexte du au changement de processus lu.
5.
Politiques de mise jour de la mmoire suite modification(s) du cache. On
examine ici uniquement le cas monoprocesseur. Le cas multiprocesseur est vu dans
le cours.
Cas d'une donne dans le cache :
- mise jour immdiate "write through" ou "write-update": chaque criture
dans le cache, la mmoire est systmatiquement mise jour. Mmoire et cache
contiennent des donnes identiques, mais le bus est soumis au trafic des mises jour.
-mise jour retarde "write-back" ou "copy-back": la mmoire n'est mise jour
que quand une ligne modifie (bit ligne modifie positionn) quitte le cache. On
vite des transferts sur le bus, mais cache et mmoire peuvent contenir des donnes
diffrentes, et la mmoire principale qui sert gnralement de rfrence ne plus tre
jour. Lors du remplacement d'une ligne suite un dfaut cache, le dfaut ne peut
tre termin tant que la mmoire n'a pas t mise jour.
Cas d'une donne absente du cache :
Tout dpend si le matriel supporte l'criture avec allocation "write-allocate". Les
processeurs qui ne le supportent pas crivent directement dans la mmoire
principale.
Pour ceux qui possdent la stratgie write-allocate :

. soit l'information crire correspond une ligne entire du cache, dans ce cas on
fait de la place dans le cache avec recopie de la ligne vide vers la mmoire
principale si elle a t modifie et que la politique write-back est de rigueur
. soit la l'information crire est plus petite qu'une ligne de cache, dans ce cas on
fait de la place dans le cache comme au cas prcdent, et on lit la ligne de la
mmoire principale vers le cache, enfin on crit l'information dans la ligne qui vient
d'tre charge.
En gnral, write-allocate va avec write-back ... mais toute autre combinaison est
possible.
6. Les E/S malmnent la cohrence mmoire/cache. Deux possibilits : le contrleur
d'E/S change directement avec le cache (plutot write-back ?), ou le contrleur
d'E/S change uniquement avec la Mmoire Principale (plutot write-through ?)
7.
Gestion de la Multiprogrammation
. orient temps de rponse -> 1 programme la fois utilise tous les processeurs
. orient dbit -> plusieurs programmes utilisent en mme temps tous les processeurs
Multi-programmation => il faut un certain temps pour recharger
l'environnement d'un processus ds qu'il est lu, taux de multi-programmation
augmente =>miss ratio (taux de dfauts) augmente, d'o la ncssit d'avoir une
stratgie de dmarrage :
- dmarrage froid par vidage de tous les caches
- dmarrage chaud : on laisse agir l'algorithme de remplacement
Mode systme/mode utilisateur => un cache rserv l'excution du code
systme ? dpend du choix du type de multi-processeur symtrique/asymtrique
8. Translation des adresses virtuelles en adresses physiques : le cache peut contenir
une table de translation d'adresses (TLB - Translation Lookaside Buffer) qui
contient les correspondances <ad virtuelles-ad relles> les plus frquentes qu'utilise
le processeur.

Correspondance
Centrale

Cache

1. Caches correspondance directe :


N ligne tag
Adresse
fonction de hachage

index

Mmoire

donnes

0
1
2
3

Donnes
...

L'adresse de la donne est prise puis soumise une fonction de hachage qui retourne
un index. Cet index indique la position de la donne dans le cache si elle s'y trouve.
Plusieurs adresses peuvent produire le mme index, l'adresse demande est donc
compare avec l'tiquette contenue dans la ligne pointe par l'index. Deux adresses
qui donnent le mme numro de ligne sont dites de la mme couleur. Quand la
donne recherche est trouve dans le cache, elle est envoye au processeur. Sinon,
la mmoire centrale est sollicite pour fournir la donne.
Les algorithmes de hachage peuvent prendre une partie de l'adresse de la donne
pour retrouver la ligne dans le cache (TI MicroSPARC-> 2Ko de donnes, 128
lignes de 16 octets, mot adressable de 2 octets: les bits 10 4 pour choisir la ligne, et
les bits 3 0 pour le mot dans la ligne).

2. Caches associatifs
Adresse
index
fonction de hachage de
groupe

groupe ligne tag


...0
0
n
...0
1
n
...0
2
n

donnes

Donnes
...

1. hachage sur l'adresse de l'information => groupe d'information (set) contenu


dans une mmoire associative (set-associative memory)
2. accs parallles au groupe d'information slectionn
Toute la mmoire cache peut tre une seule mmoire associative :solution lente qui
cote cher (solution admissible pour la TLB 64 entres dans celle du SuperSPARC)

Caches virtuels
Ad.
Virt
CPU

Ad.
Virt

MMU

Cache
en ad.
Virtuelles

Ad.
Phys

Ad.
Phys
Mmoire
Principale

E/S

Donnes
Donnes

Donnes

Pour adresser le cache on se sert des adresses virtuelles utilises par le programme...
pas de translation d'adresse avant l'accs au cache, c'est donc plus rapide. Ce type de
cache pose des problmes, car c'est la MMU qui vrifie les droits d'accs d'un
programme une donne, hors celle-ci n'est sollicite que si il y a un dfaut dans le
cache.
Autres problmes :
ambiguit - le cache contient une donne rfrence par une adresse virtuelle
correcte, mais la correspondance adresse virtuelle/adresse physique a chang depuis
le moment o la donne a t charge dans le cache, il est alors difficile de conserver
la cohrence mmoire centrale/cache (cette situation peut se produire avec une mme
adresse virtuelle de deux processus diffrents).
alias - plusieurs adresses virtuelles rference la mme adresse physique, pour
chaque adresse virtuelle une ligne du cache peut contenir une version diffrente de la
donne rfrence (segments de mmoire partage d'Unix).
Le systme doit alors vider le cache pour toute opration qui risque de modifier la
cohrence cache/mmoire. Ceci peut tre frquent, et on peut perdre l'avantage
d'une gestion de cache base d'adresses virtuelles.
Le cache est vid ds qu'on change de processus lu puisque les adresses virtuelles
n'ont plus de sens. On perd ainsi le bnfice du principe de localit.

Caches virtuels avec identificateurs


Clef

La clef est spcifique au processus en excution


Ad.
Virt

CPU

Ad.
Virt

MMU

Cache
en ad.
Virtuelles

Ad.
Phys
Mmoire
Principale

Donnes
Donnes
Une clef qui identifie le processus de faon unique est ajoute chaque ligne du
cache dans l'tiquette.
Mme principe que le mcanisme de cache prcdent. Mais pour qu'un accs au
cache russisse, il faut que l'adresse virtuelle corresponde et que la clef du processus
concorde avec celle de l'tiquette. Le cache n'a plus besoin d'tre vid ds qu'on
change de processus.
Les deux techniques suivantes sont prfres pour les architectures multiprocesseur.

Caches virtuels avec


adresses physiques

marquage

par

MMU
Ad.
Virt

Ad.
Phys
Mmoire
Principale

CPU
Cache
Donnes en ad.
Virtuelles
Donnes
Tag sur Ad.
Physiques

Mme principe de fonctionnement qu'avec un cache virtuel. L'tiquette par contre


est fabrique partir de l'adresse physique et non de l'adresse virtuelle.
Recherche d'une ligne dans le cache, chaque accs :
- l'adresse virtuelle est transmise au cache et la MMU
- paralllement :
. la MMU calcule l'adresse physique partir de l'adresse virtuelle
. le cache calcule l'indexe pour rechercher la ligne accde
- la MMU envoie l'adresse physique obtebue au cache qui la compare celle qu'il
trouve dans l'tiquette
- si c'est bon, il fournit la donne sinon, elle est ramene depuis la mmoire
Avantages :
- Il n'y a plus d'ambiguite sur les donnes accdes dans le cache, l'adresse physique
est l pour les diffrencier.
- La MMU peut aussi vrifier les droit d'accs la page pendant le calcul d'adresse.
- Plus besoin de calculer l'adresse physique lors de l'jection d'une ligne du cache.
- Le changement de processus ne ncessite plus l'invalidation du cache.
Par contre, c'est plus lent cause du calcul par la MMU.

Translation d'adresse pendant la recherche dans le cache :

Ad Virtuelle de la
donne recherche

<31..11>

Dplacement
<3..0>
<12..4>

Slection du
mot
dans la ligne

Ad Physique de page
MMU

Donnes

Tag
index
Etiquette partir de
l'ad. physique de page
<31..11>

Comparaison

Cache

Dfaut ou Prsence
de la donne recherche

Caches physiques

Ad.
Virt

MMU

Ad.
Phys

Ad.
Phys
Cache
en ad.
Physiques

CPU

Mmoire
Principale

Donnes
Donnes
L'adresse physique est calcule chaque accs.
Type de cache rserv au caches hors puce processeur.

Le contrleur de cache- Snoopy Cache Controler


Snoopy ou encore Espion => hypothse de Machines MIMD bus :
CPU

CPU

espion

cache

espion

CPU

cache

...

espion

cache

Bus
E/S

Arbitre
de bus

Mmoire Commune

Que contient-il ? :
- un rpertoire des blocs contenus dans le cache (mmoire prive), avec des
informations supplmentaires sur l'tat des blocs, l'espion accde au contenu du
cache comme le fait le processeur.
- une TLB, cela dpend si le cache fonctionne sur la base d'adresses virtuelles ou
d'adresses physiques
- un traducteur qui calcule la correspondance <ad virtuelle- ad relle> qd celle-ci
n'est pas dans la TLB
[- Buffers lis aux critures : contient des invalidations ou des mises jour du cache,
mcanisme prioritaire par rapport aux accs du processeur]
[- Filtre des Invalidations -> permet de regrouper les invalidations identiques]

Rle :
Scruter le bus pour connatre les transactions effectues par les autres caches et ainsi
participer au maintien de la cohrence des copies des donnes.
Certaines informations sont partages entre le Processeur et son Espion. Si l'espion
travaille sur la mmoire prive, le processeur ne peut pas le faire :
- par exemple quand l'espion n'a pas termin d'acqurir une donne lie un accs
du processeur.
- autre exemple : conflit d'accs au rpertoire des blocs contenus dans la
mmoire prive. Une solution consisterait dupliquer le rpertoire => gain
vitesse, mais pb de cohrence du rpertoire.

Вам также может понравиться