Подтвердить что ты не робот

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

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

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

Спасибо.

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"

4b9b3361

Ответ 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):