Как известно ядро, какие страницы в виртуальном адресном пространстве соответствуют обрыву физического фрейма страницы?
Рассмотрим следующую ситуацию: ядро исчерпало физическую память и вам нужно поменять страницу. Он выбирает наименее недавно используемый кадр страницы и хочет поменять его содержимое на диск и выделить этот кадр другому процессу.
Меня беспокоит, что этот кадр страницы уже был сопоставлен, вообще говоря, с несколькими (идентичными) страницами нескольких процессов. Ядро должно каким-то образом найти все эти процессы и пометить страницу как замененную. Как это осуществить?
Спасибо.
EDIT: Иллюстрации к вопросу:
Перед процессами обмена 1 и 2 была общая страница 1, которая находилась в кадре физической памяти 1:
![enter image description here]()
Теперь память в системе исчерпана, и ядро выделяет память для процесса 3, заменяя Page 1 из кадра 1 и заменяя его на стр. 2.
Чтобы сделать это, он должен
1) найти все процессы, ссылаясь на страницу 1 (процесс 1 и процесс 2 в нашем случае)
2) измените свои записи в таблице страниц, установив бит "Present" в 0 и установив место Page 1 в Swap
![enter image description here]()
Итак, я не понимаю, как выполняется шаг 1. Ядро не может быть просто итеративно, просматривая все таблицы страниц процесса, чтобы найти запись в таблице страниц, указывая на фрейм 1. Должно быть какое-то обратное отображение из фреймов страницы в записи таблицы страниц.
ОТВЕТ:
"Самым значительным и важным изменением в управлении таблицами страниц является введение обратного сопоставления (rmap). Ссылаясь на него как" rmap ", преднамеренное, так как это обычное использование" акронима ", и его не следует путать с созданное Риком Ван Риелем, которое имеет гораздо больше изменений в запасе VM, чем просто обратное отображение.
В одном предложении rmap предоставляет возможность находить все PTE, которые отображают конкретную страницу, заданную только на странице структуры. В 2.4 единственный способ найти все PTE, которые отображают общую страницу, например разделяемую памятью, представляет собой линейный поиск всех таблиц страниц, принадлежащих ко всем процессам. Это слишком дорого, и Linux пытается избежать проблемы с помощью кэша подкачки (см. Раздел 11.4). Это означает, что со многими разделяемыми страницами Linux, возможно, придется менять все процессы независимо от возраста и шаблона использования страницы. 2.6 вместо этого имеет цепочку PTE, связанную с каждой страницей структуры, которая может быть перемещена, чтобы удалить страницу из всех таблиц страниц, которые ссылаются на нее. Таким образом, страницы в LRU могут быть заменены интеллектуальным образом, не прибегая к замене всех процессов ".
from Понимание управления памятью Linux, "что нового в Linux2.6"
Ответы
Ответ 1
Linux:
Когда используется файл подкачки, запись в Таблице страниц обновляется, а одна помечена как недопустимая и содержит информацию о том, где она сохраняется в файле подкачки. То есть: индекс массива swap_info
и смещение внутри swap_map
.
Пример из (бит старого) Таблица Тип записи таблицы (pte_t
) на x86. Некоторые
бит используются в качестве флагов аппаратным обеспечением:
Bit Function
_PAGE_PRESENT Page is resident in memory and not swapped out
_PAGE_PROTNONE Page is resident but not accessable
_PAGE_RW Set if the page may be written to
_PAGE_USER Set if the page is accessible from user space
_PAGE_DIRTY Set if the page is written to
_PAGE_ACCESSED Set if the page is accessed
Таблица 3.1: Защита и биты состояния таблицы страниц
См. также другой ответ SO с диаграммой формата таблицы страниц x86-64. Когда низкий бит = 0, аппаратное обеспечение игнорирует все остальные биты, поэтому ядро может использовать их для чего угодно. Даже в "настоящей" записи есть некоторые бит с гарантированным игнорированием, которые не зарезервированы для будущего использования оборудования, поэтому ядро может использовать их в своих целях.
Предположительно другие архитектуры похожи.
Простыми словами: процесс указывает на страницу, страница обновляется. Таким образом, процессы, по сути, также обновляются. Когда запрашивается физическая страница, она заменяется и, следовательно, все процессы также. Дело в том, что запись в таблицу страниц не удаляется при замене памяти.
Вы можете найти некоторые из этих полезных:
Документация ядра включена в книгу Мел Гормана (2007):