set_mempolicy()
définit la politique de la mémoire NUMA du processus appelant,
qui consiste en un mode de politique et zéro ou plusieurs noeuds,
aux valeurs spécifiées dans les arguments
mode,
nodemask
et
maxnode.
Une machine NUMA a différents contrôleurs mémoire
à différentes distances de CPU particulières.
La politique de la mémoire définit à partir de quel noeud
la mémoire pour ce processus sera allouée.
Cet appel système définit la politique par défaut pour le processus.
La politique de processus gouverne l'allocation de page dans l'espace
adressable du processus en dehors des plages mémoire contrôlées par
une politique plus spécifique définie par
mbind(2).
La politique de processus par défaut contrôle également l'allocation
de toute page pour les fichiers projetés de mémoire,
projetés en utilisant l'appel système
mmap(2)
avec l'attribut
MAP_PRIVATE
et qui ne sont seulement lus (chargés) par la tâche,
et des fichiers projetés de mémoire, projetés en utilisant
mmap(2)
MAP_SHARED
quel que soit le type d'accès.
La polique n'est appliquée que lorsqu'une nouvelle page est allouée
pour le processus.
Pour la mémoire anonyme, cela est fait lorsque l'application accède
pour la première fois à la page.
L'argument
mode
doit spécifier l'un des attributs parmi
MPOL_DEFAULT,
MPOL_BIND,
MPOL_INTERLEAVE
et
MPOL_PREFERRED.
Toutes les modes excepté
MPOL_DEFAULT
nécessitent que l'appelant spécifie, dans le paramètre
nodemask,
un ou plusieurs modes.
nodemask
pointe vers un masque de bits d'identifiants de noeuds
qui contient jusqu'à
maxnode
bits.
La taille du masque de bits est arrondie au multiple supérieur de
sizeof(unsigned long),
mais le noyau n'utilisera que jusqu'à
maxnode
bits.
Une valeur NULL pour
nodemask
ou une valeur
maxnode
de zéro indique un ensemble vide de noeuds.
Si la valeur de
maxnode
est zéro,
l'argument
nodemask
est ignoré.
Le mode
MPOL_DEFAULT
est le mode par défaut et signifie que l'on alloue la mémoire localement,
c'est-à-dire dans le noeud de la CPU qui a déclenché l'allocation.
nodemask
doit être spécifié comme NULL.
Si le « noeud local » ne contient pas de mémoire, le système tentera
d'allouer de la mémoire à partir d'un noeud « à proximité ».
Le mode
MPOL_BIND
définit une politique stricte qui restreint l'allocation mémoire
aux noeuds spécifiés dans
nodemask.
Si
nodemask
indique plus d'un noeud, les allocations de pages se feront d'abord
à partir du noeud dont l'identifiant numérique est le plus petit
jusqu'à ce que ce noeud ne contienne plus de mémoire libre.
Les allocations se feront ensuite à partir du node dont l'identifiant
est le prochain plus grand spécifié dans
nodemask
et ainsi de suite jusqu'à ce que plus un seul noeud indiqué ne contienne
de mémoire libre.
Il n'y aura pas d'allocation de pages à partir de noeuds non indiqués dans
nodemask.
MPOL_INTERLEAVE
entrelace les allocations de pages à travers les noeuds spécifiés dans
nodemask
dans l'ordre de l'identifiant numérique de noeud.
Cela optimise la bande passante au lieu de la latence en étalant
les accès pages et mémoires à ces pages à travers plusieurs noeuds.
Toutefois, les accès à une seule page seront limités à la bande
passante d'un seul noeud.
Le mode
MPOL_PREFERRED
définit le noeud préféré pour l'allocation.
Le noyau essayera d'allouer des pages d'abord à partir de ce noeud
et se repliera sur des noeuds voisins s'il ne reste que peu de mémoire
libre sur le noeud préféré.
Si
nodemask
spécifie plus d'un identifiant de noeud, le premier noeud du masque
sera choisi comme le noeud préféré.
Si les arguments
nodemask
et
maxnode
spécifient l'ensemble vide, la mémoire est allouée sur le noeud de la CPU
qui a déclenché l'allocation (comme pour
MPOL_DEFAULT).
La politique mémoire de processus est préservée au travers d'un
execve(2),
et est héritée par les processus fils créés avec
fork(2)
ou
clone(2).