MALLINFO(3) | Руководство программиста Linux | MALLINFO(3) |
mallinfo — возвращает информацию о выделении памяти
#include <malloc.h>
struct mallinfo mallinfo(void);
Функция mallinfo() возвращает копию структуры, содержащую информацию о выделении памяти, выполненной функцией malloc(3) и связанными с ней функциями. Эта структура определена следующим образом:
struct mallinfo { int arena; /* не размеченная область памяти выделенная под кучу (в байтах) */ int ordblks; /* Количество свободных блоков */ int smblks; /* Количество свободных блоков fastbin */ int hblks; /* Количество размеченных областей */ int hblkhd; /* Пространство, выделенное в размеченных областях (в байтах) */ int usmblks; /* Максимум общей выделенной области (в байтах) */ int fsmblks; /* Пространство в освобожденных fastbin блоках (в байтах) */ int uordblks; /* Общее выделенное пространство (в байтах) */ int fordblks; /* Общее свободное пространство (в байтах) */ int keepcost; /* Верхнее пространство, которое можно освободить (в байтах) */ };
Поля структуры mallinfo содержат следующую информацию:
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
mallinfo() | Безвредность в нитях | MT-Unsafe init const:mallopt |
Функция mallinfo() получила бы доступ к некоторым глобальным внутренним переменным. Если изменять их не атомарно, то можно нарушить целостность результатов. Идентификатор mallopt в const:mallopt означает, что mallopt() изменяла бы глобальные внутренние переменные атомарно, что делает mallinfo() достаточно безопасной, но другие изменения могут выполняться не атомарно.
Эта функция не определена в стандартах POSIX и С. Подобная функция существует на многих производных от System V и была определена в SVID.
Информация возвращается только для главной области выделяемой памяти. Выделение в других областях не учитываются. Альтернативой, возвращаемой информацию о других частях, являются malloc_stats(3) и malloc_info(3).
Поля структуры mallinfo имеют тип int. Однако, из-за того, что некоторые внутренние значения поддержки (bookkeeping) могут иметь тип long, возвращаемые значения могут быть близкими к нулю и поэтому не точны.
Программа, представленная ниже, вызывает mallinfo() для получения статистики по выделенной памяти перед и после выделения и освобождения нескольких блоков памяти. Статистика выдаётся в стандартный вывод.
Первые два параметра командной строки определяют количество и размер блоков, которые будут выделены с помощью malloc(3).
В оставшихся трёх аргументах задаётся какие из выделенных блоков должны быть освобождены с помощью free(3). Эти аргументы необязательны и определяют (по порядку): размер шага, используемый в цикле освобождения блоков (по умолчанию 1, что приводит к освобождению всех блоков диапазона); порядковая позиция первого освобождаемого блока (по умолчанию 0, то есть первый выделенный блок); номер, на единицу больший порядковой позиции последнего освобождаемого блока (по умолчанию, на единицу больше, чем максимальное количество блоков). Если эти аргументы не указаны, то по умолчанию освобождаются все выделенные блоки.
Пример запуска программы, где память выделяется 1000 раз по 100 байт, а затем освобождается каждый второй выделенный блок:
$ ./a.out 1000 100 2 ============== перед выделением блоков ============== всего неотображённых байт (часть): 0 кол-во свободных порций (ordblks): 1 кол-во свободных блоков fastbin (smblks): 0 кол-во отображённых областей (hblks): 0 байтов в отображённых областях (hblkhd): 0 максимальное количество выделенного пространства (usmblks): 0 свободных байт в fastbins (fsmblks): 0 полное выделенное пространство (uordblks): 0 полное свободное пространство (fordblks): 0 освобождаемых блоков сверху (keepcost): 0 ============== после выделения блоков ============== всего неотображённых байт (часть): 1 кол-во свободных порций (ordblks): 0 кол-во свободных блоков fastbin (smblks): 0 кол-во отображённых областей (hblks): 0 байтов в отображённых областях (hblkhd): 0 максимальное количество выделенного пространства (usmblks): 0 свободных байт в fastbins (fsmblks): 0 полное выделенное пространство (uordblks): 104000 полное свободное пространство (fordblks): 31168 освобождаемых блоков сверху (keepcost): 31168 ============== после освобождения блоков ============== всего неотображённых байт (часть): 135168 кол-во свободных порций (ordblks): 501 кол-во свободных блоков fastbin (smblks): 0 кол-во отображённых областей (hblks): 0 байтов в отображённых областях (hblkhd): 0 максимальное количество выделенного пространства (usmblks): 0 свободных байт в fastbins (fsmblks): 0 полное выделенное пространство (uordblks): 52000 полное свободное пространство (fordblks): 83168 освобождаемых блоков сверху (keepcost): 31168
#include <malloc.h> #include <stdlib.h> #include <string.h> static void display_mallinfo(void) { struct mallinfo mi; mi = mallinfo(); printf("всего неотображённых байт (часть): %d\n", mi.arena); printf("кол-во свободных порций (ordblks): %d\n", mi.ordblks); printf("кол-во свободных блоков fastbin (smblks): %d\n", mi.smblks); printf("кол-во отображённых областей (hblks): %d\n", mi.hblks); printf("байтов в отображённых областях (hblkhd): %d\n", mi.hblkhd); printf("максимальное количество выделенного пространства (usmblks): %d\n", mi.usmblks); printf("свободных байт в fastbins (fsmblks): %d\n", mi.fsmblks); printf("полное выделенное пространство (uordblks): %d\n", mi.uordblks); printf("полное свободное пространство (fordblks): %d\n", mi.fordblks); printf("освобождаемых блоков сверху (keepcost): %d\n", mi.keepcost); } int main(int argc, char *argv[]) { #define MAX_ALLOCS 2000000 char *alloc[MAX_ALLOCS]; int numBlocks, j, freeBegin, freeEnd, freeStep; size_t blockSize; if (argc < 3 || strcmp(argv[1], "--help") == 0) { fprintf(stderr, "%s кол-во блоков размер блока [шаг освобождения" "[начало освобождения [конец освобождения]]]\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("============== перед выделением блоков ==============\n"); display_mallinfo(); for (j = 0; j < numBlocks; j++) { if (numBlocks >= MAX_ALLOCS) { fprintf(stderr, "слишком много выделений\n"); exit(EXIT_FAILURE); } alloc[j] = malloc(blockSize); if (alloc[j] == NULL) { perror("malloc"); exit(EXIT_FAILURE); } } printf("\n============== после выделения блоков ==============\n"); display_mallinfo(); for (j = freeBegin; j < freeEnd; j += freeStep) free(alloc[j]); printf("\n============== после освобождения блоков ==============\n"); display_mallinfo(); exit(EXIT_SUCCESS); }
mmap(2), malloc(3), malloc_info(3), malloc_stats(3), malloc_trim(3), mallopt(3)
2019-03-06 | Linux |