Как сбросить грязные страницы в mmaped memory и подготовиться к быстрому munmap? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь реализовать распределитель памяти с файловой поддержкой для системы без подкачки.

Для каждого нового выделения я использую 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 это?

1 Ответ

0 голосов
/ 06 марта 2019

Согласно этот вопрос , MADV_DONTNEED делает именно это: отбрасывает страницы без обратной записи в хранилище.

Предложение repopulating the memory contents from the up-to-date contents of the underlying mapped file означает, что загрузка после MADV_DONTNEED будетперезагрузить из черного магазина.

Все грязные страницы до MADV_DONTNEED не были переданы в бэк-склад и поэтому будут потеряны.

В итоге: MADV_DONTNEED удаляет все отображенные страницы (в том числе грязные страницы не передаются в бэк-хранилище) и оставляет бэк-хранилище как есть.

Веселое и информационное видео здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...