Man page - mallopt(3)

Packages contains this manual

Available languages:

en fr ru

Manual

mallopt

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Variables d’environnement
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

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

Lorsque ce bit est positionnĂ©, aprĂšs avoir affichĂ© un message d’erreur configurĂ© par le bit 0, le programme est terminĂ© en appelant abort (3). Depuis la glibc 2.4, si le bit 0 est Ă©galement positionnĂ©, alors le programme affiche Ă©galement — entre l’affichage d’un message d’erreur et l’abandon du programme — l’état de la pile Ă  la maniĂšre de backtrace (3) et les projections en mĂ©moire du processus Ă  la maniĂšre de /proc/ pid /maps (voir 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.

Depuis la glibc 2.3.4, M_CHECK_ACTION a pour valeur par défaut 3. Dans la glibc 2.3.3 et antérieures, la valeur par défaut est 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 : de nos jours, la glibc configure ce seuil dynamiquement. La valeur initiale est 128*1024, mais lorsque sont libĂ©rĂ©s des blocs de taille supĂ©rieure au seuil mais infĂ©rieure ou Ă©gale Ă  DEFAULT_MMAP_THRESHOLD_MAX , le seuil est ajustĂ© Ă  la taille du bloc libĂ©rĂ©. Quand le mĂ©canisme de seuil dynamique est activĂ©, le seuil de dĂ©sallocation du tas est Ă©galement configurĂ© dynamiquement Ă  deux fois le seuil mmap. L’ajustement dynamique du seuil mmap est dĂ©sactivĂ© dĂšs lors qu’un des paramĂštres M_TRIM_THRESHOLD , M_TOP_PAD , M_MMAP_THRESHOLD , ou M_MMAP_MAX est configurĂ©.

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 \[u00BB], 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Ă©.

VERSIONS

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.

STANDARDS

Aucun.

HISTORIQUE

glibc 2.0.

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, "mallopt() failed");
exit(EXIT_FAILURE);
}
}
p = malloc(1000);
if (p == NULL) {
fprintf(stderr, "malloc() failed");
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 à debian-l10n-french@lists.debian.org .