Обнулить большое отображение памяти с помощью "madvise"

У меня есть следующая проблема:

Я выделяю большой кусок памяти (несколько ГиБ) черезmmap сMAP_ANONYMOUS, Этот кусок содержит большую хэш-карту, которую нужно время от времени обнулять. Не каждое отображение может использоваться в каждом раунде (не каждая страница имеет ошибки), поэтомуmemset не очень хорошая идея - занимает слишком много времени.

Какова лучшая стратегия, чтобы сделать это быстро?

Будет

madvise(ptr, length, MADV_DONTNEED);

гарантируете мне, что любой последующий доступ предоставит новые пустые страницы?

Из Linuxman madvise страница:

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

...

MADV_DONTNEED

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

...

Текущая реализация Linux (2.4.0) рассматривает этот системный вызов скорее как команду, чем как совет ...

Или я долженmunmap и переназначить регион заново?

Он должен работать в Linux и в идеале иметь такое же поведение в OS X.

Ответы на вопрос(3)

Ваш ответ на вопрос