Рассмотрим следующую ситуацию: ядро исчерпало физическую память и вам нужно поменять страницу. Он выбирает наименее недавно используемый кадр страницы и хочет поменять его содержимое на диск и выделить этот кадр другому процессу.
Меня беспокоит, что этот кадр страницы уже был сопоставлен, вообще говоря, с несколькими (идентичными) страницами нескольких процессов. Ядро должно каким-то образом найти все эти процессы и пометить страницу как замененную. Как это осуществить?
Спасибо.
EDIT: Иллюстрации к вопросу:
Перед процессами обмена 1 и 2 была общая страница 1, которая находилась в кадре физической памяти 1:
Теперь память в системе исчерпана, и ядро выделяет память для процесса 3, заменяя Page 1 из кадра 1 и заменяя его на стр. 2. Чтобы сделать это, он должен
1) найти все процессы, ссылаясь на страницу 1 (процесс 1 и процесс 2 в нашем случае)
2) измените свои записи в таблице страниц, установив бит "Present" в 0 и установив место Page 1 в Swap
Итак, я не понимаю, как выполняется шаг 1. Ядро не может быть просто итеративно, просматривая все таблицы страниц процесса, чтобы найти запись в таблице страниц, указывая на фрейм 1. Должно быть какое-то обратное отображение из фреймов страницы в записи таблицы страниц.
ОТВЕТ:
"Самым значительным и важным изменением в управлении таблицами страниц является введение обратного сопоставления (rmap). Ссылаясь на него как" rmap ", преднамеренное, так как это обычное использование" акронима ", и его не следует путать с созданное Риком Ван Риелем, которое имеет гораздо больше изменений в запасе VM, чем просто обратное отображение.
В одном предложении rmap предоставляет возможность находить все PTE, которые отображают конкретную страницу, заданную только на странице структуры. В 2.4 единственный способ найти все PTE, которые отображают общую страницу, например разделяемую памятью, представляет собой линейный поиск всех таблиц страниц, принадлежащих ко всем процессам. Это слишком дорого, и Linux пытается избежать проблемы с помощью кэша подкачки (см. Раздел 11.4). Это означает, что со многими разделяемыми страницами Linux, возможно, придется менять все процессы независимо от возраста и шаблона использования страницы. 2.6 вместо этого имеет цепочку PTE, связанную с каждой страницей структуры, которая может быть перемещена, чтобы удалить страницу из всех таблиц страниц, которые ссылаются на нее. Таким образом, страницы в LRU могут быть заменены интеллектуальным образом, не прибегая к замене всех процессов ".
from Понимание управления памятью Linux, "что нового в Linux2.6"