2010-02-16 3 views
2

Может ли кто-нибудь указать мне на источник или схему, как работает алгоритм для кучи низкой фрагментации?Предотвращение фрагментации памяти

+1

Похоже, что большинство людей читает вопрос так: «Как создать и распределить ресурсы с минимальной фрагментацией?». Но я думаю, что автор означает: «Какой алгоритм использует кучи низкоуглеродистой Windows?» Ответ на этот вопрос не связан с простым поиском. –

ответ

1

Сначала решите, какие «кратные» вы хотите использовать для выделенных блоков памяти. Обычно я использую 8 байтов.

При запуске приложения создайте вектор, в котором каждый элемент в векторе указывает на «пул» блоков памяти. Первый индекс в векторе будет для выделения памяти 8 байтами или меньше. Второй индекс в векторе будет для выделения памяти из 9-16 байтов и т. Д.

В каждом пуле выделяйте память в больших кусках. Например. в пуле для размещения 8 байтов (или меньше) не выделяют 8 байтов, а выделяют N раз 8 байтов. Внутри пула помните, какие части действительно выделены в приложении и какие части просто ждут выделения.

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

Это основная идея. Остальные реализуют пулы (обычно связанные списки кусков).

Сложная часть интегрирует реализацию кучи в приложение.

  • Если вы все еще используете таНос/бесплатно, использовать # определить, чтобы переопределять таНос и бесплатно
  • Если вы используете новые/удалить, определить глобальные новые и удалять операторы

Также обратите внимание на How to solve Memory Fragmentation, и мой комментарий на Memory management in memory intensive application

1

От MSDN:

LFH - это не отдельная куча. Вместо этого это политика, которую приложения могут использовать для своих куч. Когда LFH включен, система выделяет память в определенных предопределенных размерах. Когда приложение запрашивает выделение памяти из кучи с включенным LFH, система выделяет наименьший блок памяти, который достаточно велик, чтобы содержать запрошенный размер.

Эта стратегия используется многими менеджерами по продуктам памяти, хотя детали могут отличаться.

Смежные вопросы