SET_MEMPOLICY(2)

NOM
set_mempolicy - Configurer la politique de la mémoire NUMA par défaut pour un processus et ses fils

SYNOPSIS
#include <numaif.h>

long set_mempolicy(int mode, const unsigned long *nodemask,
                   unsigned long maxnode);

Effectuez l'édition des liens avec l'option -lnuma.

DESCRIPTION
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 nœuds, 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 nœud 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 politique 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. Tous les modes sauf MPOL_DEFAULT nécessitent que l'appelant spécifie, dans le paramètre nodemask, un ou plusieurs modes. L'argument mode peut aussi contenir des attributs optionnels. Les valeurs possibles sont :

MPOL_F_STATIC_NODES (depuis Linux 2.6.26)
    Une valeur non vide de nodemask indique des identifiants de nœuds physiques. Linux ne va pas recalculer le nodemask quand le processus est déplacé vers un contexte différent, ni quand l'ensemble des nœuds autorisés par le contexte du processus actuel est modifié.

MPOL_F_RELATIVE_NODES (depuis Linux 2.6.26)
    Un paramètre nodemask non vide indique des identifiants des nœuds relatifs à l'ensemble des identifiants de nœuds autorisés pour le contexte de l'ensemble de processeurs en cours pour le processus.

nodemask pointe vers un masque de bits d'identifiants de nœuds 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 nœuds. Si la valeur de maxnode est zéro, l'argument nodemask est ignoré. Quand une valeur de nodemask est nécessaire, elle doit contenir au moins un nœud actuellement disponible et autorisé par le contexte du processus actuel (à moins que l'attribut MPOL_F_STATIC_NODES ne soit spécifié), et qui contient de la mémoire. Si l'attribut MPOL_F_STATIC_NODES est mis dans mode et si un nodemask nécessaire ne contient aucun nœud autorisé par le contexte du processus actuel, la politique pour la mémoire est forcée à allocation locale (local allocation). La politique sera réellement modifiée, sauf si le contexte du processus actuel contient au moins un des nœuds spécifiés par nodemask. 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 nœud de la CPU qui a déclenché l'allocation. nodemask doit être spécifié comme NULL. Si le « nœud local » ne contient pas de mémoire, le système tentera d'allouer de la mémoire à partir d'un nœud « à proximité ». Le mode MPOL_BIND définit une politique stricte qui restreint l'allocation mémoire aux nœuds spécifiés dans nodemask. Si nodemask indique plus d'un nœud, les allocations de pages se feront d'abord à partir du nœud dont l'identifiant numérique est le plus petit jusqu'à ce que ce nœud 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 nœud indiqué ne contienne de mémoire libre. Il n'y aura pas d'allocation de pages à partir de nœuds non indiqués dans nodemask. MPOL_INTERLEAVE entrelace les allocations de pages à travers les nœuds spécifiés dans nodemask dans l'ordre de l'identifiant numérique de nœud. Cela optimise la bande passante au lieu de la latence en étalant les accès pages et mémoires à ces pages à travers plusieurs nœuds. Toutefois, les accès à une seule page seront limités à la bande passante d'un seul nœud. Le mode MPOL_PREFERRED définit le nœud préféré pour l'allocation. Le noyau essayera d'allouer des pages d'abord à partir de ce nœud et se repliera sur des nœuds voisins s'il ne reste que peu de mémoire libre sur le nœud préféré. Si nodemask spécifie plus d'un identifiant de nœud, le premier nœud du masque sera choisi comme le nœud préféré. Si les arguments nodemask et maxnode spécifient l'ensemble vide, la mémoire est allouée sur le nœud 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).

VALEUR RENVOYÉE
S'il réussit, set_mempolicy() renvoie 0 ; s'il échoue, il renvoie -1 et écrit errno en conséquence.

ERREURS

EFAULT
    Une partie de la plage mémoire spécifiée par nodemask et maxnode pointe en dehors de votre espace d'adressage accessible.

EINVAL
    mode n'est pas valide. Ou, mode est MPOL_DEFAULT et nodemask n'est pas vide, ou mode est MPOL_BIND ou MPOL_INTERLEAVE et nodemask est vide. Ou, maxnode spécifie plus qu'une page de bits. Ou, nodemask spécifie un ou plusieurs identifiants de nœud qui sont plus grands que l'identifiant maximum de nœud pris en charge, ou qui ne sont pas autorisés dans le contexte de la tâche appelante. Ou aucun des identifiants de nœuds spécifiés par nodemask ne sont connectés, ou aucun des nœuds spécifiés ne contient de mémoire.

ENOMEM
    Pas assez de mémoire pour le noyau.

VERSIONS
L'appel système set_mempolicy() a été ajouté au noyau Linux dans la version 2.6.7.

CONFORMITÉ
Cet appel système est spécifique à Linux.

NOTES
La politique du processus n'est pas mémorisée si la page est délogée. Lorsqu'une telle page est réimportée en mémoire, elle utilisera la politique du processus ou de la plage mémoire qui était effective au moment où la page a été allouée. Pour des informations sur la prise en charge par des bibliothèques, consultez numa(7).

VOIR AUSSI
get_mempolicy(2), getcpu(2), mbind(2), mmap(2), numa(3), cpuset(7), numa(7), numactl(8)

COLOPHON
Cette page fait partie de la publication 3.70 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Alain Portal <http://manpagesfr.free.fr/> (2006-2008).

Veuillez signaler toute erreur de traduction en écrivant à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».