Provided by: manpages-fr-dev_3.65d1p1-1_all 

NOM
mbind - Définir la politique mémoire pour une zone de mémoire
SYNOPSIS
#include <numaif.h>
int mbind(void *addr, unsigned long len, int mode,
unsigned long *nodemask, unsigned long maxnode,
unsigned flags);
Effectuez l'édition des liens avec l'option -lnuma.
DESCRIPTION
mbind() configure la politique mémoire NUMA, qui consiste en un mode de politique et zéro ou plusieurs
nœuds, pour l'intervalle mémoire démarrant à addr et s'étalant sur len octets. La politique mémoire
définit à partir de quel nœud la mémoire sera allouée.
Si la plage mémoire spécifiée par les paramètres addr 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, projection créé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 pages seront allouées conformément à la politique
spécifiée seulement si l'allocation de pages est provoquée par le processus 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.
Le paramètre 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 nœuds auxquels s'appliquent le mode.
Le paramètre mode peut aussi inclure un drapeau de mode optionnel. Les drapeaux de mode pris en charges
sont :
MPOL_F_STATIC_NODES (depuis Linux 2.6.26)
Un paramètre nodemask non vide indique des identifiants des nœuds physiques. Linux ne réassocie
pas nodemask quand le processus change de contexte d'ensemble de processeurs ou après une
modifications de l'ensemble de nœuds autorisés pour le contexte de l'ensemble de processeurs en
cours pour le processus.
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 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 nœuds. Si
la valeur de maxnode est zéro, l'argument nodemask est ignoré. Quand un nodemask est exigé, il doit
contenir au moins un nœud de connecté, autorisés dans le contexte de l'ensemble de processeurs du
processus appelant (à moins que le drapeau MPOL_F_STATIC_NODES ne soit fourni) et doit contenir de la
mémoire.
Le mode MPOL_DEFAULT demande à ce que toute politique n'étant pas une politique par défaut soit retirée,
ce qui restaure le comportement par défaut. 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 alloue des pages sur le nœud de la CPU qui a déclenché l'allocation.
Pour MPOL_DEFAULT, les paramètres nodemask et maxnode doivent spécifier l'ensemble vide de nœuds.
Le mode MPOL_BIND spécifie une politique stricte qui restreint l'allocation mémoire aux nœuds indiqué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.
Le mode MPOL_INTERLEAVE spécifie que les allocations de pages sont entrelacées à travers l'ensemble de
nœuds spécifiés dans nodemask. Cela optimise la bande passante au lieu de la latence en étalant les pages
et l'accès mémoires à ces pages à travers plusieurs nœuds. Pour être efficace, la zone mémoire doit être
relativement grande, au moins 1 Mo ou plus avec un modèle d'accès assez uniforme. Les accès à une unique
page de la zone seront toujours limités à la bande passante d'un seul nœud.
MPOL_PREFERRED définit le nœud préféré pour les allocations. Le noyau essaiera d'abord d'allouer sur ce
nœud, avant de ce rabattre sur d'autres nœuds si celui‐ci n'a plus assez de mémoire libre. Si nodemask
précise plus d'un identifiant de nœud, le premier nœud du masque sera choisi comme le nœud préféré. Si
les paramètres nodemask et maxnode indique un ensemble vide, la mémoire est allouée sur le nœud du CPU
qui a déclenché l'allocation. C'est la seule façon d'indiquer une « allocation locale » pour une plage
mémoire avec mbind().
Si l'option MPOL_MF_STRICT est passée dans flags et si mode n'est pas MPOL_DEFAULT, l'appel échoue avec
l'erreur EIO si les pages existantes dans la projection ne suivent pas la politique.
Si MPOL_MF_MOVE est passé dans flags, le noyau essaiera de déplacer toutes les pages de la projection
pour qu'elles suivent la politique. Les pages partagées avec d'autres processus ne sont pas déplacées. Si
MPOL_MF_STRICT est également indiqué, l'appel échouera avec l'erreur EIO si certaines pages ne peuvent
pas être déplacées.
Si MPOL_MF_MOVE_ALL est indiqué dans flags, alors le noyau essaiera de déplacer toutes les pages de la
projection, même si d'autres processus les utilisent. Le processus appelant doit être privilégié (avoir
la capacité CAP_SYS_NICE) pour utiliser cette option. Si MPOL_MF_STRICT est également utilisé, l'appel
renverra l'erreur EIO si certaines pages ne peuvent pas être déplacées.
VALEUR RENVOYÉE
S'il réussit, mbind() renvoie zéro. En cas d'erreur, il renvoie -1 et remplit errno avec la valeur
d'erreur.
ERREURS
EFAULT Une partie ou toute 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 projeté dans l'intervalle mémoire spécifié.
EINVAL Une valeur non valable a été spécifiée pour flags ou mode ; ou addr + len est plus petite que
addr ; ou addr 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 nœuds nodemask est vide. Ou, maxnode dépasse une limite imposée par le noyau. 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 aucun des identifiants de nœuds spécifiés par nodemask ne sont connectés
et autorisés dans le contexte de l'ensemble de processeurs du processus appelant, ou aucun des
nœuds spécifiés ne contient de mémoire. Ou le paramètre mode indiquait à la fois
MPOL_F_STATIC_NODES et MPOL_F_RELATIVE_NODES.
EIO MPOL_MF_STRICT a été utilisé et une page existante était déjà sur un nœud ne suivant pas la
politique ; ou soit MPOL_MF_MOVE soit 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 Pas assez de mémoire pour le noyau.
EPERM Le paramètre flags inclus l'attribut MPOL_MF_MOVE_ALL et l'appelant n'a pas le privilège
CAP_SYS_NICE.
VERSIONS
L'appel système mbind() a été ajouté au noyau Linux dans la version 2.6.7.
CONFORMITÉ
Cet appel système est spécifique à Linux.
NOTES
Pour des informations sur la prise en charge par des bibliothèques, consultez numa(7).
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.
Le mode MPOL_DEFAULT peut avoir des effets différents sur mbind() et sur set_mempolicy(2). Lorsque
MPOL_DEFAULT est spécifié pour set_mempolicy(2), la politique du processus est remise à la politique par
défaut du système ou l'allocation locale. 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, ce qui peut éventuellement remettre une politique autre que
celle par défaut. Pour choisir explicitement une « allocation locale » pour une plage mémoire, spécifiez
mode avec MPOL_PREFERRED avec un ensemble vide de nœuds. Cette méthode fonctionnera aussi avec
set_mempolicy(2).
La gestion de politique pour les pages immenses a été ajoutée dans le noyau 2.6.16. Pour que la politique
d'entrelacement soit efficace sur les projections de pages immenses, la taille de la zone mémoire doit
être au moins de dizaines de mégaoctets.
MPOL_MF_STRICT est ignoré sur les projections de pages immenses.
MPOL_MF_MOVE et MPOL_MF_MOVE_ALL ne sont disponibles qu'à partir de Linux 2.6.16.
VOIR AUSSI
get_mempolicy(2), getcpu(2), mmap(2), set_mempolicy(2), shmat(2), shmget(2), numa(3), cpuset(7), numa(7),
numactl(8)
COLOPHON
Cette page fait partie de la publication 3.65 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/>.
Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal
<http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de
Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
un rapport de bogue sur le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
<section> <page_de_man> ».
Linux 15 août 2008 MBIND(2)