Я пытаюсь реализовать распределитель памяти с файловой поддержкой для системы без подкачки.
Для каждого нового выделения я использую mkstemp
, чтобы создать временный файл в качестве хранилища, mmap
- как MAP_SHARED
, чтобы разрешить подкачку страниц в хранилище, когда нагрузка на систему слишком высока.Я думаю, что эта часть работает.
Однако я испытываю трудности с реализацией дела об освобождении.
Поскольку на момент освобождения ни содержимое бэк-хранилища, нисодержание резидентных страниц или грязных страниц больше не имеет значения, самый быстрый способ сделать это - удалить и освободить все резидентные страницы и оставить бэкстор без изменений.Однако я не нашел флагов madvice
, которые могли бы сделать это.
MADV_DONTNEED
кажется чрезмерным, потому что это приведет к тому, что грязные страницы будут сохранены.(Не верно, см. Ответ ниже)
MADV_DONTNEED
После успешной операции MADV_DONTNEED семантика доступа к памяти в указанном регионе изменяется: последующие обращения к страницам в диапазоне будутвыполнится успешно, но приведет либо к повторному заполнению содержимого памяти из современного содержимого основного отображенного файла (для отображений общих файлов, общих анонимных отображений и методов на основе shmem, таких как сегменты общей памяти System V), либо к нулюСтраницы заполнения по требованию для анонимных частных сопоставлений.
MADV_REMOVE
также кажется чрезмерным, поскольку он не только удаляет резидентные страницы, но и сам бэкстор.
MADV_REMOVE
Освободить заданный диапазон страниц и связанное с ним хранилище резервных копий.Это эквивалентно пробиванию отверстия в соответствующем диапазоне байтов хранилища резервных копий (см. Fallocate (2)).Последующие обращения к указанному диапазону адресов будут видеть байты, содержащие ноль.
Итак, какие шаги являются самым быстрым путем unmap / close / delete mmap
ed файла?
Maybe mmap
тот же регион, что и MAP_PRIVATE
( как этот ), а затем munmap
это?