Память пула

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

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

Многие операционные системы реального времени используют пулы памяти, такие как Transaction Processing Facility .

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

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

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

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

Пул памяти против malloc

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

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

Недостатки

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

Смотрите также

  • Быстрый и эффективный пул памяти фиксированного размера
  • PGroup PJ_POOL_GROUP — документация PJSIP Project 2.14-dev
  • Распределитель памяти
  • Программирование с использованием пулов памяти
Retrieved from "https://en.wikipedia.org/w/index.php?title=Memory_pool&oldid=1253296098"