Как сказать Linux, что не нужно записывать страницу mmap () для замены, если необходима резервная физическая страница? - PullRequest
2 голосов
/ 23 декабря 2011

Надеюсь, название понятно.У меня есть кусок памяти, полученный с помощью mmap ().Через некоторое время я пришел к выводу, что мне больше не нужны данные в этом диапазоне.Однако я все еще хочу сохранить этот диапазон.То есть я не хочу вызывать mummap ().Я пытаюсь быть хорошим гражданином и не заставлять систему менять местами больше, чем нужно.

Есть ли способ сообщить ядру Linux, что , если данная страница поддерживается физической страницей, и , если ядро ​​решит, что ему нужна эта физическая страницане потрудитесь написать эту страницу для замены?

Я полагаю, что этот магический вызов функции разрушит любое отображение между данной виртуальной страницей и физической страницей, если она будет присутствовать, без записи в обмен.

Ответы [ 2 ]

5 голосов
/ 23 декабря 2011

Ваш вопрос (как указано) не имеет смысла.

Предположим, у вас был способ заставить ядро ​​делать то, что вы хотите.

Давайте далее предположим, что потребовалось дополнительное ОЗУ, поэтому оно забрало вашу страницу и не поменяло ее.

Теперь ваша программа пытается прочитать эту страницу (поскольку вы не хотите munmap данные, возможно, вы могли бы попытаться получить к ней доступ). Что делать с ядром? Выбор, который я вижу:

  1. может дать вам новую страницу, заполненную нулями.
  2. это может дать вам SIGSEGV

Если вам нужен вариант 2, вы можете достичь того же результата с munmap.

Если вам нужен вариант 1, вы можете mremap поверх существующего сопоставления с помощью MAP_ANON (или munmap, за которым следует новый mmap).

В любом случае вы не можете зависеть от старых данных, когда они вам нужны.

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

EDIT:

Возможно, вы ищете madvise(..., MADV_DONTNEED)

0 голосов
/ 23 декабря 2011

Вы можете munmap регион, затем mmap это снова с MAP_NORESERVE

Если в начальный момент сопоставления вы знаете, что подкачка не нужна, используйте MAP_NORESERVE

...