MADVISE
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 22 avril 2008
Index
Menu principal
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 (voir
feature_test_macros(7)) :
madvise() :
_BSD_SOURCE
DESCRIPTION
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 par un rechargement du fichier projeté sous-jacent
(voir
mmap(2)),
soit par un remplissage avec des zéros pour les pages sans fichier.
- MADV_REMOVE (Depuis Linux 2.6.16)
-
Libère une plage donnée de pages et ses ressources correspondantes.
Actuellement,
seuls shmfs/tmpfs le prennent en charge ;
les autres systèmes de fichiers renvoyent l'erreur
ENOSYS.
- MADV_DONTFORK (Depuis Linux 2.6.16)
-
Ne pas rendre les pages de cette plage disponibles au fils après un
fork(2).
Ceci est utile pour empêcher la sémantique de copie à l'écriture de modifier
l'emplacement physique d'une page(s) si le parent écrit dedans après un
fork(2).
(De tels déplacements de page entraînent des problèmes pour les matériels
qui accèdent par DMA à cette page(s).)
- MADV_DOFORK (Depuis Linux 2.6.16)
-
Annule l'effet de
MADV_DONTFORK,
restaurant le comportement par défaut par lequel une projection
en mémoire est héritée à travers
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
-
Les adresses de l'intervalle spécifié ne sont pas projetées actuellement,
ou n'appartiennent pas à l'espace d'adressage du processus.
- ENOMEM
-
(pour
MADV_WILLNEED)
Mémoire insuffisante - Échec de pagination.
CONFORMITÉ
POSIX.1b.
POSIX.1-2001 spécifie la fonction
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 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)
TRADUCTION
Ce document est une traduction réalisée par Stephan Rafin
<stephan DOT rafin AT laposte DOT net> le 12 août 2002
et révisée le 23 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation
française de qualité. La version anglaise la plus à jour de ce document est
toujours consultable via la commande : « LANG=C man 2 madvise ».
N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute
erreur dans cette page de manuel.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- CONFORMITÉ
-
- NOTES
-
- Notes Linux
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 23 juin 2008