MBIND(2)

NOM
mbind - Configurer la politique mémoire pour un intervalle mémoire

SYNOPSIS
#include <numaif.h>

int mbind(void *start, unsigned long len, int mode,
          unsigned long *nodemask, unsigned long maxnode,
          unsigned flags);

Lier avec -lnuma

DESCRIPTION
mbind() configure la politique mémoire NUMA, qui consiste en un mode de politique et zéro ou plusieurs noeuds, pour l'intervalle mémoire démarrant à start et s'étalant sur len octets. La mémoire d'une machine NUMA est divisée en plusieurs noeuds. La politique mémoire définit à partir de quel noeud la mémoire sera allouée. Si la plage mémoire spécifiée par les arguments start et len inclut une région « anonyme » de mémoire (c'est-à-dire une région de mémoire créée avec l'appel système mmap(2) et l'attribut MAP_ANONYMOUS) ou un fichier de mémoire projetée, projetée en utilisant l'appel système mmap(2) et l'attribut MAP_PRIVATE, les pages seront seulement allouées conformément à la politique spécifiée lorsque l'application écrit [stocke] dans la page. Pour les régions anonymes, un accès initial en lecture utilisera une page partagée du noyau contenant des zéros. Pour un fichier projeté avec MAP_PRIVATE, un accès initial en lecture allouera des pages conformément à la politique de processus du processus qui a fait que cette page ait été allouée. Cela peut ne pas être le processus qui a appelé mbind(). La politique spécifiée sera ignorée pour toute projection MAP_SHARED dans la plage mémoire spécifiée. Plutôt, les pages seront allouées conformément à la politique de processus du processus qui a fait que la page ait été allouée. Cela peut ne pas être le processus qui a appelé mbind(). Si la plage de mémoire spécifiée inclut une région de mémoire partagée créée avec l'appel système shmget(2) et attachée avec l'appel système shmat(2), les pages allouées pour la région de mémoire anonyme ou partagée seront allouées conformément à la politique spécifiée, sans se soucier de quel processus attaché au segment de mémoire partagé a provoqué l'allocation. Si toutefois la région de mémoire partagée a été créée avec l'attribut SHM_HUGETLB, les grosses (huge) pages seront allouées conformément à la politique spécifiée seulement si l'allocation de pages est provoquée par la tâche qui a appelé mbind() pour cette région. Par défaut, mbind() n'a d'effet que sur les nouvelles allocations ; si des pages dans l'intervalle ont déjà été accédées avant de configurer la politique, alors la politique n'a pas d'effet. Ce comportement par défaut peut être écrasé par les attributs MPOL_MF_MOVE et MPOL_MF_MOVE_ALL décrits plus loin. L'argument mode doit spécifier l'un des attributs parmi MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE et MPOL_PREFERRED. Toutes les modes de politique excepté MPOL_DEFAULT nécessitent que l'appelant spécifie, dans le paramètre nodemask, les noeuds auxquels s'appliquent le mode. nodemask pointe sur un masque de bits qui contient jusqu'à maxnode bits. La taille du masque de bits est arrondi 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 indique que la politique par défaut sera utilisée. Lorsqu'il est appliqué à une plage mémoire via mbind(), cela signifie d'utiliser la politique du processus qui peut être modifiée avec set_mempolicy(2). Si le mode de la politique de processus est également MPOL_DEFAULT, la politique par défaut du système sera utilisée. La politique par défaut du système allouera des pages sur le noeud de la CPU qui a déclenché l'allocation. Pour MPOL_DEFAULT, les arguments nodemask et maxnode doivent spécifier l'ensemble vide de noeuds. Le mode MPOL_BIND spécifie une politique stricte qui restreint l'allocation mémoire aux noeuds indiqué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. Le mode MPOL_INTERLEAVE spécifie que les allocations de pages sont entrelacées à travers l'ensemble de noeuds spécifiés dans nodemask. Cela optimise la bande passante au lieu de la latence en étalant les accès pages et mémoires à ces pages à travers plusieurs noeuds. Pour être efficace, la zone mémoire doit être relativement grande, au moins 1 Mo ou plus avec un patron d'accès assez uniforme. MPOL_PREFERRED définit la politique comme étant celle du noeud préféré. Le noyau essayera d'allouer la mémoire à partir de noeud préféré et se repliera sur d'autres noeuds 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. C'est la seule façon d'indiquer « allocation locale » pour une plage mémoire avec mbind(2). Si l'attribut MPOL_MF_STRICT est passé dans flags et si la politique n'est pas MPOL_DEFAULT, l'appel échouera avec l'erreur EIO s'il existe des pages dans la projection qui ne suivent pas la politique. Si MPOL_MF_MOVE est spécifié dans flags, le noyau tentera de déplacer toutes les pages existantes de la plage mémoire afin qu'elles suivent la politique. Les pages qui sont partagées avec d'autres processus ne sont pas déplacées. Si MPOL_MF_STRICT est également spécifié, l'appel échouera avec l'erreur EIO si certaines pages ne peuvent pas être déplacées. Si MPOL_MF_MOVE_ALL est passé dans flags, le noyau tentera de déplacer toutes les pages existantes de la plage même si d'autres processus utilisent ces pages. Le processus appelant doit être privilégié (CAP_SYS_NICE) pour utiliser cet attribut. Si MPOL_MF_STRICT est également spécifié, l'appel échouera avec l'erreur EIO si certaines pages ne peuvent pas être déplacées.

VALEUR RENVOYÉE
S'il réussit, mbind() 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. Ou il y a un trou non mappé dans l'intervalle mémoire spécifié

EINVAL
    Une valeur invalide a été spécifiée pour flags ou mode ; ou start + end est plus petite que start ; ou start n'est pas un multiple de la taille de page système. Ou, mode est MPOL_DEFAULT et nodemask spécifiait un ensemble non vide ; ou mode était MPOL_BIND ou MPOL_INTERLEAVE et le masque de noeuds nodemask est vide. Ou, maxnode specifies more than a page worth of bits. Ou, nodemask spécifie un ou plusieurs identifiants de noeud qui sont plus grands que l'identifiant maximum de noeud pris en charge, ou qui ne sont pas autorisés dans le contexte de la tâche appelante. Ou aucun des identifiants de noeuds spécifiés par nodemask ne sont connectés, ou aucun des noeuds spécifiés ne contient de mémoire.

EIO MPOL_MF_STRICT était spécifié et une page existante était déjà dans un noeud qui ne suit pas la politique ; ou MPOL_MF_MOVE ou MPOL_MF_MOVE_ALL a été spécifié et le noyau n'a pas été capable de déplacer toutes les pages existantes dans la plage.

ENOMEM
    Manque de mémoire.

EPERM
    L'argument flags inclus l'attribut MPOL_MF_MOVE_ALL et l'appelant n'a pas le privilège CAP_SYS_NICE.

CONFORMITÉ
Cet appel est spécifique à Linux.

NOTES
La politique NUMA n'est pas supportée sur les plages de fichiers de mémoire projetée qui ont été projetées avec l'attribut MAP_SHARED. MPOL_MF_STRICT est ignoré pour les projections de pages énormes (Ndt : huge). Le mode MPOL_DEFAULT, a des effets différents sur mbind(2) et sur set_mempolicy(2). Lorsque MPOL_DEFAULT est spécifié pour une plage de mémoire utilisant mbind(), toutes les pages allouées par la suite pour cette plage utiliseront la politique du processus telle qu'elle a été définie par set_mempolicy(2). Cela supprime de manière effective la politique explicite de la plage spécifiée. Pour choisir « allocation locale » pour une plage mémoire, spécifiez mode avec MPOL_PREFERRED avec un ensemble vide de noeuds. Cette méthode fonctionnera aussi avec set_mempolicy(2).

  Versions et prise en charge bibliothèque
Les appels système mbind(), get_mempolicy(2) et set_mempolicy(2) ont été ajoutés au noyau Linux dans la version 2.6.7. Ils ne sont disponibles que sur les noyaux compilés avec l'option de configuration CONFIG_NUMA. Vous devez lier avec -lnuma pour obtenir les définitions des appels système. libnuma et l'entête <numaif.h> nécessaire sont disponibles dans le paquet numactl. Ces appels système ne devraient pas être utilisés directement. À la place, l'utilisation de l'interface de niveau supérieur fournie par les fonctions numa(3) du paquet numactl est recommandée. Le paquet numactl est disponible à ftp://ftp.suse.com/pub/people/ak/numa/. Le paquet est également inclus dans certaines distributions Linux. Certaines distributions diffusent la bibliothèque de développement et l'entête dans un paquet numactl-devel séparé. Le support de la politique pour les pages énormes a été ajouté dans la version 2.2.16. Pour que la politique d'entrelacement soit efficace sur les projections de pages énormes, la mémoire affectée par la politique doit être de plusieurs dizaines de mega-octets ou plus. MPOL_MF_MOVE et MPOL_MF_MOVE_ALL ne sont disponibles que depuis Linux 2.6.16.

VOIR AUSSI
get_mempolicy(2), mmap(2), set_mempolicy(2), shmat(2), shmget(2), numa(3), numactl(8)

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 21 juillet 2006 et révisée le 22 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 mbind ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.