Пул памяти

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Пул памяти, также называемый выделением блоков фиксированного размера — использование пула(ов) для управления памятью, что обеспечивает динамическое распределение памяти, сопоставимое с функцией malloc или с оператором new на C++. Так как эти реализации страдают от фрагментации, (из-за переменного размера блоков), не рекомендуется использовать их в системах реального времени из-за проблем с производительностью. Более эффективным решением является предварительное выделение нескольких блоков памяти одинакового размера, которые называются пул памяти. Приложении может выделить, использовать, и освобождать блоки предоставленные помощником прямо во время выполнения приложения.

Многие операционные системы реального времени используют пулы памяти, например в Объекте обработки транзакций.

Некоторые системы, такие как веб-сервер Nginx, используют термин пул памяти для обозначения группы операций выделения памяти разного объёма, которая может быть позднее освобождена все целиком за раз. Это также известно как регион; см. управление памятью на уровне регионов.

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

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

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

Пул памяти vs malloc[править]

Преимущества

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

Недостатки

  • Пулы памяти, возможно, должны быть настроены для приложения, которое их использует.

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

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