Предотвратить фрагментацию памяти - PullRequest
2 голосов
/ 17 февраля 2010

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

Ответы [ 2 ]

1 голос
/ 10 сентября 2011

С MSDN :

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

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

1 голос
/ 17 февраля 2010

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

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

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

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

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

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

  • Если вы все еще используете malloc / free, используйте # define для переопределения malloc и free
  • Если вы используете new / delete, задайте глобальные операторы new и delete

Также взгляните на Как решить проблему фрагментации памяти и мой комментарий на Управление памятью в приложении с интенсивным использованием памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...