Обнулить большое отображение памяти с помощью "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.