Лабораторный практикум по курсу "Операционные системы"
Если поле vm_area_struct->vm_ops не предоставляет функцию nopage(), вызывается
функция
do_anonymous_page(). Если обслуживается запрос на чтение, в дескриптор
страницы помещается ссылка на специальную страницу, заполненную нулями, и для данной
страницы запрещается запись (для всех процессов используется одна и та же такая
страница). Когда процесс попытается выполнить запись на эту страницу, возникнет еще одн
страничный сбой, который можно будет обработать.
Если произошла
попытка первой записи в страницу, вызываются функции alloc_page() и
clear_user_highpage(), выделяющие страницу физической памяти и обнуляющие ее.
Если выделение прошло успешно, Resident State Size процесса (
mm_struct->rss)
увеличивается на 1, и вызывается функция
flash_page_to_ram() для гарантированной
синхронизации процессорного кэша. После этого страница вставляется в список lru, чтобы
впоследствии ее можно было выгрузить на диск, и модифицируется таблица страниц.
Если страница была отображена на пространство на жестком диске (во внешней памяти),
поле
vm_area_struct->vm_ops предоставляет функцию nopage(), которая
реализована в драйвере устройства внешней памяти. Данная функция выполняет выделение
памяти для страницы и чтение ее из внешней памяти. После возврата из функции
выполняется ряд проверок, модифицируется таблица страниц и синхронизируется
процессорный кэш.
Подкачка по запросу
Если страница была выгружена на жесткий диск, ее чтение выполняет функция
do_swap_page(). Информация о местонахождении страницы на диске, достаточная для ее
чтения, содержится в дескрипторе страницы. Однако страница может все еще находиться в
оперативной памяти.
Дело в том, что страницы, разделяемые несколькими процессами, не могут быть выгружены
на диск немедленно. По содержимому структуры
struct page невозможно определить все
таблицы страниц, в которых существует ссылка на нее, а поиск посредством перебора таблиц
страниц всех процессов занимает слишком много времени. Поэтому, когда страница
выгружается в область подкачки, сначала она попадает в кэш подкачки.
Соответственно, если произошел страничный сбой, есть шанс, что требуемая страница
находится в кэше подкачки.
В этом случае счетчик ссылок на страницу увеличивается на 1 и
исправляется таблица страниц процесса.
Если страница присутствует только на диске, вызывается функция swapin_readahead(),
считывающая требуемую страницу и несколько следующих за ней (2
page_cluster
).
Демон выгрузки страниц (kswapd)
Работающая система может использовать все имеющиеся физические страницы, распределив
их работающим процессам, выделив для хранения буферов обмена с устройствами
ввода/вывода и т.д. Соответственно, потребуется выбрать ряд страниц, содержимое которых
будет вытеснено на жесткий диск, а сами страницы освобождены для использования в
других целях.
Методы, используемые в Linux для определения вытесняемых
страниц, базируются на
нескольких различных идеях и их параметры подобраны на основании анализа замеров
производительности и отзывов пользователей.
За исключением страниц, управляемых менеджером памяти ядра (kernel allocator или slab
allocator), все используемые страницы содержатся в кэше страниц и связаны в список через
Учебно-исследовательская лаборатория «Информационные технологии» 125