mallopt
Section: C Library Functions (3)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
mallopt - Définir les paramètres d'allocation de mémoire
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <malloc.h>
int mallopt(int param, int value);
DESCRIPTION
La fonction mallopt() ajuste les paramètres qui contrôlent le
comportement des fonctions liées à l'allocation de mémoire (voir
malloc(3)). Le paramètre param indique le paramètre à modifier, et
value indique la nouvelle valeur pour ce paramètre.
Les valeurs suivantes peuvent être assignées à param :
- M_ARENA_MAX
-
Si ce paramètre à une valeur non nulle, il définit une limite dure sur le
nombre maximal d'arènes qui peuvent être créées. Une arène représente une
réserve de mémoire qui peut être utilisée par des appels à malloc(3) (et
fonctions similaires) pour répondre à des requêtes d'allocation. Les arènes
sont sécurisées vis-à-vis des fils d'exécution et peuvent répondre à de
multiples requêtes concurrentes. Un compromis est à trouver entre le nombre
de fils d'exécution et le nombre d'arènes. Plus il y a d'arènes et plus la
compétition par fil d'exécution est basse au détriment d'une consommation
mémoire plus élevée.
-
La valeur par défaut de ce paramètre est 0, ce qui signifie que la limite
du nombre d'arènes est déterminée conformément à la valeur de
M_ARENA_TEST.
-
Ce paramètre est disponible depuis la glibc 2.10 à l’aide de
--enable-experimental-malloc, et par défaut depuis la glibc 2.15. Dans
certaines versions de l’allocateur il n'y avait pas de limite sur le nombre
d'arènes créées (sur CentOS 5 et RHEL 5 par exemple).
-
Lors de l'utilisation de versions plus récentes de la glibc, les
applications peuvent dans certains cas faire preuve d’une grande compétition
lors de l'accès aux arènes. Dans ces cas, il peut être bénéfique d'augmenter
M_ARENA_MAX pour la faire correspondre au nombre de fils d'exécution. Il
s'agit d'un comportement similaire aux stratégies appliquées par tcmalloc et
jemalloc (à des réserves d'allocation par fil d'exécution par exemple).
- M_ARENA_TEST
-
Ce paramètre définit, en nombre d'arènes créées, la valeur pour laquelle la
configuration du système sera examinée afin de déterminer une limite dure
sur le nombre d'arènes créées. Consultez M_ARENA_MAX pour la définition
d'une arène.
-
Le calcul de la limite dure du nombre d'arènes est définit par
l'implémentation et est généralement un multiple du nombre de CPU
disponibles. Le résultat est définitif une fois la limite dure calculée, et
il contraint le nombre total d'arènes.
-
La valeur par défaut du paramètre M_ARENA_TEST est 2 sur les systèmes où
sizeof(long) vaut 4 ; autrement, la valeur par défaut est 8.
-
Ce paramètre est disponible depuis la glibc 2.10 à l’aide de
--enable-experimental-malloc, et par défaut depuis la glibc 2.15.
-
La valeur de M_ARENA_TEST n'est pas utilisée lorsque M_ARENA_MAX a une
valeur non nulle.
- M_CHECK_ACTION
-
Ce paramètre contrôle le comportement de la glibc lorsque des erreurs de
programmation sont détectées (par exemple, lors qu'un pointeur est libéré
plusieurs fois). Les 3 bits de poids faible (bits 2, 1 et 0) de cette valeur
ont les significations suivantes :
-
- Bit 0
-
Lorsque ce bit est positionné, un message d'une ligne détaillant l'erreur
est affiché sur stderr. Le message commence par la chaîne "*** glibc
detected ***", suivi par le nom du programme, le nom de la fonction de
l'allocation mémoire qui a détecté l'erreur, une brève description de
l'erreur, puis l'adresse mémoire où l'erreur a été détectée.
- Bit 1
-
If this bit is set, then, after printing any error message specified by bit
0, the program is terminated by calling abort(3). Since glibc 2.4, if
bit 0 is also set, then, between printing the error message and aborting,
the program also prints a stack trace in the manner of backtrace(3), and
prints the process's memory mapping in the style of /proc/pid/maps
(see proc(5)).
- Bit 2 (depuis la glibc 2.4)
-
Ce bit a un effet uniquement si le bit 0 est également positionné. Lorsqu'il
est positionné, alors le message d'erreur d'une ligne décrivant l'erreur est
simplifié et contient uniquement le nom de la fonction où l'erreur a été
détectée ainsi qu'une brève description de l'erreur.
-
Les autres bits de value sont ignorés.
-
La combinaison des bits décrits ci-dessus permet de configurer
M_CHECK_ACTION avec les valeurs suivantes :
-
- 0
-
Ignorer les erreurs et continuer l'exécution (sans résultats définis).
- 1
-
Afficher un message d'erreur détaillé et continuer l'exécution.
- 2
-
Interrompre le programme.
- 3
-
Afficher un message d'erreur détaillé, l'état de la pile et des projections
en mémoire, puis interrompre le programme.
- 5
-
Afficher un message d'erreur simple et continuer l'exécution.
- 7
-
Afficher un message d'erreur simple, l'état de la pile et des projections en
mémoire, puis interrompre le programme.
-
Since glibc 2.3.4, the default value for the M_CHECK_ACTION parameter is
3. In glibc 2.3.3 and earlier, the default value is 1.
-
Il est recommandé d'utiliser une valeur M_CHECK_ACTION non nulle, car
sinon l'arrêt impromptu du programme risque d'être différé, ce qui rend très
difficile de retrouver l'origine du problème.
- M_MMAP_MAX
-
Ce paramètre indique le nombre maximal de requêtes d'allocation qui peuvent
être servies simultanément avec mmap(2). Il permet de préserver les
performances de certains systèmes qui ont un nombre limité de tables
internes à disposition de mmap(2).
-
La valeur par défaut est 65 536, valeur qui n'a pas de sens particulier mais
sert seulement de protection. Configurer ce paramètre à 0 désactive
l'utilisation de mmap(2) pour servir de grandes requêtes d'allocation.
- M_MMAP_THRESHOLD
-
Lorsqu'une requête d'allocation supérieure ou égale au seuil
M_MMAP_THRESHOLD (en octets) ne peut être satisfaite depuis la liste de
blocs libres, les fonctions d'allocation de mémoire utilisent mmap(2)
plutôt que d'augmenter la taille du segment de données avec sbrk(2).
-
Allouer de la mémoire avec mmap(2) permet toujours aux blocs de mémoire
alloués d'être rendus de manière indépendante au système. Cela représente un
avantage significatif comparé au tas qui ne peut être désalloué que si la
mémoire est libérée par le haut. D'autre part, il y a certains inconvénients
à utiliser mmap(2) : l'espace désalloué n'est pas considéré comme libéré,
l'empêchant d'être réutilisé pour de futures allocations ; de la mémoire
peut être gaspillée car les allocations à l’aide de mmap(2) doivent être
alignées sur une taille de page ; et le noyau doit effectuer la tâche
coûteuse de remise à zéro de la mémoire allouée par mmap(2). Trouver un
compromis entre ces effets mène à une valeur du paramètre
M_MMAP_THRESHOLD par défaut à 128*1024.
-
La limite basse de ce paramètre est 0. La limite haute est
DEFAULT_MMAP_THRESHOLD_MAX : c'est-à-dire 512*1024 sur les systèmes
32 bits ou 4*1024*1024*sizeof(long) sur les systèmes 64 bits.
-
Note: Nowadays, glibc uses a dynamic mmap threshold by default. The
initial value of the threshold is 128*1024, but when blocks larger than the
current threshold and less than or equal to DEFAULT_MMAP_THRESHOLD_MAX
are freed, the threshold is adjusted upward to the size of the freed block.
When dynamic mmap thresholding is in effect, the threshold for trimming the
heap is also dynamically adjusted to be twice the dynamic mmap threshold.
Dynamic adjustment of the mmap threshold is disabled if any of the
M_TRIM_THRESHOLD, M_TOP_PAD, M_MMAP_THRESHOLD, or M_MMAP_MAX
parameters is set.
- M_MXFAST (depuis glibc 2.3)
-
Définir la limite supérieure (en octets) pour les requêtes d'allocation
mémoire qui sont satisfaites en utilisant des « fastbins ». Les « fastbins » sont des espaces de stockage qui contiennent des blocs de
mémoire désalloués de même taille, sans fusion des blocs libres
adjacents. La réallocation ultérieure de blocs de cette taille peut être
effectuée très rapidement en allouant à partir du « fastbin », bien que
d'un autre côté la fragmentation de la mémoire et l'empreinte mémoire totale
du programme puissent augmenter.
-
La valeur par défaut de ce paramètre est 64*sizeof(size_t)/4
(c'est-à-dire 64 sur les architectures 32 bits). La plage de ce
paramètre va de 0 à 80*sizeof(size_t)/4. Fixer M_MXFAST à 0
désactive l'utilisation des « fastbins ».
- M_PERTURB (depuis glibc 2.4)
-
Si ce paramètre est configuré à une valeur non nulle, tous les octets de
mémoire allouée (autrement qu'avec calloc(3)) sont initialisés au
complément de la valeur de l'octet le moins significatif de
value. Lorsque la mémoire allouée est libérée avec free(3), les octets
libérés prennent tous la valeur de l'octet le moins significatif de
value. Cette fonctionnalité permet de détecter des erreurs lorsque les
programmes supposent que la mémoire allouée a été initialisée à zéro, ou
réutilisent des valeurs depuis une zone mémoire précédemment libérée.
-
La valeur par défaut de ce paramètre est 0.
- M_TOP_PAD
-
Ce paramètre définit la quantité en octets de bourrage à utiliser lors de
l'appel à sbrk(2) pour modifier la taille du segment de données. Ce
paramètre a un effet dans les circonstances suivantes :
-
- •
-
Lorsque la taille du segment de données est augmentée, M_TOP_PAD octets
sont ajoutés à la requête sbrk(2).
- •
-
Lorsque le tas est désalloué suite à l'appel free(3) (voir
M_TRIM_THRESHOLD), cet espace supplémentaire est préservé en haut du tas.
-
Dans tous les cas, la quantité de bourrage est toujours arrondie à la taille
d'une page système.
-
La valeur M_TOP_PAD résulte d'un compromis entre l'augmentation du nombre
d'appels système (avec une valeur faible) et le gaspillage de mémoire
inutilisée en haut du tas (avec une valeur élevée).
-
La valeur par défaut de ce paramètre est 128*1024.
- M_TRIM_THRESHOLD
-
Lorsque la quantité de mémoire libre et contigüe en haut du tas dépasse ce
seuil, free(3) utilise sbrk(2) pour rendre cette mémoire au système
d'exploitation. (Cela peut être utile pour les programmes qui sont exécutés
encore longtemps après avoir libéré une quantité importante de mémoire.)Le
paramètre M_TRIM_THRESHOLD indique la taille minimale (en octet) que ce
bloc de mémoire doit atteindre avant que sbrk(2) ne soit utilisé
pourréduire le tas.
-
La valeur par défaut de ce paramètre est 128*1024, en octets. Une valeur de
-1 désactive complètement la désallocation.
-
La valeur M_TRIM_THRESHOLD résulte d'un compromis entre l'augmentation du
nombre d'appels système (avec une valeur faible) et le gaspillage de mémoire
inutilisée en haut du tas (avec une valeur élevée).
Variables d'environnement
Un certain nombre des paramètres de mallopt() peuvent être modifiés à
travers de variables d'environnement. Ces variables ont l'avantage de ne pas
nécessiter la modification du code source du programme. Pour être prises en
compte, ces variables doivent être définies avant le premier appel à une
fonction d'allocation mémoire. Les paramètres passés par la fonction
mallopt() sont prioritaires devant ceux issus des variables
d'environnement. Pour des raisons de sécurité, ces variables sont ignorées
dans le cas de programmes setuid ou setgid.
Les variables d'environnement sont les suivantes (notez le caractère de
soulignement (« underscore ») qui les termine) :
- MALLOC_ARENA_MAX
-
Contrôle du même paramètre que M_ARENA_MAX de mallopt().
- MALLOC_ARENA_TEST
-
Contrôle du même paramètre que M_ARENA_TEST de mallopt().
- MALLOC_CHECK_
-
Cette variable d'environnement contrôle le même paramètre que
M_CHECK_ACTION de mallopt(). Si elle est configurée à une valeur non
nulle, une mise en œuvre spécifique des fonctions d'allocation mémoire est
utilisée, grâce à la fonctionnalité malloc_hook(3). Cette mise en œuvre
effectue des vérifications d'erreurs supplémentaires, au prix d'un
ralentissement par rapport au jeu standard de fonctions d'allocation
mémoire. Cependant, elle ne détecte pas toutes les erreurs possibles : des
fuites mémoires peuvent encore se produire.
-
La valeur de cette variable d'environnement doit être un seul chiffre, dont
le sens est comme décrit pour M_CHECK_ACTION. Tout caractère au-delà du
premier chiffre est ignoré.
-
Pour des raisons de sécurité, MALLOC_CHECK_ est ignoré par défaut dans le
cas de programmes setuid ou setgid. Cependant, si le fichier
/etc/suid-debug existe (peu importe son contenu), alors la valeur de
MALLOC_CHECK_ est prise en compte pour les programmes setuid ou
setgid.
- MALLOC_MMAP_MAX_
-
Contrôle du même paramètre que M_MMAP_MAX de mallopt().
- MALLOC_MMAP_THRESHOLD_
-
Contrôle du même paramètre que M_MMAP_THRESHOLD de mallopt().
- MALLOC_PERTURB_
-
Contrôle du même paramètre que M_PERTURB de mallopt().
- MALLOC_TRIM_THRESHOLD_
-
Contrôle du même paramètre que M_TRIM_THRESHOLD de mallopt().
- MALLOC_TOP_PAD_
-
Contrôle du même paramètre que M_TOP_PAD de mallopt().
VALEUR RENVOYÉE
En cas de succès, mallopt() renvoie 1. En cas d'erreur, il renvoie
0.
ERREURS
En cas d'erreur, errno n'est pas positionné.
STANDARDS
Cette fonction n'est pas spécifiée par les normes POSIX ou C. Une fonction
similaire existe sur de nombreux dérivés de System V, mais les valeurs
permises de param varient d'un système à l'autre. SVID définit les
options M_MXFAST, M_NLBLKS, M_GRAIN et M_KEEP, mais seule la
première d'entre elles est disponible dans la glibc.
BOGUES
Indiquer une valeur non valable pour param ne génère pas d'erreur.
Une erreur de calcul dans la mise en œuvre glibc implique qu'un appel de la
forme suivante :
mallopt(M_MXFAST, n)
n'active pas les « fastbins » pour toutes les allocations d'une taille
jusqu'à n. Pour obtenir l'effet attendu, n doit être arrondi à un
multiple supérieur ou égal à (2k+1)*sizeof(size_t), où k est un
entier.
Si mallopt() est utilisé pour configurer M_PERTURB, tous les octets de
mémoire alloués sont initialisés au complément de value, puis lorsque la
mémoire est libérée les octets sont initialisés à value. Cependant, une
erreur de sizeof(size_t) est présente dans le code mis en œuvre : au lieu
d'initialiser précisément le bloc de mémoire libéré par l'appel free(p),
c'est le bloc démarrant à p+sizeof(size_t) qui est initialisé.
EXEMPLES
Le programme ci-dessous illustre l'utilisation de M_CHECK_ACTION. Si le
programme est appelé avec un paramètre (entier), alors celui-ci est utilisé
pour M_CHECK_ACTION. Le programme alloue un bloc de mémoire, puis le
libère deux fois, ce qui constitue une erreur.
L'exemple de session ci-dessous montre ce qu'il se passe lorsqu'un programme
est exécuté avec la glibc et la valeur par défaut de M_CHECK_ACTION :
$ ./a.out
main(): fin du premier appel free()
*** glibc detected *** ./a.out: double free or corruption (top): 0x09d30008 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x523501]
/lib/libc.so.6(+0x6dd70)[0x524d70]
/lib/libc.so.6(cfree+0x6d)[0x527e5d]
./a.out[0x80485db]
/lib/libc.so.6(__libc_start_main+0xe7)[0x4cdce7]
./a.out[0x8048471]
======= Memory map: ========
001e4000-001fe000 r-xp 00000000 08:06 1083555 /lib/libgcc_s.so.1
001fe000-001ff000 r--p 00019000 08:06 1083555 /lib/libgcc_s.so.1
[some lines omitted]
b7814000-b7817000 rw-p 00000000 00:00 0
bff53000-bff74000 rw-p 00000000 00:00 0 [stack]
Abandon
L'exemple suivant montre les cas d'autres valeurs de M_CHECK_ACTION:
$ ./a.out 1 # Diagnostique l'erreur et continue
main(): fin du premier appel free()
*** glibc detected *** ./a.out: double free or corruption (top): 0x09cbe008 ***
main(): fin du second appel free()
$ ./a.out 2 # Interrompt le programme sans message d'erreur
main(): fin du premier appel free()
Abandon
$ ./a.out 0 # Ignore l'erreur et continue
main(): fin du premier appel free()
main(): fin du second appel free()
L'exemple suivant montre comment configurer le même paramètre avec la
variable d'environnement MALLOC_CHECK_ :
$ MALLOC_CHECK_=1 ./a.out
main(): fin du premier appel free()
*** glibc detected *** ./a.out: free(): invalid pointer: 0x092c2008 ***
main(): fin du second appel free()
Source du programme
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char *p;
if (argc > 1) {
if (mallopt(M_CHECK_ACTION, atoi(argv[1])) != 1) {
fprintf(stderr, "échec de mallopt()");
exit(EXIT_FAILURE);
}
}
p = malloc(1000);
if (p == NULL) {
fprintf(stderr, "échec de malloc()");
exit(EXIT_FAILURE);
}
free(p);
printf("%s(): returned from first free() call\n", __func__);
free(p);
printf("%s(): returned from second free() call\n", __func__);
exit(EXIT_SUCCESS);
}
VOIR AUSSI
mmap(2), sbrk(2), mallinfo(3), malloc(3), malloc_hook(3),
malloc_info(3), malloc_stats(3), malloc_trim(3), mcheck(3),
mtrace(3), posix_memalign(3)
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
Grégoire Scano <gregoire.scano@malloc.fr>
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- Variables d'environnement
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- STANDARDS
-
- BOGUES
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:59:25 GMT, May 23, 2024