Как вы знаете, mmap
и malloc
недетерминированы в системе с рандомизацией расположения адресного пространства. Чтобы сделать мое распределение памяти детерминированным, я использую mmap
, чтобы зарезервировать очень большое адресное пространство (в 64-битной системе) без пространства подкачки, то есть, используя MAP_NORESERVE. Затем, когда мне требуется память, я назначаю 10 МБ пространства, выполняя mmap
с MAX_FIXED в этом диапазоне адресного пространства. Поэтому выделенная память растет линейно.
Когда мне нужно free
памяти, я просто отключаю ее, используя munmap
. Более того, я не использую повторно использованное адресное пространство, а продолжаю выделять его заранее. Полагаю, это ни на что не влияет, поскольку мое адресное пространство (выделенное с помощью mmap
с помощью MAP_NORESERVE) в любом случае очень велико.
Теперь вопрос в том, насколько хорош этот распределитель памяти. Это, конечно, не очень умное решение, поскольку оно не может выделить небольшие порции памяти, так как с помощью mmap
вы выделяете как минимум 4096 байт памяти, но я думаю, что это все еще вполне работоспособное решение. Что ты думаешь?
Кроме того, что касается случая, когда процесс выделяет память только с коэффициентом 4096. В этом сценарии я думаю, что этот подход не уступает malloc
.
EDIT
Обратите внимание, что я говорю о детерминизме в отношении двух идентичных избыточных процессов. Один разветвляется от другого, поэтому он получает начальный адрес области mmaped с помощью MAP_NORESERVE, как я делаю fork
впоследствии.