Правильный макет для mempool / памяти распределителя? (какой алгоритм) - PullRequest
3 голосов
/ 18 ноября 2010

Здравствуйте, я думаю о том, чтобы попытаться расширить свои навыки, попробовав некоторые вещи, которые я никогда не делал раньше. Одна вещь, которая всегда меня немного озадачивала, это распределители памяти и пулы памяти. Я хочу взять блок памяти и выделить память из системы только один раз. В настоящее время я настроен, память представляет собой массив байтов (или символов), который равен 65535 для моей цели тестирования.

У меня есть два алгоритма, которые я рассмотрел, используя.

Сначала это алгоритм, в котором весь блок данных добавляется с количеством оставшейся памяти и указателем (или, скорее, смещением) на первый выделенный блок (или заголовок блока), затем каждое выделение предшествует размер выделения, а также предыдущее и следующее распределение, поэтому я могу легко освободить распределение. Затем я могу создать самые большие и самые маленькие блоки, посмотрев на пространство после текущих выделений.

Другой вариант, который у меня есть, - это добавить второе смещение перед выделенной памятью и указать эту точку на первом нераспределенном блоке, тогда каждый нераспределенный блок также имеет распределение «Предыдущий» и «Следующий» вместе с размером, чтобы я мог легко найти место, где моё следующее размещение может быть размещено.

Проблема в том, что я не могу сказать, что является "правильным". Предположим, что у нас будет распределение переменного размера (но большинство будет иметь размер, который не так уж много накладных расходов.) Первый будет медленнее получать самые большие и самые маленькие возможные блоки, но я могу хранить их и манипулировать ими при необходимости чтобы избежать их регенерации. Однако второе заняло бы больше времени для освобождения (из-за необходимости найти, какой освобождает рядом с каким распределителем) и не обязательно дает какие-либо преимущества для распределения. Фактически это потребует более специализированного кода для случая, когда у меня осталось менее 6 байтов (2 байта для размера, 2 для предыдущего смещения, 2 для следующего смещения).

Моя интуиция говорит мне, что первое будет намного лучше, но что-то во втором заманчиво. Есть мнения? Или есть гораздо более простое решение?

1 Ответ

1 голос
/ 18 ноября 2010

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

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