Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Malloc )
Перейти к навигации Перейти к поиску

Распределение динамической памяти C относится к выполнению ручного управления памятью для распределения динамической памяти на языке программирования C через группу функций в стандартной библиотеке C , а именно malloc , realloc , calloc и free . [1] [2] [3]

Язык программирования C ++ включает эти функции; однако операторы new и delete предоставляют аналогичные функции и рекомендуются авторами этого языка. [4] Тем не менее, есть несколько ситуаций, в которых использование не применимо, например, код сборки мусора или код, чувствительный к производительности, и вместо оператора более высокого уровня может потребоваться комбинация и .new/deletemallocplacement newnew

Доступно множество различных реализаций фактического механизма распределения памяти, используемого malloc . Их производительность зависит как от времени выполнения, так и от требуемой памяти.

Обоснование [ править ]

Язык программирования C управляет памятью статически , автоматически или динамически . Переменные статической продолжительности выделяются в основной памяти, обычно вместе с исполняемым кодом программы, и сохраняются в течение всего времени существования программы; переменные с автоматической продолжительностью выделяются в стеке и приходят и уходят, когда функции вызываются и возвращаются. Для переменных static-duration и automatic-duration размер выделения должен быть константой времени компиляции (за исключением случая автоматических массивов переменной длины [5] ). Если требуемый размер неизвестен до времени выполнения (например, если данные произвольного размера считываются от пользователя или из файла на диске), то использование объектов данных фиксированного размера неадекватно.

Время жизни выделенной памяти также может вызывать беспокойство. Ни статическая, ни автоматическая память продолжительности не подходят для всех ситуаций. Автоматически распределенные данные не могут сохраняться при нескольких вызовах функций, в то время как статические данные сохраняются в течение всего срока службы программы, нужны они или нет. Во многих ситуациях программисту требуется большая гибкость в управлении временем жизни выделенной памяти.

Этих ограничений можно избежать с помощью динамического распределения памяти , при котором память управляется более явно (но более гибко), обычно путем выделения ее из свободного хранилища (неофициально называемого «куча»), области памяти, структурированной для этой цели. В C функция библиотеки mallocиспользуется для выделения блока памяти в куче. Программа обращается к этому блоку памяти через указатель , что mallocвозвращает. Когда память больше не нужна, передается указатель, freeкоторый освобождает память, чтобы ее можно было использовать для других целей.

В исходном описании C указано, что callocи cfreeбыли в стандартной библиотеке, но нет malloc. Код для простой модели реализации диспетчера хранилища для Unix был дан вместе с функциями пользовательского интерфейса allocи freeв качестве функций пользовательского интерфейса, а также с использованием sbrkсистемного вызова для запроса памяти у операционной системы. [6] Документация Unix 6- го издания дает allocи freeв качестве низкоуровневых функций распределения памяти. [7]malloc и freeподпрограммы в их современном виде полностью описаны в руководстве 7 издание Unix. [8] [9]

Некоторые платформы предоставляют вызовы библиотек или встроенных функций, которые позволяют динамическое выделение памяти во время выполнения из стека C, а не из кучи (например, alloca()[10] ). Эта память автоматически освобождается, когда вызывающая функция завершается.

Обзор функций [ править ]

Функции распределения динамической памяти C определены в stdlib.hзаголовке ( cstdlibзаголовок в C ++). [1]

Различия между malloc()и calloc()[ править ]

  • malloc()принимает один аргумент (объем выделяемой памяти в байтах), тогда как calloc()требует два аргумента (количество переменных, выделяемых в памяти, и размер одной переменной в байтах).
  • malloc()не инициализирует выделенную память, при этом calloc()гарантирует, что все байты выделенного блока памяти были инициализированы в 0.
  • В некоторых операционных системах это calloc()может быть реализовано путем первоначального указания всех страниц виртуальных адресов выделенной памяти на страницу со всеми нулями только для чтения и выделения физических страниц только для чтения и записи при записи виртуальных адресов, метод, называемый copy- по-писать .

Пример использования [ править ]

Создать массив из десяти целых чисел с автоматической областью видимости в C просто:

int  array [ 10 ];

Однако размер массива фиксируется во время компиляции. Если кто-то желает динамически разместить подобный массив, можно использовать следующий код:

int  * array  =  malloc ( 10  *  sizeof ( int ));

Это вычисляет количество байтов, которые десять целых чисел занимают в памяти, затем запрашивает это количество байтов mallocи присваивает результат указателю с именем array(из-за синтаксиса C указатели и массивы могут использоваться взаимозаменяемо в некоторых ситуациях).

Поскольку mallocможет оказаться невозможным обработать запрос, он может вернуть нулевой указатель, и рекомендуется проверить это на практике:

int  * array  =  malloc ( 10  *  sizeof ( int )); если  ( массив  ==  NULL )  {  fprintf ( stderr ,  "сбой malloc \ n " );  возврат  -1 ; }

Когда программе больше не нужен динамический массив , она должна в конечном итоге вызвать, freeчтобы вернуть память, которую она занимает, в свободное хранилище:

бесплатно ( массив );

Отложенная память mallocне инициализируется и может содержать мусор : остатки ранее использованных и отброшенных данных. После выделения с mallocэлементами массива являются неинициализированные переменные . Команда callocвернет выделение, которое уже было очищено:

int  * array  =  calloc ( 10 ,  sizeof ( int ));

С помощью realloc мы можем изменить размер памяти, на которую указывает указатель. Например, если у нас есть указатель, действующий как массив размера, и мы хотим изменить его на массив размера , мы можем использовать realloc.

int  * arr  =  malloc ( 2  *  sizeof ( int )); arr [ 0 ]  =  1 ; arr [ 1 ]  =  2 ; arr  =  realloc ( arr ,  3  *  sizeof ( int )); arr [ 2 ]  =  3 ;

Обратите внимание, что при перераспределении следует предполагать изменение базового адреса блока (т. Е. Если он не смог увеличить размер исходного блока и, следовательно, выделил новый больший блок в другом месте и скопировал в него старое содержимое). Следовательно, любые указатели на адреса в исходном блоке также больше не действительны.

Типовая безопасность [ править ]

mallocвозвращает указатель void ( void *), который указывает, что это указатель на область неизвестного типа данных. Использование приведения типов требуется в C ++ из-за строгой системы типов, тогда как в C. это не относится к C. Можно "привести" (см. Преобразование типов ) этот указатель к определенному типу:

int  * ptr ; ptr  =  malloc ( 10  *  sizeof ( * ptr )); / * без приведения * / ptr  =  ( int  * ) malloc ( 10  *  sizeof ( * ptr )); / * с приведением * /

У выполнения такой гипсовой повязки есть свои преимущества и недостатки.

Преимущества кастинга [ править ]

  • Включение приведения может позволить программе или функции C компилироваться как C ++.
  • Актерский позволяет предварительно 1989-версий о mallocтом , что первоначально вернулся через char *. [11]
  • Приведение может помочь разработчику выявить несоответствия в выборе размера типа при изменении типа указателя назначения, особенно если указатель объявлен далеко от malloc()вызова (хотя современные компиляторы и статические анализаторы могут предупреждать о таком поведении, не требуя приведения [12] ).

Недостатки литья [ править ]

  • Согласно стандарту C приведение типов является избыточным.
  • Добавление броска может замаскировать неспособность включать заголовок stdlib.h, в котором прототип функции для mallocнайден. [11] [13] В отсутствие прототипа mallocстандарт C90 требует, чтобы компилятор C предполагал, что mallocвозвращает int. Если приведение отсутствует, C90 требует диагностики, когда это целое число присваивается указателю; однако, с приведением, эта диагностика не будет произведена, что скроет ошибку. На определенных архитектурах и моделях данных (например, LP64 в 64-битных системах, где longи указатели являются 64-битными и int32-битными) эта ошибка может фактически привести к неопределенному поведению, поскольку неявно объявленоmallocвозвращает 32-битное значение, тогда как фактически определенная функция возвращает 64-битное значение. В зависимости от соглашений о вызовах и разметки памяти это может привести к разбиению стека . Эта проблема вряд ли останется незамеченной в современных компиляторах, поскольку C99 не допускает неявных объявлений, поэтому компилятор должен произвести диагностику, даже если он предполагает intвозврат.
  • Если тип указателя изменяется при его объявлении, может также потребоваться изменить все строки, в которых mallocвызывается и выполняется приведение.

Распространенные ошибки [ править ]

Неправильное использование динамического распределения памяти часто может быть источником ошибок. Это могут быть ошибки безопасности или сбои программы, чаще всего из-за ошибок сегментации .

Наиболее частые ошибки следующие: [14]

Не проверять наличие сбоев при распределении
Не гарантируется, что выделение памяти будет успешным, и вместо этого может быть возвращен нулевой указатель. Использование возвращенного значения без проверки успешности выделения вызывает неопределенное поведение . Обычно это приводит к сбою (из-за результирующей ошибки сегментации при разыменовании нулевого указателя), но нет гарантии, что сбой произойдет, поэтому полагаться на это также может привести к проблемам.
Утечки памяти
Невозможность освободить память с помощью freeприводит к накоплению не подлежащей повторному использованию памяти, которая больше не используется программой. Это тратит ресурсы памяти и может привести к сбоям выделения, когда эти ресурсы исчерпаны.
Логические ошибки
Все распределения должны следовать одному и тому же шаблону: использование выделения malloc, использование для хранения данных, использование освобождения free. Несоблюдение этого шаблона, например использование памяти после вызова free( висячий указатель ) или перед вызовом malloc( дикий указатель ), freeдвойной вызов («двойной свободный») и т. Д., Обычно вызывает ошибку сегментации и приводит к сбой программы. Эти ошибки могут быть временными и трудными для отладки - например, освобожденная память обычно не сразу восстанавливается ОС, и, таким образом, висячие указатели могут сохраняться некоторое время и, по всей видимости, работать.

Кроме того, в качестве интерфейса, предшествующего стандартизации ANSI C, mallocи друзья имеют поведение, которое намеренно оставлено на усмотрение реализации, чтобы определить их для себя. Одним из них является распределение нулевой длины, с которым возникает большая проблема, reallocпоскольку чаще всего устанавливается нулевой размер. [15] Хотя и POSIX, и Single Unix Specification требуют надлежащей обработки выделений нулевого размера путем возврата NULLили чего-то еще, что может быть безопасно освобождено, [16] не все платформы обязаны соблюдать эти правила. Среди множества ошибок, к которым это привело, особенно выделялся WhatsApp RCE 2019 года . [17]Чтобы сделать эти функции более безопасными, можно обернуть эти функции в оболочку, просто проверив выделения размера 0 и превратив их в выделения размера 1. (Возврат NULLимеет свои собственные проблемы: в противном случае он указывает на сбой нехватки памяти. В случае reallocэто означало бы, что исходная память не была перемещена и освобождена, что опять же не относится к размеру 0, что приводит к двойному освобождению.) [18]

Реализации [ править ]

Реализация управления памятью во многом зависит от операционной системы и архитектуры. Некоторые операционные системы предоставляют распределитель памяти для malloc, в то время как другие предоставляют функции для управления определенными областями данных. Один и тот же распределитель динамической памяти часто используется для реализации как mallocоператора, так и оператора newв C ++ . [19]

На основе кучи [ править ]

Реализация распределителя обычно выполняется с использованием кучи или сегмента данных . Распределитель обычно расширяет и сжимает кучу для выполнения запросов на выделение.

Метод кучи страдает несколькими внутренними недостатками, полностью проистекающими из фрагментации.. Как и любой метод распределения памяти, куча становится фрагментированной; то есть в выделенном пространстве в куче будут разделы используемой и неиспользуемой памяти. Хороший распределитель попытается найти неиспользуемую область уже выделенной памяти для использования, прежде чем прибегать к расширению кучи. Основная проблема этого метода заключается в том, что куча имеет только два важных атрибута: основание или начало кучи в пространстве виртуальной памяти; и длина, или ее размер. Куча требует достаточно системной памяти, чтобы заполнить всю ее длину, и ее база никогда не может измениться. Таким образом, любые большие площади неиспользуемой памяти тратятся впустую. Куча может «застрять» в этом положении, если в конце кучи существует небольшой использованный сегмент, который может привести к потере любого количества адресного пространства. В схемах ленивого распределения памяти,такие как те, которые часто встречаются в операционной системе Linux, большая куча не обязательно резервирует эквивалентную системную память; он будет делать это только при первой записи (чтение неотображенных страниц памяти возвращает ноль). Степень детализации зависит от размера страницы.

dlmalloc и ptmalloc[ редактировать ]

Дуг Ли разработал общедоступный домен dlmalloc («Doug Lea's Malloc») как универсальный распределитель памяти, начиная с 1987 года. Библиотека GNU C (glibc) является производной от ptmalloc Вольфрама Глогера («pthreads malloc»), форка dlmalloc. с улучшениями, связанными с потоками. [20] [21] [22] По состоянию на ноябрь 2019 г. последней версией dlmalloc является версия 2.8.6 от августа 2012 г. [23]

dlmalloc - это распределитель граничных тегов. Память в куче выделяется в виде «блоков», 8-байтовой выровненной структуры данных, которая содержит заголовок и полезную память. Выделенная память содержит 8- или 16-байтовые накладные расходы на размер блока и флаги использования (аналогично вектору допинга ). Нераспределенные фрагменты также хранят указатели на другие свободные фрагменты в области полезного пространства, поэтому минимальный размер фрагмента составляет 16 байтов в 32-битных системах и 24/32 (зависит от выравнивания) байтов в 64-битных системах. [21] [23] ( 2.8.6, минимальный выделенный размер )

Нераспределенная память группируется в « бункеры » одинакового размера, реализуемые с помощью двусвязного списка блоков (с указателями, хранящимися в нераспределенном пространстве внутри блока). Бункеры сортируются по размеру в три класса: [21] [23] ( Наложенные структуры данных )

  • Для запросов размером менее 256 байт (запрос "smallbin") используется простой распределитель наилучшего соответствия с двумя степенями мощности. Если в этом бункере нет свободных блоков, блок из следующего самого высокого бункера разделяется на две части.
  • Для запросов по 256 байт или выше , но ниже MMAP порога, так как dlmalloc v2.8.0 использовать в-место побитового Trie алгоритма ( «treebin»). Если для удовлетворения запроса не осталось свободного места, dlmalloc пытается увеличить размер кучи, обычно с помощью системного вызова brk . Эта функция была введена после создания ptmalloc (из v2.7.x) и, как следствие, не является частью glibc, которая наследует старый наилучший распределитель.
  • Для запросов, превышающих пороговое значение mmap (запрос "большой корзины"), память всегда выделяется с помощью системного вызова mmap . Порог обычно составляет 256 КБ. [24] Метод mmap предотвращает проблемы с огромными буферами, улавливающими небольшое выделение в конце после их истечения, но всегда выделяет целую страницу памяти, которая на многих архитектурах имеет размер 4096 байт. [25]

Разработчик игр Адриан Стоун утверждает, что dlmallocкак распределитель граничных тегов недружелюбен для консольных систем, которые имеют виртуальную память, но не имеют подкачки по запросу . Это связано с тем, что его обратные вызовы для сжатия и увеличения пула (sysmalloc / systrim) не могут использоваться для выделения и фиксации отдельных страниц виртуальной памяти. В отсутствие пейджинга по запросу фрагментация становится более серьезной проблемой. [26]

Jemalloc FreeBSD и NetBSD [ править ]

Начиная с FreeBSD 7.0 и NetBSD 5.0, старая mallocреализация (phkmalloc) была заменена jemalloc , написанной Джейсоном Эвансом. Основной причиной этого была недостаточная масштабируемость phkmalloc с точки зрения многопоточности. Чтобы избежать конфликта блокировок, jemalloc использует отдельные «арены» для каждого процессора . Эксперименты по измерению количества выделений в секунду в многопоточном приложении показали, что это позволяет линейно масштабировать его с количеством потоков, в то время как производительность как для phkmalloc, так и для dlmalloc была обратно пропорциональна количеству потоков. [27]

OpenBSD malloc [ править ]

Реализация этой mallocфункции в OpenBSD использует mmap . Для запросов размером больше одной страницы все выделение извлекается с помощью mmap; меньшие размеры назначаются из пулов памяти, обслуживаемых mallocнесколькими «страницами корзины», которые также выделяются с помощью mmap. [28] [ необходим лучший источник ] При вызове free, память освобождается и не отображается из адресного пространства процесса с помощью munmap. Эта система разработана для повышения безопасности за счет использования преимуществ рандомизации адресного пространства и функций страниц с пропусками, реализованных как часть системного вызова OpenBSD.mmap и для обнаружения ошибок использования после освобождения - поскольку большой объем памяти полностью не отображается после его освобождения, дальнейшее использование вызывает ошибку сегментации и завершение программы.

Хранить маллок [ править ]

Hoard - это распределитель, целью которого является масштабируемая производительность выделения памяти. Подобно распределителю OpenBSD, Hoard использует mmapисключительно память, но управляет ее фрагментами по 64 килобайта, называемыми суперблоками. Куча Hoard логически разделена на одну глобальную кучу и несколько куч для каждого процессора. Кроме того, существует локальный кэш потока, который может содержать ограниченное количество суперблоков. Распределяя только из суперблоков в локальной куче для каждого потока или процессора и перемещая в основном пустые суперблоки в глобальную кучу, чтобы их можно было повторно использовать другими процессорами, Hoard сохраняет низкий уровень фрагментации, обеспечивая при этом почти линейную масштабируемость с количеством потоков. . [29]

mimalloc [ править ]

С открытым исходным кодом компактного универсальной памяти Распределителя от Microsoft Research с акцентом на производительности. [30] Библиотека составляет около 11 000 строк кода .

Malloc кэширования потоков (tcmalloc) [ править ]

Каждый поток имеет локальное хранилище для небольших выделений. Для больших выделений можно использовать mmap или sbrk . TCMalloc , malloc, разработанный Google [31], имеет сборку мусора для локального хранения мертвых потоков. TCMalloc считается более чем в два раза быстрее, чем ptmalloc в glibc для многопоточных программ. [32] [33]

Внутри ядра [ править ]

Операционные системы ядро должно выделять память точно также , как прикладные программы. Однако реализация mallocвнутри ядра часто значительно отличается от реализаций, используемых библиотеками C. Например, буферам памяти может потребоваться соответствие особым ограничениям, налагаемым DMA , или функция выделения памяти может быть вызвана из контекста прерывания. [34] Это требует mallocреализации, тесно интегрированной с подсистемой виртуальной памяти ядра операционной системы.

Переопределение malloc [ править ]

Поскольку mallocи его родственники могут иметь сильное влияние на производительность программы, нередко переопределяют функции для конкретного приложения с помощью пользовательских реализаций, оптимизированных для шаблонов распределения приложений. Стандарт C не предоставляет возможности сделать это, но операционные системы нашли различные способы сделать это, используя динамическое связывание. Один из способов - просто связать другую библиотеку, чтобы переопределить символы. Другой, используемый Unix System V.3 , - создание mallocи freeуказатели функций, которые приложение может сбросить на пользовательские функции. [35]

Ограничения размера размещения [ править ]

Максимально возможный mallocразмер блока памяти зависит от хост-системы, в частности от размера физической памяти и реализации операционной системы.

Теоретически наибольшее число должно быть максимальным значением, которое может храниться в size_tтипе, который представляет собой зависящее от реализации целое число без знака, представляющее размер области памяти. В стандарте C99 и более поздних версиях он доступен как SIZE_MAXконстанта из <stdint.h>. Хотя это не гарантируется ISO C , обычно это так .2^(CHAR_BIT * sizeof(size_t)) - 1

В системах glibc максимально возможный блок памяти mallocсоставляет половину этого размера, а именно . [36]2^(CHAR_BIT * sizeof(ptrdiff_t) - 1) - 1

Расширения и альтернативы [ править ]

Реализации библиотеки C, поставляемые с различными операционными системами и компиляторами, могут поставляться с альтернативами и расширениями стандартного mallocинтерфейса. Среди них следует отметить:

  • alloca, который выделяет запрошенное количество байтов в стеке вызовов . Соответствующей функции освобождения не существует, так как обычно память освобождается, как только вызывающая функция возвращается. allocaприсутствовал в системах Unix еще в 32 / V (1978), но его использование может быть проблематичным в некоторых (например, встроенных) контекстах. [37] Хотя он поддерживается многими компиляторами, он не является частью стандарта ANSI-C и поэтому не всегда может быть переносимым. Это также может вызвать незначительные проблемы с производительностью: это приводит к кадрам стека переменного размера, поэтому необходимо управлять указателями стека и кадра (с кадрами стека фиксированного размера один из них является избыточным). [38] Большие выделения могут также увеличить риск неопределенного поведения из-за переполнения стека . [39] C99 предлагал массивы переменной длины в качестве альтернативного механизма распределения стека, однако в более позднем стандарте C11 эта функция была отнесена к необязательной .
  • POSIX определяет функцию, posix_memalignкоторая выделяет память с выравниванием, указанным вызывающей стороной. Его выделения освобождаются free, [40] поэтому реализация обычно должна быть частью библиотеки malloc.

См. Также [ править ]

  • Переполнение буфера
  • Отладчик памяти
  • Защита памяти
  • Размер страницы
  • Массив переменной длины

Ссылки [ править ]

  1. ^ a b Спецификация ISO / IEC 9899: 1999 (PDF) . п. 313, § 7.20.3 «Функции управления памятью».
  2. ^ Годсе, Атул П .; Годсе, Дипали А. (2008). Advanced программирования C . п. 6-28: Технические публикации. п. 400. ISBN 978-81-8431-496-0.CS1 maint: location ( ссылка )
  3. ^ Саммит, Стив. «Глава 11: Распределение памяти» . C Программирование Notes . Проверено 11 июля 2020 .
  4. ^ Страуструп, Бьярне (2008). Программирование: принципы и практика использования C ++ . 1009, §27.4 Бесплатный магазин : Addison Wesley. п. 1236. ISBN 978-0-321-54372-1.CS1 maint: location ( ссылка )
  5. ^ "Руководство по gcc" . gnu.org . Проверено 14 декабря 2008 .
  6. ^ Брайан В. Керниган, Деннис М. Ричи, Язык программирования C , Прентис-Холл, 1978; Раздел 7.9 (стр. 156) описываетcallocиcfree, а Раздел 8.7 (стр. 173) описывает реализацию дляallocиfree.
  7. ^ alloc(3)  -  Версия 6 Руководство программиста Unix
  8. ^ malloc(3)  -  Версия 7 Руководство программиста Unix
  9. ^ Аноним, Руководство программиста Unix, Vol. 1 , Holt Reinhart and Winston, 1983 (авторские права принадлежат Bell Telephone Laboratories, 1983, 1979); manСтраница дляmallocт. Д.Приведенана странице 275.
  10. ^ alloca(3)  -  Руководство по функциям библиотеки FreeBSD
  11. ^ a b "Отливка malloc" . Cprogramming.com . Проверено 9 марта 2007 .
  12. ^ "clang: lib / StaticAnalyzer / Checkers / MallocSizeofChecker.cpp Исходный файл" . clang.llvm.org . Проверено 1 апреля 2018 .
  13. ^ "comp.lang.c FAQ list · Вопрос 7.7b" . C-FAQ . Проверено 9 марта 2007 .
  14. ^ Reek, Кеннет (1997-08-04). Указатели на C (1-е изд.). Пирсон. ISBN 9780673999863.
  15. ^ «MEM04-C. Остерегайтесь распределений нулевой длины - SEI CERT Coding Standard - Confluence» . wiki.sei.cmu.edu .
  16. ^ "POSIX.1-2017: malloc" . pubs.opengroup.org . Проверено 29 ноября 2019 .
  17. ^ Проснулся. «Как ошибка двойного освобождения в WhatsApp превращается в RCE» . Проверено 29 ноября 2019 .
  18. ^ Felker, Rich (2019-10-03). «Вау. WhatsApp RCE был неправильным поведением для realloc (p, 0), на котором настаивают многие реализации. Https://twitter.com/ottom6k/status/1179623539726524417…» . Twitter . Проверено 29 ноября 2019 . Внешняя ссылка в |title=( помощь )
  19. Александреску, Андрей (2001). Современный дизайн C ++: применение общих шаблонов программирования и проектирования . Эддисон-Уэсли. п. 78.
  20. ^ "Домашняя страница malloc Вольфрама Глогера" . malloc.de . Проверено 1 апреля 2018 .
  21. ^ a b c Кемпф, Мишель (2001). "Уловки Vudo malloc" . Phrack (57): 8. Архивировано 22 января 2009 года . Проверено 29 апреля 2009 .
  22. ^ "Glibc: Malloc Internals" . sourceware.org Trac . Проверено 1 декабря 2019 .
  23. ^ a b c Ли, Дуг. «Распределитель памяти» . Проверено 1 декабря 2019 . HTTP для исходного кода
  24. ^ "Настраиваемые параметры Malloc" . GNU . Проверено 2 мая 2009 .
  25. ^ Сандерсон, Брюс (2004-12-12). «ОЗУ, виртуальная память, файл подкачки и все такое» . Справка и поддержка Microsoft.
  26. ^ Стоун, Адриан. «Дыра, которую длмаллок не может заполнить» . Игра Angst . Проверено 1 декабря 2019 .
  27. ^ Эванс, Джейсон (2006-04-16). «Масштабируемая параллельная реализация malloc (3) для FreeBSD» (PDF) . Проверено 18 марта 2012 .
  28. ^ "libc / stdlib / malloc.c" . Перекрестная ссылка BSD, OpenBSD src / lib / .
  29. ^ Бергер, ED; МакКинли, Канзас ; Блюмофе, РД; Уилсон, PR (ноябрь 2000 г.). Hoard: масштабируемый распределитель памяти для многопоточных приложений (PDF) . АСПЛОС -IX. Материалы девятой международной конференции по архитектурной поддержке языков программирования и операционных систем . С. 117–128. CiteSeerX 10.1.1.1.4174 . DOI : 10.1145 / 378993.379232 . ISBN   1-58113-317-0.
  30. ^ Microsoft выпускает оптимизированный malloc () с открытым исходным кодом - Slashdot
  31. ^ Домашняя страница TCMalloc
  32. ^ Гемават, Санджай; Menage, Пол; TCMalloc: Malloc с кэшированием потоков
  33. Каллаган, Марк (18 января 2009 г.). «Высокая доступность MySQL: двойная пропускная способность sysbench с TCMalloc» . Mysqlha.blogspot.com . Проверено 18 сентября 2011 .
  34. ^ "kmalloc () / kfree () include / linux / slab.h" . People.netfilter.org . Проверено 18 сентября 2011 .
  35. ^ Левин, Джон Р. (2000) [октябрь 1999]. «Глава 9: Общие библиотеки» . Линкеры и загрузчики . Серия Морган Кауфманн в программной инженерии и программировании (1-е изд.). Сан-Франциско, США: Морган Кауфманн . ISBN 1-55860-496-0. OCLC  42413382 . ISBN 978-1-55860-496-4 . Архивировано 05 декабря 2012 года . Проверено 12 января 2020 . Код: [1] [2] Ошибки: [3]
  36. ^ "malloc: сделать ошибку malloc с запросами больше, чем PTRDIFF_MAX" . Исходное ПО Bugzilla . 2019-04-18 . Проверено 30 июля 2020 .
  37. ^ "Почему использование alloca () не считается хорошей практикой?" . stackoverflow.com . Проверено 5 января 2016 .
  38. ^ Амарасингхе, Саман; Лейзерсон, Чарльз (2010). «6.172 Разработка технических характеристик программных систем, лекция 10» . MIT OpenCourseWare . Массачусетский Институт Технологий. Архивировано из оригинала на 2015-06-22 . Проверено 27 января 2015 .
  39. ^ "alloca (3) - справочная страница Linux" . man7.org . Проверено 5 января 2016 .
  40. ^ posix_memalign  - Справочник по системным интерфейсам, Единая спецификация UNIX , выпуск 7 от The Open Group

Внешние ссылки [ править ]

  • Определение malloc в стандарте IEEE Std 1003.1
  • Ли, Дуг ; Конструкция основы распределителя glibc
  • Глогер, Вольфрам; Домашняя страница ptmalloc
  • Бергер, Эмери; Домашняя страница The Hoard
  • Дуглас, Найл; Домашняя страница недмаллока
  • Эванс, Джейсон; Домашняя страница jemalloc
  • Простые алгоритмы распределения памяти в сообществе OSDEV
  • Майкл, Магед М .; Масштабируемое распределение динамической памяти без блокировки
  • Бартлетт, Джонатан; Управление внутренней памятью - варианты, компромиссы и реализации динамического распределения
  • Вики-страница с уменьшением памяти (GNOME) с большим количеством информации об исправлении malloc
  • Стандартный проект C99, включая TC1 / TC2 / TC3
  • Некоторые полезные ссылки на C
  • ISO / IEC 9899 - Языки программирования - C
  • Понимание glibc malloc