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.
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> ».