Scroll to navigation

MALLINFO(3) Руководство программиста Linux MALLINFO(3)

ИМЯ

mallinfo — возвращает информацию о выделении памяти

СИНТАКСИС

#include <malloc.h>

struct mallinfo mallinfo(void);

ОПИСАНИЕ

Функция mallinfo() возвращает копию структуры, содержащую информацию о выделении памяти, выполненной функцией malloc(3) и связанными с ней функциями.

Заметим, что не все приложения видимы в mallinfo(); смотрите ДЕФЕКТЫ и вместо неё используйте malloc_info(3).

Возвращаемая структура определена следующим образом:


struct mallinfo {

int arena; /* Non-mmapped space allocated (bytes) */
int ordblks; /* Number of free chunks */
int smblks; /* Number of free fastbin blocks */
int hblks; /* Number of mmapped regions */
int hblkhd; /* Space allocated in mmapped regions (bytes) */
int usmblks; /* See below */
int fsmblks; /* Space in freed fastbin blocks (bytes) */
int uordblks; /* Total allocated space (bytes) */
int fordblks; /* Total free space (bytes) */
int keepcost; /* Top-most, releasable space (bytes) */ };

Поля структуры mallinfo содержат следующую информацию:

Общее количество памяти, выделенной способами отличными от mmap(2) (т. е., память, выделенная из кучи). Это значение включает используемые и свободные блоки из списка.
Количество обычных (т. е., не fastbin) свободных блоков.
Количество свободных блоков fastbin (смотрите mallopt(3)).
Количество блоков, выделенных с помощью mmap(2) на настоящий момент (смотрите описание M_MMAP_THRESHOLD в mallopt(3)).
Количество байт в блоках, выделенных с помощью mmap(2) на настоящий момент.
This field is unused, and is always 0. Historically, it was the "highwater mark" for allocated space—that is, the maximum amount of space that was ever allocated (in bytes); this field was maintained only in nonthreading environments.
Общее количество байт в свободных блоках fastbin.
Общее количество байт, в используемой выделенной памяти.
Общее количество байт в свободных блоках.
Общее количество освобождаемого свободного пространства сверху кучи. Это значение является максимальным количеством байт, которое будет освобождено 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, 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 (int j = 0; j < numBlocks; j++) {
if (numBlocks >= MAX_ALLOCS) {
fprintf(stderr, "Too many allocations\n");
exit(EXIT_FAILURE);
}
alloc[j] = malloc(blockSize);
if (alloc[j] == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
}
printf("\n============== после выделения блоков ==============\n");
display_mallinfo();
for (int 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)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан 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 версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

1 ноября 2020 г. Linux