Пул памяти
Эта статья включает список литературы , связанную литературу или внешние ссылки , но ее источники остаются неясными, поскольку в ней отсутствуют встроенные цитаты . ( июнь 2014 г. ) |
Пулы памяти , также называемые распределением блоков фиксированного размера , представляют собой использование пулов для управления памятью , которое позволяет осуществлять динамическое распределение памяти . Динамическое распределение памяти может быть достигнуто за счет использования таких методов, как malloc и C++ в оператор new ; хотя устоявшиеся и надежные реализации страдают от фрагментации из-за переменных размеров блоков, их не рекомендуется использовать в системе реального времени из-за производительности. Более эффективное решение — предварительно выделить несколько блоков памяти одинакового размера, называемых пулом памяти . Приложение может выделять, получать доступ и освобождать блоки, представленные дескрипторами , во время выполнения .
Многие операционные системы реального времени используют пулы памяти, такие как Transaction Processing Facility .
Некоторые системы, такие как веб-сервер Nginx , используют термин «пул памяти» для обозначения группы выделений переменного размера, которые позже могут быть полностью освобождены. Это также известно как регион ; см. управление памятью на основе региона .
Простая реализация пула памяти
[ редактировать ]Простой модуль пула памяти может выделить, например, три пула во время компиляции с размерами блоков, оптимизированными для приложения, развертывающего модуль. Приложение может выделять, получать доступ и освобождать память через следующий интерфейс:
- Выделяйте память из пулов. Функция определит пул, в который помещается требуемый блок. Если все блоки этого пула уже зарезервированы, функция пытается найти один из следующих, более крупных пулов. Выделенный блок памяти представлен дескриптором .
- Получите указатель доступа к выделенной памяти.
- Освободите ранее выделенный блок памяти.
- Дескриптор может быть реализован, например, с помощью
unsigned int
. Модуль может интерпретировать дескриптор внутри себя, разделяя его на индекс пула, индекс блока памяти и версию. Индекс пула и блока памяти обеспечивает быстрый доступ к соответствующему блоку с помощью дескриптора, а версия, которая увеличивается при каждом новом выделении, позволяет обнаруживать дескрипторы, блок памяти которых уже освобожден (из-за слишком долгого хранения дескрипторов).
Пул памяти против malloc
[ редактировать ]Преимущества
- Пулы памяти позволяют распределять память с постоянным временем выполнения. Освобождение памяти для тысяч объектов в пуле — это всего лишь одна операция, а не одна за другой, если malloc . для выделения памяти для каждого объекта используется
- Пулы памяти можно сгруппировать в иерархические древовидные структуры, что подходит для специальных структур программирования, таких как циклы и рекурсии .
- Пулам блочной памяти фиксированного размера не требуется хранить метаданные выделения для каждого выделения, описывающие такие характеристики, как размер выделенного блока. Это обеспечивает существенную экономию пространства, особенно при небольших выделениях.
- Обеспечивает детерминированное поведение в системах реального времени, избегая ошибок нехватки памяти.
Недостатки
- Пулы памяти, возможно, потребуется настроить для приложения, которое их развертывает.