NOM
madvise - Configure 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 (voir
feature_test_macros(7)) :
madvise() : _BSD_SOURCE
L’appel système madvise() conseille le noyau sur la façon de gérer la
pagination sur l’intervalle d’adresses débutant à l’adresse addr et de
taille length (en octets). Il permet à 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. Cet
appel ne modifie pas la sémantique de l’application (sauf dans le cas
de MADV_DONTNEED), mais peut avoir un impact sur ses performances. Le
noyau est libre d’ignorer le conseil.
Le conseil est spécifié par le paramètre advice qui peut prendre les
valeurs
MADV_NORMAL
Pas de traitement particulier. Il s’agit du comportement par
défaut.
MADV_RANDOM
Prévoit des accès aux pages 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évoit des accès aux pages dans un ordre séquentiel. (Aussi,
les pages d’un intervalle donné peuvent être systématiquement
lues par anticipation, et peuvent être libérées rapidement après
avoir été accédées.)
MADV_WILLNEED
Prévoit 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 prévoit pas d’accès dans un futur proche. (Pour l’instant,
l’application en a fini avec l’intervalle considéré, ainsi le
noyau peut‐il libérer les ressources associées à ce dernier.)
Les accès ultérieurs aux pages de l’intervalle réussiront, mais
résulteront soit en un rechargement du fichier projeté
sous‐jacent (voir mmap(2)), soit en un remplissage avec des
zéros pour les pages sans fichier.
MADV_REMOVE (depuis Linux 2.6.16)
Libérer un ensemble contigu de pages et les ressources
correspondantes. Actuellement, ceci n’est possible que sur
shmfs/tmpfs ; les autres systèmes de fichiers renvoient l’erreur
ENOSYS.
MADV_DONTFORK (depuis Linux 2.6.16)
Ne pas rendre les pages de cet intervalle disponibles au fils
après un fork(2). Ceci est utile pour empêcher la sémantique de
copie à l’écriture de changer l’emplacement physique d’une page
si le père 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).
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
EAGAIN Une ressource du noyau est temporairement indisponible.
EBADF La projection existe, mais la zone n’est pas associée à un
fichier.
EINVAL la valeur len est négative, addr n’est pas aligné sur une page,
advice n’a pas une valeur valide, ou bien l’application tente de
libérer des pages verrouillées ou partagées (avec
MADV_DONTNEED).
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 l’intervalle spécifié ne sont pas projetées
actuellement, ou n’appartiennent pas à l’espace d’adressage du
processus.
CONFORMITÉ
POSIX.1b. POSIX.1-2001 spécifie l’appel posix_madvise(3) avec des
constantes POSIX_MADV_NORMAL, etc. et un comportement proche de celui
décrit ici. Il existe un appel similaire posix_fadvise(2) pour les
accès aux fichiers.
MADV_REMOVE, MADV_DONTFORK et MADV_DOFORK sont spécifiques à Linux.
NOTES
Notes sur Linux
L’implémentation Linux actuelle (2.4.0) perçoit davantage cet appel
système comme une commande que comme un conseil et est ainsi
susceptible de renvoyer une erreur quand elle ne parvient pas à
réaliser ce qu’elle devrait accomplir en réponse à ce conseil. (Voir la
description des ERREURS ci‐dessus.) Il s’agit d’un comportement non
standard.
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
l’intervalle d’adresses spécifié qui ne sont pas projetées, la version
Linux de madvise() les ignore et applique l’appel au reste de
l’intervalle (mais renvoie ENOMEM comme il se doit).
VOIR AUSSI
getrlimit(2), mincore(2), mmap(2), mprotect(2), msync(2), munmap(2)
COLOPHON
Cette page fait partie de la publication 3.23 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
Cette page de manuel a été traduite par Stéphan Rafin <stephan DOT
rafin AT laposte DOT net> en 2002, puis a été mise à jour par Alain
Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
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> ».