Provided by: manpages-fr-dev_4.13-4_all 

NOM
madvise - Configurer l'utilisation de la mémoire
SYNOPSIS
#include <sys/mman.h>
int madvise(void *addr, size_t length, int advice);
Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros(7)) :
madvise() :
Depuis la glibc 2.19 :
_DEFAULT_SOURCE
Jusqu'à la version 2.19 incluse de la glibc :
_BSD_SOURCE
DESCRIPTION
L'appel système madvise() est utilisé pour conseiller ou orienter le noyau quant à la plage d'adresses
commençant à addr et de taille length octets. Dans la plupart des cas, le but de tels conseils est
d'améliorer les performances du système ou d'une application.
Initialement, l'appel système gérait un ensemble de valeurs de advice « conventionnelles », disponibles
aussi sur d'autres implémentations (notez toutefois que madvise() n'est pas spécifié dans POSIX). Par
conséquent, un certain nombre de valeurs de advice spécifiques à Linux ont été ajoutées.
Valeurs de conseil conventionnelles
Les valeurs de advice (conseil) listées ci-dessous permettent à une application d'indiquer au noyau
l'utilisation qu'elle compte faire de certaines zones de mémoire partagée ou projetée de façon à ce que
le noyau puisse choisir les techniques de lecture anticipée et de mise en cache appropriées. Ces valeurs
advice ne modifient pas la sémantique de l'application (sauf dans le cas de MADV_DONTNEED), mais peuvent
avoir un impact sur ses performances. Toutes les valeurs de advice listées ici ont un pendant dans la
fonction posix_madvise(3) spécifiée par POSIX et elles ont la même signification, sauf MADV_DONTNEED.
Le conseil est spécifié par le paramètre advice qui peut être un des suivants :
MADV_NORMAL
Pas de traitement particulier. Il s'agit du comportement par défaut.
MADV_RANDOM
Prévoir des références de page dans un ordre aléatoire. (Ainsi, la lecture anticipée sera moins
utile qu'elle ne l'est en général.)
MADV_SEQUENTIAL
Prévoir des références de page dans un ordre séquentiel. (Aussi, les pages d'une plage donnée
peuvent être systématiquement lues par anticipation, et peuvent être libérées rapidement après
avoir été accédées.)
MADV_WILLNEED
Prévoir un accès dans un futur proche. (Ainsi, lire quelques pages de façon anticipée peut être
une bonne idée.)
MADV_DONTNEED
Ne pas s'attendre à un accès dans un futur proche (quant au temps, l'application est finie avec la
plage donnée, pour que le noyau puisse libérer des ressources qui lui sont associées).
Après une opération MADV_DONTNEED réussie, la sémantique de l'accès en mémoire dans la région
indiquée est modifiée : les accès suivants des pages réussiront, mais provoqueront un nouveau
remplissage de la mémoire soit avec le contenu à jour du fichier transposé sous-jacent (pour les
tableaux de fichiers partagés, ceux anonymes partagés, les techniques basées sur shmem telles que
les segments de mémoire partagée de System V), soit avec les pages remplies de zéro à la demande
pour les tableaux privés anonymes.
Remarquez qu'appliquée à des tableaux partagés, MADV_DONTNEED pourrait ne pas aboutir à une
libération immédiate des pages dans la plage. Le noyau est libre de retarder la libération des
pages jusqu'au bon moment. La mémoire résidente (resident set size, ou RSS) du processus appelant
sera par contre immédiatement réduite.
MADV_DONTNEED ne peut pas s'appliquer à des pages verrouillées, d'immenses pages TLB ou à des
pages VM_PFNMAP (les pages marquées par l'attribut VM_PFNMAP interne au noyau sont des régions de
mémoire spéciales non gérées par le sous-système de mémoire virtuelle. De telles pages sont
généralement créées par des pilotes de périphérique transposant les pages dans l'espace
utilisateur).
Valeurs de conseil spécifiques à Linux
Les valeurs advice suivantes spécifiques à Linux n'ont pas d'équivalent dans le posix_madvise(3) spécifié
par POSIX et peuvent en avoir ou pas dans l'interface madvise() disponible sur d'autres implémentations.
Notez que certaines de ces opérations modifient la sémantique des accès en mémoire.
MADV_REMOVE (depuis Linux 2.6.16)
Libération jusqu'à une plage donnée de pages et son stockage de repli associé. Cela revient à
percer un trou dans la plage d'octets correspondante du stockage de secours (voir fallocate(2)).
Les accès suivants à la plage d'adresses indiquée verront des octets contenant zéro.
Le plage d'adresses indiquée doit être transposée partagée et accessible en écriture. Cet attribut
ne peut pas être appliqué à des pages verrouillées, d'immenses pages TLB ou à des pages VM_PFNMAP.
Dans l'implémentation initiale, seul tmpfs(5) prenait en charge MADV_REMOVE ; mais depuis Linux
3.5, tous les systèmes de fichiers qui prennent en charge le mode FALLOC_FL_PUNCH_HOLE de
fallocate(2) gèrent également MADV_REMOVE. Hugetlbfs échoue avec l'erreur EINVAL et d'autres
systèmes de fichiers échouent avec l'erreur EOPNOTSUPP.
MADV_DONTFORK (depuis Linux 2.6.16)
Ne pas rendre les pages de cette plage disponibles à l'enfant après un fork(2). Cela est utile
pour empêcher la sémantique de copie à l'écriture de changer l'emplacement physique d'une page si
le parent y écrit après un fork(2) (de tels déplacements posent des problèmes si le matériel
accède directement à la page (DMA)).
MADV_DOFORK (depuis Linux 2.6.16)
Annuler l'effet de MADV_DONTFORK et restaurer le comportement par défaut, où une projection en
mémoire est héritée après un fork(2).
MADV_HWPOISON (depuis Linux 2.6.32)
Empoisonner les pages dans la plage indiquée par addr et length et traiter les références
ultérieures à ces pages comme une corruption de la mémoire matérielle. Cette opération n'est
disponible que pour les processus privilégiés (CAP_SYS_ADMIN). À la suite de cette opération, le
processus appelant peut recevoir un SIGBUS et la page devenir non affectée.
Cette fonctionnalité est conçue pour tester du code de gestion des erreurs de mémoire ; elle n'est
disponible que si le noyau a été configuré avec CONFIG_MEMORY_FAILURE.
MADV_MERGEABLE (depuis Linux 2.6.32)
Activer la fusion des pages identiques par le noyau (Kernel Samepage Merging, ou KSM) pour les
pages dans la plage spécifiée par addr et length. Le noyau analyse régulièrement les régions de la
mémoire utilisateur qui ont été marquées comme pouvant être fusionnées, à la recherche de pages
avec un contenu identique. Elles sont remplacées par une page unique protégée en écriture (qui
sera automatiquement recopiée si un processus veut plus tard modifier le contenu de la page). KSM
ne fusionne que les pages anonymes privées (consultez mmap(2)).
La fonctionnalité KSM est prévue pour des applications qui génèrent de nombreuses instances avec
les mêmes données (comme les systèmes de virtualisation tels que KVM). Cela consomme beaucoup de
puissance de calcul ; utilisez-la prudemment. Voir le fichier Documentation/admin-guide/mm/ksm.rst
des sources du noyau Linux pour plus de détails.
Les opérations MADV_MERGEABLE et MADV_UNMERGEABLE ne sont disponibles que si le noyau a été
configuré avec CONFIG_KSM.
MADV_UNMERGEABLE (depuis Linux 2.6.32)
Annuler l'effet d'une opération MADV_MERGEABLE précédente sur la plage d'adresses spécifiée ; KSM
annule la fusion sur les pages qui avaient été fusionnées dans la plage spécifiée par addr et
length.
MADV_SOFT_OFFLINE (depuis Linux 2.6.33)
Déconnecter en douceur les pages dans la plage spécifiée par addr et length. La mémoire de chaque
page dans la plage spécifiée est préservée (lors du prochain accès, le même contenu sera visible,
mais dans une nouvelle page physique), et la page originale est déconnectée (ce qui signifie
qu'elle n'est plus utilisée, et plus prise en compte par les mécanismes habituels de gestion de la
mémoire). L'effet de l'opération MADV_SOFT_OFFLINE est invisible au processus appelant
(c'est-à-dire qu'elle n'en change pas la sémantique).
Cette fonctionnalité est conçue pour tester du code de gestion des erreurs de mémoire ; elle n'est
disponible que si le noyau a été configuré avec CONFIG_MEMORY_FAILURE.
MADV_HUGEPAGE (depuis Linux 2.6.38)
Activer la gestion transparente des pages immenses (Transparent Huge Pages, ou THP) pour les pages
dans la plage spécifiée par addr et length. Actuellement, THP ne fonctionne qu'avec les pages
anonymes privées (consultez mmap(2)). Le noyau analysera régulièrement les régions qui ont été
marquées comme candidates aux pages immenses pour les remplacer par des pages immenses. Le noyau
allouera aussi des pages immenses directement quand la région est naturellement alignée sur la
taille de page immense (consultez posix_memalign(2)).
Cette fonctionnalité est d'abord destinée aux applications qui utilisent tout à la fois de grands
tableaux, beaucoup de données et de grandes régions d'accès à la mémoire (comme les systèmes de
virtualisation tels que QEMU). Elle peut facilement consommer beaucoup de mémoire (par exemple un
tableau de 2 Mo qui n'accède qu'à un octet dépensera 2 Mo de mémoire et non une page de 4 Ko).
Voir le fichier Documentation/admin-guide/mm/transhuge.rst des sources du noyau Linux pour plus de
détails.
La plupart des configurations de noyaux classiques fournissent un comportement à la manière de
MADV_HUGEPAGE par défaut, et ainsi MADV_HUGEPAGE n'est normalement pas nécessaire. Il est le plus
souvent utile pour les systèmes embarqués où un comportement de type MADV_HUGEPAGE peut ne pas
être activé par défaut dans le noyau. Sur de tels systèmes, cet attribut peut être utilisé pour
activer THP de manière sélective. À chaque fois que MADV_HUGEPAGE est utilisé, il devrait toujours
l'être dans des régions de la mémoire où le développeur sait à l'avance que le motif d'accès ne
risquera pas d'augmenter l'empreinte de l'application quand les pages immenses transparentes sont
actives.
Les opérations MADV_HUGEPAGE et MADV_NOHUGEPAGE ne sont disponibles que si le noyau a été
configuré avec CONFIG_TRANSPARENT_HUGEPAGE.
MADV_NOHUGEPAGE (depuis Linux 2.6.38)
S'assurer que la mémoire dans la plage spécifiée par addr et length ne sera pas gérée dans des
pages immenses transparentes.
MADV_DONTDUMP (depuis Linux 3.4)
Exclure de l'image mémoire (« core dump ») les pages dans la plage indiquée par addr et length.
C'est utile pour les applications dont de larges zones de mémoire sont notoirement inutiles dans
une image mémoire. L'effet de MADV_DONTDUMP est prioritaire sur le masque de bits configuré à
l’aide de /proc/PID/coredump_filter, consultez core(5).
MADV_DODUMP (depuis Linux 3.4)
Annuler l'effet d’un MADV_DONTDUMP antérieur.
MADV_FREE (depuis Linux 4.5)
L'application n'a plus besoin des pages dans la plage indiquée par addr et length. Le noyau peut
ainsi libérer ces pages mais cela pourrait être différé jusqu'à une pression de la mémoire. Pour
chacune des pages marquées comme libérables mais non encore libérées, l'opération sera annulée si
l'appelant écrit dans la page. Après une opération MADV_FREE réussie, toutes les données périmées
(c'est-à-dire les pages sales ou non écrites) seront perdues quand le noyau libèrera les pages.
Cependant, les écritures suivantes dans les pages de la plage auront lieu et le noyau ne pourra
pas libérer ces pages salies, de sorte que l'appelant pourra toujours voir les données qui
viennent d'être écrites. S'il n'y a pas d'écriture ultérieure, le noyau peut libérer les pages
n'importe quand. Une fois que les pages de la plage ont été libérées, l'appelant verra des pages
remplies de zéro à la demande à chaque référence ultérieure aux pages.
L'opération MADV_FREE ne peut s'appliquer qu'à des pages anonymes privées (voir mmap(2)). Avant
Linux 4.12, avant de libérer des pages sur un système sans espace d'échange, les pages dans la
plage donnée étaient libérées instantanément indépendamment de la pression sur la mémoire.
MADV_WIPEONFORK (depuis Linux 4.14
Afficher le processus enfant avec une mémoire pleine de zéros dans cette plage après un fork(2).
Cela est utile quand on réplique (fork) un serveur pour s'assurer que les données sensibles au
processus (par exemple les sièges PRNG, les codes de chiffrement et ainsi de suite) ne soient pas
capturées par les processus enfants.
L'opération MADV_WIPEONFORK ne peut s'appliquer qu'aux pages anonymes privées (voir mmap(2)).
Dans l'enfant créé par fork(2), le paramètre MADV_WIPEONFORK reste en place à la plage d'adresses
indiquée. Ce paramètre est vidé lors d'un execve(2).
MADV_KEEPONFORK (depuis Linux 4.14)
Annuler l'effet d’un MADV_WIPEONFORK antérieur.
VALEUR RENVOYÉE
En cas de succès madvise() renvoie zéro. En cas d'erreur, il renvoie -1 et errno est positionné de façon
adéquate.
ERREURS
EACCES advice est MADV_REMOVE, mais la plage d'adresses indiquée n'est pas un tableau partagé où on peut
écrire.
EAGAIN Une ressource du noyau est temporairement indisponible.
EBADF La projection existe, mais la zone n'est pas associée à un fichier.
EINVAL addr n'est pas aligné sur une page ou length est négatif.
EINVAL advice n'est pas valable.
EINVAL advice vaut MADV_DONTNEED ou MADV_REMOVE et la plage d'adresses indiquée inclut des pages
verrouillées, immenses TLB ou VM_PFNMAP.
EINVAL advice vaut MADV_MERGEABLE ou MADV_UNMERGEABLE, mais le noyau n'a pas été configuré avec l'option
CONFIG_KSM.
EINVAL advice vaut MADV_FREE ou MADV_WIPEONFORK mais la plage d'adresses indiquée inclut un fichier, des
TLB immenses, MAP_SHARED ou des plages VM_PFNMAP.
EIO (pour MADV_WILLNEED) Suivre la consigne de pagination sur cette zone dépasserait la limite
maximale de mémoire physique utilisable par le processus.
ENOMEM (pour MADV_WILLNEED) Mémoire insuffisante ; échec de pagination.
ENOMEM Les adresses de la plage spécifiée ne sont pas projetées actuellement, ou n'appartiennent pas à
l'espace d'adressage du processus.
EPERM advice vaut MADV_HWPOISON, mais l'appelant n'a pas la capacité CAP_SYS_ADMIN.
VERSIONS
Depuis Linux 3.18, la gestion de cet appel système est optionnelle, à partir de l'option de configuration
CONFIG_ADVISE_SYSCALLS.
CONFORMITÉ
madvise() n'est spécifié dans aucun standard. Des versions de cet appel système, qui implémentent une
grande variété de valeurs advice, existent sur de nombreuses autres implémentations. D'autres
implémentent au moins les attributs ci-dessus sous Conventional advice flags (attributs de conseil
conventionnels), avec d'autres variantes de sémantique.
POSIX.1-2001 spécifie posix_madvise(3) avec des constantes POSIX_MADV_NORMAL, POSIX_MADV_RANDOM,
POSIX_MADV_SEQUENTIAL, POSIX_MADV_WILLNEED, POSIX_MADV_DONTNEED et ainsi de suite, avec un comportement
proche des attributs nommés de la même manière que ceux listés ci-dessus.
NOTES
Notes pour Linux
L'implémentation Linux nécessite que l'adresse addr soit alignée sur une page, et permet que length
vaille zéro. S'il y a des parties de la plage d'adresses spécifiée qui ne sont pas projetées, la version
Linux de madvise() les ignore et applique l'appel au reste de la plage (mais renvoie ENOMEM comme il se
doit).
VOIR AUSSI
getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2), prctl(2), posix_madvise(3), core(5)
COLOPHON
Cette page fait partie de la publication 5.10 du projet man-pages Linux. Une description du projet et des
instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à
l'adresse https://www.kernel.org/doc/man-pages/.
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess
<https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud
<tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
<fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau
<jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François
<nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard
<simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot
<david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License
version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à
debian-l10n-french@lists.debian.org.
Linux 11 avril 2020 MADVISE(2)