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 содержат следующую информацию:

arena
    Общее количество памяти, выделенной способами отличными от mmap(2) (т. е., память, выделенная из кучи). Это значение включает используемые и свободные блоки из списка.

ordblks
    Количество обычных (т. е., не fastbin) свободных блоков.

smblks
    Количество свободных блоков fastbin (смотрите mallopt(3)).

hblks
    Количество блоков, выделенных с помощью mmap(2) на настоящий момент (смотрите описание M_MMAP_THRESHOLD в mallopt(3)).

hblkhd
    Количество байт в блоках, выделенных с помощью mmap(2) на настоящий момент.

usmblks
    «Верхняя отметка» выделенного пространства, то есть максимальное количество места, которое когда-либо выделялось. Это поле изменяется только в окружениях без нитей.

fsmblks
    Общее количество байт в свободных блоках fastbin.

uordblks
    Общее количество байт, в используемой выделенной памяти.

fordblks
    Общее количество байт в свободных блоках.

keepcost
    Общее количество освобождаемого свободного пространства сверху кучи. Это значение является максимальным количеством байт, которое будет освобождено malloc_trim(3) в идеальном случае (т. е., без учёта ограничений по выравниванию и т. п.).

АТРИБУТЫ
Описание терминов данного раздела смотрите в 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)