Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
NOM
madvise - Configurer l'utilisation de la memoire
SYNOPSIS
#include <sys/mman.h>
int madvise(void *addr, size_t length, int advice);
Exigences de macros de test de fonctionnalites pour la glibc (consultez
feature_test_macros(7)) :
madvise() : _BSD_SOURCE
DESCRIPTION
L'appel systeme madvise() conseille le noyau sur la facon de gerer la
pagination sur l'intervalle d'adresses debutant a l'adresse addr et de
taille length (en octets). Il permet a une application d'indiquer au
noyau l'utilisation qu'elle compte faire de certaines zones de memoire
partagee ou projetee de facon a ce que le noyau puisse choisir les
techniques de lecture anticipee et de mise en cache appropriees. Cet
appel ne modifie pas la semantique 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 specifie par le parametre advice qui peut prendre les
valeurs
MADV_NORMAL
Pas de traitement particulier. Il s'agit du comportement par
defaut.
MADV_RANDOM
Prevoit des acces aux pages dans un ordre aleatoire. (Ainsi, la
lecture anticipee sera moins utile qu'elle ne l'est en general.)
MADV_SEQUENTIAL
prevoit des acces aux pages dans un ordre sequentiel. (Aussi,
les pages d'un intervalle donne peuvent etre systematiquement
lues par anticipation, et peuvent etre liberees rapidement apres
avoir ete accedees.)
MADV_WILLNEED
Prevoit un acces dans un futur proche. (Ainsi, lire quelques
pages de facon anticipee peut etre une bonne idee.)
MADV_DONTNEED
Ne prevoit pas d'acces dans un futur proche. (Pour l'instant,
l'application en a fini avec l'intervalle considere, ainsi le
noyau peut-il liberer les ressources associees a ce dernier.)
Les acces ulterieurs aux pages de l'intervalle reussiront, mais
resulteront soit en un rechargement du fichier projete sous-
jacent (consultez mmap(2)), soit en un remplissage avec des
zeros pour les pages sans fichier.
MADV_REMOVE (depuis Linux 2.6.16)
Liberer un ensemble contigu de pages et les ressources
correspondantes. Actuellement, ceci n'est possible que sur
shmfs/tmpfs ; les autres systemes de fichiers renvoient l'erreur
ENOSYS.
MADV_DONTFORK (depuis Linux 2.6.16)
Ne pas rendre les pages de cet intervalle disponibles au fils
apres un fork(2). Ceci est utile pour empecher la semantique de
copie a l'ecriture de changer l'emplacement physique d'une page
si le pere y ecrit apres un fork(2). (De tels deplacements
posent des problemes si le materiel accede directement a la page
(DMA)).
MADV_DOFORK (depuis Linux 2.6.16)
Annuler l'effet de MADV_DONTFORK et restaurer le comportement
par defaut, ou une projection en memoire est heritee apres un
fork(2).
MADV_HWPOISON (depuis Linux 2.6.32)
Empoisonne une page et la traite comme une corruption de la
memoire materielle. Cette operation n'est disponible que pour
les processus privilegies (CAP_SYS_ADMIN). A la suite de cette
operation, le processus appelant peut recevoir un SIGBUS et la
page devenir non affectee. Cette fonctionnalite est prevue pour
tester le code de gestion des erreurs de la memoire ; elle n'est
disponible que si le noyau a ete configure avec
CONFIG_MEMORY_FAILURE.
MADV_SOFT_OFFLINE (depuis Linux 2.6.33)
Deconnecte les pages dans l'intervalle specifie par addr et
length. La memoire de chaque page dans l'intervalle specifie est
preservee (lors du prochain acces, le meme contenu sera visible,
mais dans une nouvelle page physique), et la page originale est
deconnectee (ce qui signifie qu'elle n'est plus utilisee, et
plus prise en compte par les mecanismes habituels de gestion de
la memoire). L'effet de l'operation MADV_SOFT_OFFLINE est
invisible au processus appelant (c'est-a-dire qu'elle n'en
change pas la semantique). Cette fonctionnalite est prevue pour
tester le code de gestion des erreurs de la memoire ; elle n'est
disponible que si le noyau a ete configure avec
CONFIG_MEMORY_FAILURE.
MADV_MERGEABLE (depuis Linux 2.6.32)
Active la fusion des pages identiques par le noyau (Kernel
Samepage Merging, ou KSM) pour les pages dans l'intervalle
specifie par addr and length. Le noyau analyse regulierement les
regions de la memoire utilisateur qui ont ete marquees comme
pouvant etre fusionnees, a la recherche de pages avec un contenu
identique. Elles sont remplacees par par une page unique
protegee en ecriture (qui sera automatiquement recopiee si un
processus veut plus tard modifier le contenu de la page). KSM ne
fusionne que les pages anonymes privees (consultez mmap(2)). La
fonctionnalite KSM est prevue pour des applications qui generent
beaucoup d'instances des memes donnees (par exemple des systemes
de virtualisation tels que KVM). Elle peut necessiter beaucoup
de ressources de traitement ; a utiliser avec precaution.
Consultez les fichiers Documentation/vm/ksm.txt dans les sources
du noyau pour plus de details. Les operations MADV_MERGEABLE et
MADV_UNMERGEABLE ne sont disponibles que si le noyau a ete
configure avec CONFIG_KSM.
MADV_UNMERGEABLE (depuis Linux 2.6.32)
Annule l'effet d'une operation MADV_MERGEABLE precedente sur
l'intervalle d'adresse specifie ; KSM annule la fusion sur les
pages qui avaient ete fusionnees dans l'intervalle specifie par
addr et length.
VALEUR RENVOY'EE
En cas de succes madvise() renvoie zero. En cas d'erreur, il renvoie -1
et errno est positionne de facon adequate.
ERREURS
EAGAIN Une ressource du noyau est temporairement indisponible.
EBADF La projection existe, mais la zone n'est pas associee a un
fichier.
EINVAL Cette erreur peut survenir pour les raisons suivantes :
* La valeur len est negative.
* addr n'est pas aligne sur une page.
* advice n'a pas une valeur valide.
* L'application tente de liberer des pages verrouillees ou
partagees (avec MADV_DONTNEED).
* MADV_MERGEABLE ou MADV_UNMERGEABLE a ete indique dans advice,
mais le noyau n'a pas ete configure avec l'option CONFIG_KSM.
EIO (pour MADV_WILLNEED) Suivre la consigne de pagination sur cette
zone depasserait la limite maximale de memoire physique
utilisable par le processus.
ENOMEM (pour MADV_WILLNEED) Memoire insuffisante ; echec de pagination.
ENOMEM Les adresses de l'intervalle specifie ne sont pas projetees
actuellement, ou n'appartiennent pas a l'espace d'adressage du
processus.
CONFORMIT'E
POSIX.1b. POSIX.1-2001 specifie l'appel posix_madvise(3) avec des
constantes POSIX_MADV_NORMAL, etc. et un comportement proche de celui
decrit ici. Il existe un appel similaire posix_fadvise(2) pour les
acces aux fichiers.
MADV_REMOVE, MADV_DONTFORK, MADV_DOFORK, MADV_HWPOISON, MADV_MERGEABLE
et MADV_UNMERGEABLE sont specifiques a Linux.
NOTES
Notes sur Linux
L'implementation Linux actuelle (2.4.0) percoit davantage cet appel
systeme comme une commande que comme un conseil et est ainsi
susceptible de renvoyer une erreur quand elle ne parvient pas a
realiser ce qu'elle devrait accomplir en reponse a ce conseil.
(Consultez la description des ERREURS ci-dessus.) Il s'agit d'un
comportement non standard.
L'implementation Linux necessite que l'adresse addr soit alignee sur
une page, et permet que length vaille zero. S'il y a des parties de
l'intervalle d'adresses specifie qui ne sont pas projetees, 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.27 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Stephan Rafin (2002), Alain Portal
<URL:http://manpagesfr.free.fr/> (2006). Julien Cristau et l'equipe
francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.