jammy (3) malloc_info.3.gz

Provided by: manpages-fr-dev_4.13-4_all bug

NOM

       malloc_info - Exporter l'état de malloc vers un flux

SYNOPSIS

       #include <malloc.h>

       int malloc_info(int options, FILE *stream);

DESCRIPTION

       La  fonction  malloc_info()  exporte  une chaîne XML décrivant l'état actuel de l'allocation mémoire pour
       l'appelant. Cette chaîne est écrite dans le flux stream. La chaîne  exportée  contient  des  informations
       concernant toutes les domaines de mémoires (« arenas », consultez malloc(3)).

       Dans la mise en œuvre actuelle, le paramètre options doit être nul.

VALEUR RENVOYÉE

       En  cas  de  succès,  malloc_info()  renvoie 0. En cas d'erreur, -1 est renvoyé et errno contient le code
       d'erreur.

ERREURS

       EINVAL Le paramètre options n'était pas nul.

VERSIONS

       malloc_info() est disponible depuis la glibc 2.10.

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).

       ┌──────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├──────────────┼──────────────────────┼─────────┤
       │malloc_info() │ Sécurité des threads │ MT-Safe │
       └──────────────┴──────────────────────┴─────────┘

CONFORMITÉ

       Cette fonction est une extension GNU.

NOTES

       L'information d'allocation mémoire est fournie sous forme de flux XML (plutôt que  de  structure C),  car
       les  informations fournies pourront évoluer dans le futur, en raison de modifications dans le code mis en
       œuvre. La sortie XML comporte un champ de version.

       La fonction open_memstream(3) peut être utilisée pour envoyer la sortie de malloc_info() directement dans
       un tampon en mémoire plutôt que dans un fichier.

       La fonction malloc_info() est conçue pour combler les manques de malloc_stats(3) et mallinfo(3).

EXEMPLES

       Le  programme  ci-dessous  accepte jusqu'à quatre paramètres en ligne de commande dont les trois premiers
       sont obligatoires. Le premier paramètre indique le  nombre  de  processus  légers  (« threads »)  que  le
       programme  doit créer. Tous les threads, thread principal compris, allouent le nombre de blocs de mémoire
       indiqué en deuxième paramètre. Le troisième paramètre contrôle la taille des blocs à allouer.  Le  thread
       principal  crée des blocs de cette taille, le deuxième thread créé par le programme alloue des blocs deux
       fois plus grands, le troisième thread alloue des blocs trois fois plus grands et ainsi de suite.

       Le programme appelle malloc_info() deux fois pour afficher l'état de  l'allocation  mémoire.  Le  premier
       appel  est  effectué  avant  la  création  d’un  thread ou l'allocation de mémoire. Le deuxième appel est
       effectué une fois que tous les threads ont alloué de la mémoire.

       Dans l'exemple  suivant,  les  paramètres  commandent  la  création  d'un  thread  additionnel,  allouant
       10 000 blocs  de mémoire, comme le thread principal. Une fois les blocs de mémoire alloués, malloc_info()
       affiche l'état des deux domaines de mémoire.

           $ getconf GNU_LIBC_VERSION
           glibc 2.13
           $ ./a.out 1 10000 100
           ============ Avant allocation des blocs ============
           <malloc version="1">
           <heap nr="0">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="135168"/>
           <system type="max" size="135168"/>
           <aspace type="total" size="135168"/>
           <aspace type="mprotect" size="135168"/>
           </heap>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="135168"/>
           <system type="max" size="135168"/>
           <aspace type="total" size="135168"/>
           <aspace type="mprotect" size="135168"/>
           </malloc>

           ============ Après allocation des blocs ============
           <malloc version="1">
           <heap nr="0">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="1081344"/>
           <system type="max" size="1081344"/>
           <aspace type="total" size="1081344"/>
           <aspace type="mprotect" size="1081344"/>
           </heap>
           <heap nr="1">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="1032192"/>
           <system type="max" size="1032192"/>
           <aspace type="total" size="1032192"/>
           <aspace type="mprotect" size="1032192"/>
           </heap>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="2113536"/>
           <system type="max" size="2113536"/>
           <aspace type="total" size="2113536"/>
           <aspace type="mprotect" size="2113536"/>
           </malloc>

   Source du programme
       #include <unistd.h>
       #include <stdlib.h>
       #include <pthread.h>
       #include <malloc.h>
       #include <errno.h>

       static size_t tailleBloc;
       static int nbThreads, nbBlocs;

       #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)

       static void *
       thread_func(void *arg)
       {
           int tn = (int) arg;

           /* Le multiplicateur '(2 + tn)' assure que chaque thread (dont
              le thread principal) alloue une quantité de mémoire différente. */

           for (int j = 0; j < numBlocks; j++)
               if (malloc(blockSize * (2 + tn)) == NULL)
                   errExit("malloc-thread");

           sleep(100);         /* Attendre que le thread principal se termine. */
           return NULL;
       }

       int
       main(int argc, char *argv[])
       {
           int sleepTime;

           if (argc < 4) {
               fprintf(stderr,
                       "%s nb-threads nb-blocs taille-bloc [tps-sommeil]\n",
                       argv[0]);
               exit(EXIT_FAILURE);
           }

           nbThreads = atoi(argv[1]);
           nbBlocs = atoi(argv[2]);
           tailleBloc = atoi(argv[3]);
           tpsSommeil = (argc > 4) ? atoi(argv[4]) : 0;

           pthread_t *thr = calloc(numThreads, sizeof(*thr));
           if (thr == NULL)
               errExit("calloc");

           printf("============ Avant allocation des blocs ============\n");
           malloc_info(0, stdout);

           /* Créer les threads allouant des quantités de mémoire différentes. */

           for (int tn = 0; tn < numThreads; tn++) {
               errno = pthread_create(&thr[tn], NULL, thread_func,
                                      (void *) tn);
               if (errno != 0)
                   errExit("pthread_create");

               /* Si un intervalle de sommeil existe après le démarrage de
                  chaque thread, les threads ne vont sans doute pas se battre
                  pour les mutex malloc et par conséquent les domaines de mémoire
                  supplémentaires ne seront pas alloués (consultez malloc(3)).
                  */

               if (tpsSommeil > 0)
                   sleep(tpsSommeil);
           }

           /* Le thread principal alloue également de la mémoire. */

           for (int j = 0; j < numBlocks; j++)
               if (malloc(blockSize) == NULL)
                   errExit("malloc");

           sleep(2);           /* Donner à tous les threads une chance
                                  de terminer les allocations. */

           printf("\n============ Après allocation des blocs ============\n");
           malloc_info(0, stdout);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       mallinfo(3), malloc(3), malloc_stats(3), mallopt(3), open_memstream(3)

COLOPHON

       Cette page fait partie de la publication 5.10 du projet man-pages Linux. Une description du projet et des
       instructions  pour  signaler  des  anomalies et la dernière version de cette page peuvent être trouvées à
       l'adresse https://www.kernel.org/doc/man-pages/.

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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 ⟨⟩.