Как ядро узнает, какие страницы в виртуальном адресном пространстве соответствуют выгруженному физическому фрейму страницы?

Рассмотрим следующую ситуацию: ядро исчерпало физическую оперативную память и нуждается в обмене страницей. Он выбирает наименее недавно использованный фрейм страницы и хочет перенести его содержимое на диск и выделить этот фрейм другому процессу.

Что меня беспокоит, так это то, что этот фрейм страницы уже был отображен, вообще говоря, на несколько (идентичных) страниц нескольких процессов. Ядро должно как-то найти все эти процессы и пометить страницу как выгруженную. Как это осуществить?

Спасибо.

РЕДАКТИРОВАТЬ: Иллюстрации к вопросу:

Перед процессами обмена 1 и 2 была общая страница 1, которая находилась в кадре физической памяти 1:

Теперь память в системе исчерпана, и ядро выделяет память для процесса 3, выгрузив страницу 1 из кадра 1 и заменив ее страницей 2. Для этого ему необходимо

1) найти все процессы, ссылаясь на страницу 1 (Процесс 1 и Процесс 2 в нашем случае)

2) измените их записи таблицы страниц, установив бит «Present» в 0 и установив расположение страницы 1 в Swap

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

ОТВЕТ:

«Самым значительным и важным изменением в управлении таблицей страниц является введение обратного отображения (rmap). Обозначать его как« rmap »является преднамеренным, поскольку оно часто используется как« сокращение »и его не следует путать с -rmap. дерево, разработанное Rik van Riel, которое имеет гораздо больше изменений в базовой VM, чем просто обратное отображение.

В одном предложении rmap предоставляет возможность найти все PTE, которые отображают конкретную страницу, заданную только структурной страницей. В версии 2.4 единственный способ найти все PTE, которые отображают общую страницу, например общую библиотеку с отображением в памяти, - это линейный поиск всех таблиц страниц, принадлежащих всем процессам. Это слишком дорого, и Linux пытается избежать этой проблемы, используя кэш подкачки (см. Раздел 11.4). Это означает, что со многими общими страницами Linux, возможно, придется выгружать целые процессы независимо от возраста страницы и моделей использования. 2.6 вместо этого имеет цепочку PTE, связанную с каждой структурной страницей, которую можно пройти, чтобы удалить страницу из всех таблиц страниц, которые на нее ссылаются. Таким образом, страницы в LRU могут быть заменены интеллектуальным способом, не прибегая к обмену целыми процессами ».

изПонимание управления памятью в Linux, что нового в Linux2.6

Ответы на вопрос(1)

Ваш ответ на вопрос