Насколько хорошо это распределитель памяти? - PullRequest
1 голос
/ 15 января 2012

Как вы знаете, mmap и malloc недетерминированы в системе с рандомизацией расположения адресного пространства. Чтобы сделать мое распределение памяти детерминированным, я использую mmap, чтобы зарезервировать очень большое адресное пространство (в 64-битной системе) без пространства подкачки, то есть, используя MAP_NORESERVE. Затем, когда мне требуется память, я назначаю 10 МБ пространства, выполняя mmap с MAX_FIXED в этом диапазоне адресного пространства. Поэтому выделенная память растет линейно.

Когда мне нужно free памяти, я просто отключаю ее, используя munmap. Более того, я не использую повторно использованное адресное пространство, а продолжаю выделять его заранее. Полагаю, это ни на что не влияет, поскольку мое адресное пространство (выделенное с помощью mmap с помощью MAP_NORESERVE) в любом случае очень велико.

Теперь вопрос в том, насколько хорош этот распределитель памяти. Это, конечно, не очень умное решение, поскольку оно не может выделить небольшие порции памяти, так как с помощью mmap вы выделяете как минимум 4096 байт памяти, но я думаю, что это все еще вполне работоспособное решение. Что ты думаешь?

Кроме того, что касается случая, когда процесс выделяет память только с коэффициентом 4096. В этом сценарии я думаю, что этот подход не уступает malloc.

EDIT

Обратите внимание, что я говорю о детерминизме в отношении двух идентичных избыточных процессов. Один разветвляется от другого, поэтому он получает начальный адрес области mmaped с помощью MAP_NORESERVE, как я делаю fork впоследствии.

Ответы [ 2 ]

1 голос
/ 16 января 2012

Чтобы сделать мое распределение памяти детерминированным

Более простым решением может быть просто отключить ASLR .

насколько хорошо распределитель памятиЭто.

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

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

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

0 голосов
/ 15 января 2012

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

Но это требование детерминизма странно.Даже если ваше распределение памяти детерминировано, это зависит от ввода.Если процессы делают что-то в несколько ином порядке, результаты будут отличаться.
И если они делают все точно так же, как они избыточны?Если один из них потерпит крах, другой сделает то же самое.

...