mallinfo
Table des matières
Retour à l'index
NOM
mallinfo, mallinfo2 - Obtenir les paramètres d'allocation de mémoire
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <malloc.h>
struct mallinfo mallinfo(void);
struct mallinfo2 mallinfo2(void);
DESCRIPTION
Ces fonctions renvoient une copie de la structure contenant les informations
sur les allocations mémoires effectuées par malloc(3) et les fonctions
qui lui sont associées. La structure renvoyée par chaque fonction contient
les mêmes champs. Cependant, la fonction plus ancienne mallinfo() est
obsolète puisque le type des champs est trop petit (voir BOGUES).
Il est à noter que toutes les allocations ne sont pas observables par ces
fonctions ; consultez BOGUES et envisagez l'utilisation de malloc_info(3)
à la place.
La structure mallinfo2 renvoyée par mallinfo2() est définie comme
suit :
struct mallinfo {
size_t arena; /* Espace alloué en mémoire non projetée (octet) */
size_t ordblks; /* Nombre de fragments libres */
size_t smblks; /* Nombre de blocs « fastbin » libres */
size_t hblks; /* Nombre de zones de mémoire projetée */
size_t hblkhd; /* Espace alloué en zones de mém. projetée (octet) */
size_t usmblks; /* Voir ci-dessous */
size_t fsmblks; /* Espace en blocs « fastbin » libérés (octet) */
size_t uordblks; /* Espace alloué total (octet) */
size_t fordblks; /* Espace libre total (octet) */
size_t keepcost; /* Plus grand espace libérable (octet) */
};
La structure mallinfo renvoyée par la fonction obsolète mallinfo() est
exactement la même mis à part que les champs sont de type int.
Les champs de la structure contiennent les informations suivantes :
- arena
-
La quantité de mémoire allouée par d'autres moyens que mmap(2)
(c'est-à-dire la mémoire allouée dans le tas). Ce chiffre inclut à la fois
les blocs en cours d'utilisation et ceux marqués comme libres.
- ordblks
-
Le nombre de blocs libres normaux (c'est-à-dire non « fastbin »).
- smblks
-
Le nombre de blocs libres « fastbin » (consultez mallopt(3)).
- hblks
-
Le nombre de blocs actuellement alloués par mmap(2). Consultez
mallopt(3) pour l'explication de M_MMAP_THRESHOLD.
- hblkhd
-
Le nombre d'octets des blocs actuellement alloués par mmap(2).
- usmblks
-
Ce champ n'est pas utilisé et vaut toujours 0. Historiquement, c’était le
« niveau haut » d'espace alloué — c'est-à-dire la quantité d'espace maximale
qui a déjà été allouée. Ce champ n'est maintenu que dans les environnements
sans thread.
- fsmblks
-
Le nombre total d'octets dans les blocs libres « fastbin ».
- uordblks
-
Le nombre total d'octets consommés par des allocations en cours
d'utilisation.
- fordblks
-
Le nombre total d'octets dans les blocs libres.
- keepcost
-
La quantité totale d'espace libérable au sommet du tas. C'est le nombre
maximal d'octets qui pourraient au mieux (c'est-à-dire en ignorant les
restrictions d'alignement de page, etc.) être libérés par malloc_trim(3).
ATTRIBUTS
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
| Interface | Attribut | Valeur
|
|
mallinfo(),
mallinfo2()
| Sécurité des threads |
MT-Unsafe init const:mallopt
|
mallinfo()/malloinfo2() accède à des objets globaux internes. S'ils
sont modifiés de façon non atomique, les résultats peuvent ne pas être
cohérents. L'identifiant mallopt dans const::mallopt signifie que
mallopt() modifie ces objets globaux internes de façon atomique, rendant
mallinfo()/mallinfo2() suffisamment sûr, d'autres modifications non
atomiques ne le garantissant peut-être pas.
STANDARDS
Aucun.
HISTORIQUE
- mallinfo()
-
glibc 2.0. SVID.
- mallinfo2()
-
glibc 2.33.
BOGUES
Les renseignements ne sont renvoyés que pour la zone principale d'allocation de mémoire. Les allocations dans les autres domaines sont
exclues. Consultez malloc_stats(3) et malloc_info(3) pour les
alternatives qui contiennent des renseignements sur d'autres domaines.
Les champs de la structure mallinfo renvoyée par l'ancienne fonction
mallinfo() sont de type int. Cependant, puisque certaines valeurs
servant à la gestion interne pourraient être de type long, les valeurs
rendues pourraient être arrondies à zéro et être par conséquent incorrectes.
EXEMPLES
Le programme ci-dessous utilise mallinfo2() pour récupérer les
statistiques d'allocation de mémoire avant et après l'allocation et la
libération de certains blocs de mémoire. Les statistiques sont affichées sur
la sortie standard.
Les deux premiers paramètres en ligne de commande définissent le nombre et
la taille des blocs à allouer avec malloc(3).
Les trois arguments restants définissent les blocs alloués qui devraient
être libérés avec free(3). Ces trois arguments sont facultatifs et
définissent (dans l'ordre) : la taille du tas à utiliser dans la boucle qui
libère les blocs (1 par défaut, ce qui signifie de libérer tous les blocs de
l'intervalle), la position du premier bloc à libérer (0 par défaut, ce qui
signifie le premier bloc alloué) et un nombre supérieur d’une unité à la
position du dernier bloc à libérer (le nombre supérieur de 1 au nombre
maximal de blocs par défaut). Si aucun de ces trois arguments n'est présent,
tous les blocs seront libérés par défaut.
Dans l'exemple suivant, 1000 allocations de 100 octets sont effectuées, puis
chaque deuxième bloc alloué est libéré :
$ ./a.out 1000 100 2
============= Avant allocation des blocs =============
Total d'o. en mém. non projetée (arena) : 0
Nb. de fragments libres (ordblks) : 1
Nb. de blocs fastbin libres (smblks) : 0
Nb. de zones de mémoire projetée : 0
Octets en mém. non projetée (hblkhd) : 0
Max. total d'espace alloué (usmblks) : 0
Octets libres en fastbins (fsmblks) : 0
Espace alloué total (uordblks) : 0
Espace libre total (fordblks) : 0
Bloc sup. maxi. libérable (keepcost) : 0
============= Après allocation des blocs =============
Total d'o en mém. non projetée (arena) : 135168
Nb. de fragments libres (ordblks) : 1
Nb. de blocs fastbin libres (smblks) : 0
Nb. de zones de mémoire projetée : 0
Octets en mém. non projetée (hblkhd) : 0
Max. total d'espace alloué (usmblks) : 0
Octets libres en fastbins (fsmblks) : 0
Espace alloué total (uordblks) : 104000
Espace libre total (fordblks) : 31168
Bloc sup. maxi. libérable (keepcost) : 31168
============= Après libération des blocs =============
Total d'o en mém. non projetée (arena) : 135168
Nb. de fragments libres (ordblks) : 501
Nb. de blocs fastbin libres (smblks) : 0
Nb. de zones de mémoire projetée : 0
Octets en mém. non projetée (hblkhd) : 0
Max. total d'espace alloué (usmblks) : 0
Octets libres en fastbins (fsmblks) : 0
Espace alloué total (uordblks) : 52000
Espace libre total (fordblks) : 83168
Bloc sup. maxi. libérable (keepcost) : 31168
Source du programme
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
static void
display_mallinfo2(void)
{
struct mallinfo2 mi;
mi = mallinfo2();
printf("Total non-mmapped bytes (arena): %zu\n", mi.arena);
printf("# of free chunks (ordblks): %zu\n", mi.ordblks);
printf("# of free fastbin blocks (smblks): %zu\n", mi.smblks);
printf("# of mapped regions (hblks): %zu\n", mi.hblks);
printf("Bytes in mapped regions (hblkhd): %zu\n", mi.hblkhd);
printf("Max. total allocated space (usmblks): %zu\n", mi.usmblks);
printf("Free bytes held in fastbins (fsmblks): %zu\n", mi.fsmblks);
printf("Total allocated space (uordblks): %zu\n", mi.uordblks);
printf("Total free space (fordblks): %zu\n", mi.fordblks);
printf("Topmost releasable block (keepcost): %zu\n", mi.keepcost);
}
int
main(int argc, char *argv[])
{
#define MAX_ALLOCS 2000000
char *alloc[MAX_ALLOCS];
size_t blockSize, numBlocks, freeBegin, freeEnd, freeStep;
if (argc < 3 || strcmp(argv[1], "--help") == 0) {
fprintf(stderr, "%s num-blocks block-size [free-step "
"[start-free [end-free]]]\n", argv[0]);
exit(EXIT_FAILURE);
}
numBlocks = atoi(argv[1]);
blockSize = atoi(argv[2]);
freeStep = (argc > 3) ? atoi(argv[3]) : 1;
freeBegin = (argc > 4) ? atoi(argv[4]) : 0;
freeEnd = (argc > 5) ? atoi(argv[5]) : numBlocks;
printf("============== Before allocating blocks ==============\n");
display_mallinfo2();
for (size_t j = 0; j < numBlocks; j++) {
if (numBlocks >= MAX_ALLOCS) {
fprintf(stderr, "Too many allocations\n");
exit(EXIT_FAILURE);
}
alloc[j] = malloc(blockSize);
if (alloc[j] == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
}
printf("\n============== After allocating blocks ==============\n");
display_mallinfo2();
for (size_t j = freeBegin; j < freeEnd; j += freeStep)
free(alloc[j]);
printf("\n============== After freeing blocks ==============\n");
display_mallinfo2();
exit(EXIT_SUCCESS);
}
VOIR AUSSI
mmap(2), malloc(3), malloc_info(3), malloc_stats(3),
malloc_trim(3), mallopt(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
-
- ATTRIBUTS
-
- STANDARDS
-
- HISTORIQUE
-
- BOGUES
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:19 GMT, September 19, 2025