.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2012 by Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MALLOPT 3 "9 июня 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ mallopt \- задаёт параметры выделения памяти .SH СИНТАКСИС \fB#include \fP .PP \fBint mallopt(int \fP\fIparam\fP\fB, int \fP\fIvalue\fP\fB);\fP .SH ОПИСАНИЕ Функция \fBmallopt\fP() подстраивает параметры, которые управляют поведением функций выделения памяти (смотрите \fBmalloc\fP(3)). В аргументе \fIparam\fP указывается изменяемый параметр, а в \fIvalue\fP — новое значение этого параметра. .PP В \fIparam\fP можно указать следующие значения: .TP \fBM_ARENA_MAX\fP Если этот параметр не равен нулю, то он определяет жёсткое ограничение на максимальное количество площадок (arenas), которое можно создать. Площадка представляет собой общий набор буферов (pool) памяти, который может использовать вызов \fBmalloc\fP(3) (и подобные) для обслуживания запросов выделения. Площадки безопасны в нитях и поэтому могут использоваться при одновременных запросах выделения. Нужно соблюдать соотношение между количеством нитей и количеством площадок. Чем больше площадок, тем меньше состязаний между нитями, но большее потребление памяти. .IP Значение по умолчанию данного параметра равно 0, то есть ограничение на количество площадок будет определяться по \fBM_ARENA_TEST\fP. .IP Этот параметр доступен начиная с glibc 2.10 при указании \fB\-\-enable\-experimental\-malloc\fP, и начиная с glibc 2.15 — по умолчанию. В некоторых версиях механизм выделения не имел ограничения на количество создаваемых площадок (например, в CentOS 5, RHEL 5). .IP При использовании более новых версий glibc приложения могут, в некоторых случаях, встретить высокую состязательность при доступе к площадкам. В этих случаях может быть выгодно увеличить \fBM_ARENA_MAX\fP для соответствия количеству нитей. Такое поведение подобно стратегиям, используемым tcmalloc и jemalloc (например, общие наборы буферов выделения для каждой нити). .TP \fBM_ARENA_TEST\fP Этим параметром определяется значение на количество создаваемых площадок; в соответствии с ним будут исследоваться системные настройки для оценки жёсткого ограничения на количество создаваемых площадок (определение площадки смотрите в описании \fBM_ARENA_MAX\fP). .IP Вычисленное жёсткое ограничение на площадки определяется реализацией и, обычно, кратно количеству доступных ЦП. После вычисления жёсткого ограничения, результат окончательный и ограничивает общее количество площадок. .IP Значение по умолчанию для параметра \fBM_ARENA_TEST\fP равно 2 в системах, где \fIsizeof(long)\fP равно 4; в противном случае значение по умолчанию равно 8. .IP Этот параметр доступен начиная с glibc 2.10 при указании \fB\-\-enable\-experimental\-malloc\fP, и начиная с glibc 2.15 — по умолчанию. .IP Значение \fBM_ARENA_TEST\fP не используется, если \fBM_ARENA_MAX\fP не равно нулю. .TP \fBM_CHECK_ACTION\fP Значение данного параметра управляет тем, как glibc действует при обнаружении различных программных ошибок (например, освобождение одного указателя дважды). Поведение glibc задаётся тремя битами (2, 1 и 0) указанного значения: .RS .TP Бит 0 Если этот бит установлен, то печатается сообщение в \fIstderr\fP с подробностями ошибки. Сообщение начинается со строки «***\ glibc detected\ ***», далее идёт имя программы, имя функции выделения памяти, в которой возникла ошибка, краткое описание ошибки и адрес памяти, где обнаружена ошибка. .TP Бит 1 Если этот бит установлен, то после печати сообщения об ошибке, если указано битом 0, программа завершается вызовом \fBabort\fP(3). В glibc с версии 2.4, если также установлен бит 0, то между печатью сообщения об ошибке и завершением программа также печатает трассировку стека подобную \fBbacktrace\fP(3), и печатает отображение памяти процесса в стиле \fI/proc/[pid]/maps\fP (смотрите \fBproc\fP(5)). .TP Бит 2 (начиная с glibc 2.4) Этот бит учитывается только если установлен бит 0. Если данный бит установлен, то выдаваемое сообщение об ошибке упрощается до имени функции, где обнаружена ошибка и короткого описания ошибки. .RE .IP Оставшиеся биты в \fIvalue\fP игнорируются. .IP Объединяя выше описанное, получаются следующие числовые значения, влияющие на \fBM_CHECK_ACTION\fP: .RS 12 .IP 0 3 Игнорировать условия ошибки; продолжить выполнение (с неопределенными результатами). .IP 1 Вывести подробное сообщение об ошибке и продолжить выполнение. .IP 2 Прервать программу. .IP 3 Вывести подробное сообщение об ошибке, трассировку стека и отображения памяти, а затем прервать программу. .IP 5 Вывести простое сообщение об ошибке и продолжить выполнение. .IP 7 Вывести простое сообщение об ошибке, трассировку стека и отображения памяти, и прервать программу. .RE .IP Начиная с glibc 2.3.4, значение параметра \fBM_CHECK_ACTION\fP по умолчанию равно 3. В glibc версии 2.3.3 и старее значением по умолчанию было 1. .IP Использование ненулевого значения \fBM_CHECK_ACTION\fP может быть полезно, так как в противном случае падение может случиться позднее и будет сложно отследить реальную причину проблемы. .TP \fBM_MMAP_MAX\fP .\" The following text adapted from comments in the glibc source: Данным параметром задаётся максимальное количество запросов выделения, которые может одновременно выполнить \fBmmap\fP(2). Этот параметр существует, так как в некоторых системах ограничено количество внутренних таблиц, используемых \fBmmap\fP(2), и использование больше определённого количество снижает производительность. .IP По умолчанию значение равно 65536; оно не имеет какого\-то специального обоснования и служит только как предохранитель. Присвоение этому параметру 0 отключает использование \fBmmap\fP(2) для обслуживания запросов больших выделений. .TP \fBM_MMAP_THRESHOLD\fP Для выделений, которые больше или равны \fBM_MMAP_THRESHOLD\fP (в байтах) и не могут быть получены из списка свободных, то функции выделения памяти вместо \fBmmap\fP(2) используют \fBsbrk\fP(2) для увеличения пространства данных программы. .IP Выделяемая с помощью \fBmmap\fP(2) память имеет значительное преимущество в том, что выделенные блоки памяти можно всегда независимо освободить и вернуть системе (по сравнению с кучей, которую можно обрезать только, если память свободна в конце). С другой стороны, есть несколько отрицательных моментов при использовании \fBmmap\fP(2): освобождённое пространство не возвращается в список свободного для повторного выделения позже; память может траться впустую, так как выделения \fBmmap\fP(2) должны быть кратны размеру страницы; ядро должно выполнять ресурсоёмкую задачу по обнулению памяти, выделяемой через \fBmmap\fP(2). Баланс этих факторов учтён в значении по умолчанию для параметра \fBM_MMAP_THRESHOLD\fP — 128*1024. .IP Нижний предел данного параметра равен 0. Верхний предел \fBDEFAULT_MMAP_THRESHOLD_MAX\fP: 512*1024 в 32\-битных системах и \fI4*1024*1024*sizeof(long)\fP в 64\-битных системах. .IP \fIЗамечание:\fP В настоящее время по умолчанию в glibc используется динамический порог mmap. Начальное значение порога — 128*1024, но когда освобождаются блоки больше текущего порога и меньше или равны \fBDEFAULT_MMAP_THRESHOLD_MAX\fP, то порог увеличивается до размера свободного блока. Когда срабатывает динамический порог mmap, порог обрезки кучи также динамически корректируется на двукратное значение динамического порога mmap.Динамическая корректировка порога mmap отключается, если задан параметр \fBM_TRIM_THRESHOLD\fP, \fBM_TOP_PAD\fP, \fBM_MMAP_THRESHOLD\fP или \fBM_MMAP_MAX\fP. .TP \fBM_MXFAST\fP (начиная с glibc 2.3) .\" The following text adapted from comments in the glibc sources: Задаёт верхний порог запросов выделения памяти, которые обрабатываются с помощью «fastbins» (значение параметра измеряется в байтах). Fastbins — это области хранилища, которые содержат освобождённые блоки памяти одного размера и не объединяют смежные свободные блоки. Последующее перераспределение блоков одного размера при выделении из fastbin может обрабатываться очень быстро, хотя из\-за этого может увеличиться фрагментация памяти и общее количество памяти программы. .IP По умолчанию значение параметра равно \fI64*sizeof(size_t)/4\fP (т. е., 64 на 32\-битных архитектурах). Диапазон значений параметра: 0 \- \fI80*sizeof(size_t)/4\fP. Присваивание \fBM_MXFAST\fP значения 0 отключает использование fastbins. .TP \fBM_PERTURB\fP (начиная с glibc 2.4) Если этому параметру присвоено ненулевое значение, то байты выделенной памяти (кроме выделенных через \fBcalloc\fP(3)) инициализируются дополнением значения в наименее значимом байте \fIvalue\fP, и при освобождении памяти с помощью \fBfree\fP(3) освобождённым байтам присваивается значение наименее значимого байта \fIvalue\fP. Это может быть полезно для обнаружения ошибок, когда программа некорректно полагается на то, что выделенная памяти инициализируется нулями или повторно использует значения уже освобождённой памяти. .IP Значение по умолчанию для этого параметра равно 0. .TP \fBM_TOP_PAD\fP Данным параметром определяется количество заполнения при вызове \fBsbrk\fP(2) для изменения пространства данных программы (измеряется в байтах). Данный параметр полезен в следующих случаях: .RS .IP * 3 Когда пространство данных программы увеличивается, то \fBM_TOP_PAD\fP байт добавляется к запросу \fBsbrk\fP(2). .IP * Когда обрезается куча в следствии вызова \fBfree\fP(3) (смотрите описание \fBM_TRIM_THRESHOLD\fP), то это количество пространства предохраняется вверху кучи. .RE .IP В обоих случаях, количество заполнения всегда округляется до границы системной страницы. .IP Изменение \fBM_TOP_PAD\fP — компромисс между увеличением количества системных вызовов (если значение параметра занижено) и тратой неиспользуемой памяти сверху кучи (если значение параметра завышено). .IP .\" DEFAULT_TOP_PAD in glibc source Значение по умолчанию этого параметра равно 128*1024. .TP \fBM_TRIM_THRESHOLD\fP Когда количество непрерывной свободной памяти сверху кучи вырастает до значительных размеров функция \fBfree\fP(3) вызывает \fBsbrk\fP(2) для освобождения этой памяти обратно в систему (это может быть полезно в программах, которые работают длительное время после освобождения значительного количества памяти). Параметром \fBM_TRIM_THRESHOLD\fP задаётся минимальный размер (в байтах), которого должен достигнуть блок памяти, чтобы вызвался \fBsbrk\fP(2) для обрезания кучи. .IP Значение по умолчанию этого параметра равно 128*1024. Установка \fBM_TRIM_THRESHOLD\fP равным \-1 отключает обрезку. .IP .\" Изменение \fBM_TRIM_THRESHOLD\fP — компромисс между увеличением количества системных вызовов (если значение параметра занижено) и тратой неиспользуемой памяти сверху кучи (если значение параметра завышено). .SS "Переменные окружения" Параметры, управляющие \fBmallopt\fP(), можно изменить и через переменные окружения. Использование этих переменных позволяет изменять работу программы без пересборки из исходного кода. В целях эффективной работы эти переменные должны быть определены до первого вызова функции выделения памяти (если этот же параметр изменяется через \fBmallopt\fP(), то вызов \fBmallopt\fP() имеет приоритет). В целях безопасности, эти переменные игнорируются для программ с установленными битами set\-user\-ID и set\-group\-ID. .PP Используются следующие переменные окружения (обратите внимание на подчёркивание в конце некоторых переменных): .TP \fBMALLOC_ARENA_MAX\fP Управляет параметром \fBM_ARENA_MAX\fP, аналогично вызову \fBmallopt\fP(). .TP \fBMALLOC_ARENA_TEST\fP Управляет параметром \fBM_ARENA_TEST\fP, аналогично вызову \fBmallopt\fP(). .TP \fBMALLOC_CHECK_\fP .\" On glibc 2.12/x86, a simple malloc()+free() loop is about 70% slower .\" when MALLOC_CHECK_ was set. Эта переменная окружения управляет тем же параметром что и \fBmallopt\fP() \fBM_CHECK_ACTION\fP. Если эта переменная установлена в ненулевое значение, то будет использоваться особенная реализация функций выделения памяти (это достигается использованием функции \fBmalloc_hook\fP(3)). Эта реализация выполняет дополнительные проверки ошибок, но она медленнее чем стандартный набор функций выделения памяти (эта реализация не способна обнаружить все возможные ошибки; утечки памяти всё ещё возможны). .IP Значение, назначенное этой переменной окружения должно быть одиночной цифрой; их значения описаны в \fBM_CHECK_ACTION\fP. Все символы кроме первой цифры игнорируются. .IP В целях безопасности по умолчанию переменная \fBMALLOC_CHECK_\fP игнорируется для программ с установленными битами set\-user\-ID и set\-group\-ID. Однако, если существует файл \fI/etc/suid\-debug\fP (содержимое файла не важно), то \fBMALLOC_CHECK_\fP учитывается и для программ с установленными битами set\-user\-ID и set\-group\-ID. .TP \fBMALLOC_MMAP_MAX_\fP Управляет параметром \fBM_MMAP_MAX\fP, аналогично вызову \fBmallopt\fP(). .TP \fBMALLOC_MMAP_THRESHOLD_\fP Управляет параметром \fBM_MMAP_THRESHOLD\fP, аналогично вызову \fBmallopt\fP(). .TP \fBMALLOC_PERTURB_\fP Управляет параметром \fBM_PERTURB\fP, аналогично вызову \fBmallopt\fP(). .TP \fBMALLOC_TRIM_THRESHOLD_\fP Управляет параметром \fBM_TRIM_THRESHOLD\fP, аналогично вызову \fBmallopt\fP(). .TP \fBMALLOC_TOP_PAD_\fP Управляет параметром \fBM_TOP_PAD\fP, аналогично вызову \fBmallopt\fP(). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBmallopt\fP() возвращается 1. При ошибке возвращается 0. .SH ОШИБКИ .\" .SH VERSIONS .\" Available already in glibc 2.0, possibly earlier При ошибке значение \fIerrno\fP \fIне\fP изменяется. .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" .\" .SH NOTES Данная функция не описана в POSIX или C. Подобная функция существует во многих ответвлениях System V, но значения \fIparam\fP не совпадают. В SVID определены параметры \fBM_MXFAST\fP, \fBM_NLBLKS\fP, \fBM_GRAIN\fP и \fBM_KEEP\fP, но только первый из них реализован в glibc. .SH ДЕФЕКТЫ Неправильное значение \fIparam\fP не вызывает ошибки. .PP .\" FIXME . This looks buggy: .\" setting the M_MXFAST limit rounds up: (s + SIZE_SZ) & ~MALLOC_ALIGN_MASK) .\" malloc requests are rounded up: .\" (req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK .\" http://sources.redhat.com/bugzilla/show_bug.cgi?id=12129 Ошибка вычисления внутри реализации glibc означает, что вызов: .PP .in +4n .EX mallopt(M_MXFAST, n) .EE .in .PP .\" Bins are multiples of 2 * sizeof(size_t) + sizeof(size_t) не приведёт к тому, что из fastbins будет выделяться память до размера \fIn\fP. Чтобы это сработало, \fIn\fP должно быть округлено до следующего множителя большего или равного \fI(2k+1)*sizeof(size_t)\fP, где \fIk\fP — целое число. .PP .\" FIXME . http://sources.redhat.com/bugzilla/show_bug.cgi?id=12140 Если \fBmallopt\fP() используется для установки \fBM_PERTURB\fP, то, как и ожидалось, байты свободной памяти инициализируются дополнением байта из \fIvalue\fP, и когда эта память освобождается, байты области инициализируются байтом, указанным в \fIvalue\fP. Однако, в реализации есть ошибка выхода за \fIsizeof(size_t)\fP: вместо инициализации точного блока памяти освобождаемом вызовом \fIfree(p)\fP, блок начинает инициализироваться с \fIp+sizeof(size_t)\fP. .SH ПРИМЕРЫ Представленная далее программа показывает использование \fBM_CHECK_ACTION\fP. Если программе передаётся аргумент командной строки (целое число), то этот аргумент используется для установки значения параметра \fBM_CHECK_ACTION\fP. При этом программа выделяет блок памяти и освобождает его дважды (ошибка). .PP Следующий сеанс в оболочке показывает работу программы с glibc и значением по умолчанию для \fBM_CHECK_ACTION\fP: .PP .in +4n .EX $ \fB./a.out\fP main(): возвращение из первого вызова free() *** glibc detected *** ./a.out: double free or corruption (top): 0x09d30008 *** ======= Backtrace: ========= /lib/libc.so.6(+0x6c501)[0x523501] /lib/libc.so.6(+0x6dd70)[0x524d70] /lib/libc.so.6(cfree+0x6d)[0x527e5d] \&./a.out[0x80485db] /lib/libc.so.6(__libc_start_main+0xe7)[0x4cdce7] \&./a.out[0x8048471] ======= Memory map: ======== 001e4000\-001fe000 r\-xp 00000000 08:06 1083555 /lib/libgcc_s.so.1 001fe000\-001ff000 r\-\-p 00019000 08:06 1083555 /lib/libgcc_s.so.1 [some lines omitted] b7814000\-b7817000 rw\-p 00000000 00:00 0 bff53000\-bff74000 rw\-p 00000000 00:00 0 [stack] Aborted (core dumped) .EE .in .PP В этом запуске показаны результаты при других значениях \fBM_CHECK_ACTION\fP: .PP .in +4n .EX $ \fB./a.out 1\fP # показ ошибки и продолжение main(): возвращение из первого вызова free() *** glibc detected *** ./a.out: double free or corruption (top): 0x09cbe008 *** main(): возвращение из второго вызова free() $ \fB./a.out 2\fP # прерывание без показа ошибки main(): возвращение из первого вызова free() Aborted (core dumped) $ \fB./a.out 0\fP # игнорирование ошибки и продолжение main(): возвращение из первого вызова free() main(): возвращение из второго вызова free() .EE .in .PP При этом запуске показано как изменить тот же параметр с помощью переменной окружения \fBMALLOC_CHECK_\fP: .PP .in +4n .EX $ \fBMALLOC_CHECK_=1 ./a.out\fP main(): возвращение из первого вызова free() *** glibc detected *** ./a.out: free(): invalid pointer: 0x092c2008 *** main(): возвращение из второго вызова free() .EE .in .SS "Исходный код программы" \& .EX #include #include #include int main(int argc, char *argv[]) { char *p; if (argc > 1) { if (mallopt(M_CHECK_ACTION, atoi(argv[1])) != 1) { fprintf(stderr, "mallopt() завершилась с ошибкой"); exit(EXIT_FAILURE); } } p = malloc(1000); if (p == NULL) { fprintf(stderr, "malloc() завершилась с ошибкой"); exit(EXIT_FAILURE); } free(p); printf("main(): возвращение из первого вызова free()\en"); free(p); printf("main(): возвращение из второго вызова free()\en"); exit(EXIT_SUCCESS); } .EE .SH "СМ. ТАКЖЕ" .ad l .nh \fBmmap\fP(2), \fBsbrk\fP(2), \fBmallinfo\fP(3), \fBmalloc\fP(3), \fBmalloc_hook\fP(3), \fBmalloc_info\fP(3), \fBmalloc_stats\fP(3), \fBmalloc_trim\fP(3), \fBmcheck\fP(3), \fBmtrace\fP(3), \fBposix_memalign\fP(3) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .