wiki:replication_distribution

Version 4 (modified by alain, 8 years ago) (diff)

--

Politique de réplication / distribution

[Outline]

La politique de réplication / distribution vise deux objectifs: renforcer la localité, et SURTOUT minimiser la contention.

  • Pour les informations read-only (segments de type CODE), on les réplique dans tous les clusters où elles sont utilisées.
  • Pour les données non partagées (segments de type STACK) on les place dans le même cluster que le thread utilisateur.
  • Pour les données partagées (segments de type DATA, HEAP, MMAP), on cherche à les distribuer le plus uniformément possible dans tous les clusters pour éviter la contention.

La technique générale permettant à l'OS de contrôler le placement et la réplication des informations sur les bancs mémoire physiques est la mémoire virtuelle paginée.

1) segments pour un processus utilisateur

Un vseg désigne une zone mémoire contigüe dans l’espace virtuel d’un processus, auxquels sont attachés certains attributs (droit d’accès, politique de réplication/distribution dans les différents clusters, cachabilité, etc.).

Pour chaque processus P, le descripteur du processus, et certaines structures qu’il contient telles que la table des pages (PT) et la liste des vsegs (VSL) sont répliquées dans tous les cluster qui contiennent au moins un thread de P.

  • Un vseg est public quand il peut être accédé par n’importe quel thread du processus, quel que soit le cluster dans lequel le thread s’exécute. Il est private quand il n’est accédé que par les threads exécutant dans le même cluster que le cluster ou est mappé le vseg.
  • Un vseg private est entièrement mappé dans la mémoire physique du cluster K dans lequel il est accessible. Il est enregistré dans liste des segments et dans la table des pages du cluster K, mais pas dans les autres clusters.
  • Un vseg public est enregistré dans la liste des segments et dans la table des pages de tous les clusters actifs (i.e. tous les clusters qui contiennent un thread de P). Pour maintenir la cohérence entre les tables de pages, chaque vseg public possède un cluster de référence, qui est le cluster propriétaire du processus (i.e. le cluster Z où a été créé le processus). Les réplicas du descripteurs de processus (et les tables associées) autres que celui contenu dans le cluster de référence peuvent être considérées comme des caches read-only.
  • Un vseg peut être localised (toutes les pages du vseg sont mappées dans le même cluster), ou distributed (différentes pages du même vseg sont mappées dans différents clusters en utilisant par exemple les bits de poids faibles comme clé de distribution). Un vseg private est toujours localised.

Il existe sept types de vsegs, correspondant à des politiques de réplication/distribution différentes :

type nombre commentaire
CODE private localised un par cluster actif mêmes adresses virtuelles, même contenu
STACK private localised un par thread dans le cluster hébergeant le thread
DATA public distributed un par processus données globales partagées
HEAP public distributed un par processus utilisé pour le malloc() standard
REMOTE public localised un par cluster actif utilisé par le remote_malloc(x,y)
FILE public localised un par MMAP(file) dans le cluster contenant le fichier file
ANON public distributed un par MMAP(anon) équivalent au type HEAP

2) pour le noyau

Les différentes instances du noyau ne travaillant qu’en adressage physique, les segments kernel sont définis dans l’espace d’adressage physique.

  • un segment kernel est private quand il ne peut être accédé que par l’instance locale du noyau. Il est public quand il peut être accédé par n’importe quel instance du noyau.

Dans un segment public, le noyau peut définir des structures répliquées homologues. Si N est le nombre de clusters, une structure répliquées homologue est un ensemble de N structures identiques, de longueur fixe, implantées à des adresses physiques ne différant entre elles que par les bits de poids fort définissant les coordonnées du cluster.

On identifie (pour l’instant) les segments suivants

  • KDATA : private
  • KCODE : private
  • KSTACK : private
  • KHEAP : private
  • SHARED : public