Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       malloc_info - экспортирует состояние malloc в поток

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <malloc.h>

       int malloc_info(int options, FILE *stream);

ОПИСАНИЕ

       Функция  malloc_info() экспортирует строку XML, описывающую текущее состояние реализации выделения памяти
       вызывающего. Строка печатается в файловый поток stream. В экспортируемой строке содержится  информация  о
       всех областях (arenas) (смотрите malloc(3)).

       В текущей реализации значение options должно быть равно нулю.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       On success, malloc_info()  returns 0.  On failure, it returns -1, and errno is set to indicate the error.

ОШИБКИ

       EINVAL Значение options не равно.

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌─────────────────────────────────────────────────────────────────────┬──────────────────────┬──────────┐
       │ ИнтерфейсАтрибутЗначение │
       ├─────────────────────────────────────────────────────────────────────┼──────────────────────┼──────────┤
       │ malloc_info()                                                       │ Безвредность в нитях │ MT-Safe  │
       └─────────────────────────────────────────────────────────────────────┴──────────────────────┴──────────┘

СТАНДАРТЫ

       GNU.

ИСТОРИЯ

       glibc 2.10.

ПРИМЕЧАНИЯ

       Информация  о  выделении памяти предоставляется в виде строки XML (а не в структуре C), так как структура
       со временем может меняться (при изменении в реализации). Возвращаемая строка XML содержит поле версии.

       Для  отправки  вывода  malloc_info()  в  буфер  памяти,  а  не  в   файл   можно   использовать   функцию
       open_memstream(3).

       Функция malloc_info() разработана для компенсации нехватки данных из malloc_stats(3) и mallinfo(3).

ПРИМЕРЫ

       Программа,  представленная  ниже,  принимает  до  четырёх  параметров  командной  строки,  три из которых
       обязательны. В первом параметре задаётся количество нитей, которые должна создать  программа.  Все  нити,
       включая главную нить, выделяют количество блоков памяти, заданное в втором параметре. В третьем параметре
       задаётся  размер  выделяемых  блоков.  Главная  нить создает блоки этого размера, вторая нить создаваемая
       программой, выделяет блоки двукратного размера, третья нить выделяет блоки  трёхкратного  размера  и  так
       далее.

       Чтобы  показать  состояние  выделения  памяти  программа  дважды вызывает malloc_info(). Первый раз вызов
       делается до создания нитей и выделения памяти. Второй вызов выполняется после того, как все нити  выделят
       память.

       В  следующем  примере  аргументами  командной  строки  задаётся  создание одной дополнительной нити и что
       главная и дополнительная нить выделяют 10000 блоков  памяти.  После  того,  как  блоки  памяти  выделены,
       malloc_info() показывает состояние двух областей выделения.

           $ getconf GNU_LIBC_VERSION
           glibc 2.13
           $ ./a.out 1 10000 100
           ============ Before allocating blocks ============
           <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>

           ============ After allocating blocks ============
           <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>

   Исходный код программы
       #include <err.h>
       #include <errno.h>
       #include <malloc.h>
       #include <pthread.h>
       #include <stdlib.h>
       #include <unistd.h>

       static size_t        blockSize;
       static size_t        numThreads;
       static unsigned int  numBlocks;

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

           /* The multiplier '(2 + tn)' ensures that each thread (including
              the main thread) allocates a different amount of memory. */

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

           sleep(100);         /* Sleep until main thread terminates. */
           return NULL;
       }

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

           if (argc < 4) {
               fprintf(stderr,
                       "%s num-threads num-blocks block-size [sleep-time]\n",
                       argv[0]);
               exit(EXIT_FAILURE);
           }

           numThreads = atoi(argv[1]);
           numBlocks = atoi(argv[2]);
           blockSize = atoi(argv[3]);
           sleepTime = (argc > 4) ? atoi(argv[4]) : 0;

           thr = calloc(numThreads, sizeof(*thr));
           if (thr == NULL)
               err(EXIT_FAILURE, "calloc");

           printf("============ Before allocating blocks ============\n");
           malloc_info(0, stdout);

           /* Create threads that allocate different amounts of memory. */

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

               /* If we add a sleep interval after the start-up of each
                  thread, the threads likely won't contend for malloc
                  mutexes, and therefore additional arenas won't be
                  allocated (see malloc(3)). */

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

           /* The main thread also allocates some memory. */

           for (unsigned int j = 0; j < numBlocks; j++)
               if (malloc(blockSize) == NULL)
                   err(EXIT_FAILURE, "malloc");

           sleep(2);           /* Give all threads a chance to
                                  complete allocations. */

           printf("\n============ After allocating blocks ============\n");
           malloc_info(0, stdout);

           exit(EXIT_SUCCESS);
       }

СМОТРИТЕ ТАКЖЕ

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

ПЕРЕВОД

       Русский   перевод   этой   страницы   руководства   разработал(и)   aereiae  <aereiae@gmail.com>,  Alexey
       <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>,
       Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>,  Max  Is  <ismax799@gmail.com>,
       Yuri   Kozlov   <yuray@komyakino.ru>,   Иван   Павлов  <pavia00@gmail.com>,  Малянов  Евгений  Викторович
       <maljanow@outlook.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот перевод является свободной программной документацией; он распространяется на условиях  общедоступной
       лицензии  GNU  (GNU  General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите  об  этом
       разработчику(ам)   по   его(их)  адресу(ам)  электронной  почты  или  по  адресу  списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                  malloc_info(3)