Введение

Метод динамического выделения памяти

Пулы памяти, также называемые выделением блоков фиксированного размера, – это использование пулов для управления памятью, позволяющее динамически выделять память. Динамическое выделение памяти можно реализовать с помощью таких методов, как malloc и оператор new в C++; хотя это устоявшиеся и надежные реализации, они подвержены фрагментации из-за переменных размеров блоков, поэтому их не рекомендуется использовать в системах реального времени из-за проблем с производительностью. Более эффективным решением является предварительное выделение нескольких блоков памяти одинакового размера, образующих пул памяти. Приложение может выделять, обращаться и освобождать блоки, представленные дескрипторами во время выполнения. Многие операционные системы реального времени используют пулы памяти, например, Transaction Processing Facility. Некоторые системы, такие как веб-сервер Nginx, используют термин "пул памяти" для обозначения группы выделений переменного размера, которые можно освободить сразу. Это также известно как область; см. управление памятью, основанное на областях.

Простая реализация пула памяти

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

Выделение памяти из пулов. Функция определяет пул, в котором помещается требуемый блок. Если все блоки в этом пуле уже зарезервированы, функция пытается найти блок в следующем пуле большего размера (или в последующих пулах большего размера). Выделенный блок памяти представлен дескриптором. Получение указателя доступа к выделенной памяти. Освобождение ранее выделенного блока памяти. Дескриптор, например, может быть реализован как целое число без знака. Модуль может интерпретировать дескриптор внутренне, разделяя его на индекс пула, индекс блока памяти и номер версии. Индекс пула и блока памяти обеспечивают быстрый доступ к соответствующему блоку по дескриптору, а номер версии, который увеличивается при каждом новом выделении, позволяет обнаруживать дескрипторы, чей блок памяти уже освобожден (из-за слишком долгого хранения дескриптора).