malloc_info(3) | Library Functions Manual | malloc_info(3) |
ИМЯ
malloc_info - экспортирует состояние malloc в поток
LIBRARY
Standard C library (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>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.
2 мая 2024 г. | Linux man-pages 6.8 |