Замещение страниц осуществляется демоном выгрузки страниц (процесс 2). Политика страничной подкачки демона выгрузки страниц воплощена в процедурах vm jpageout() и vm_pageout_scan(). Когда демон выгрузки возвращает страницы, которые были изменены, он отвечает за запись их в область подкачки. Таким образом, демон выгрузки должен иметь возможность использовать обычные механизмы синхронизации ядра, такие, как sleep(). Поэтому он запускает отдельный процесс со своей собственной структурой процесса и стеком ядра. Подобно ink, демон выгрузки создается внутренней операцией fork в ходе запуска системы; однако в отличие от init он остается после разветвления в режиме ядра. Демон выгрузки просто входит в vm_pageout() и никогда не возвращается. В отличие от некоторых других пользователей процедур дискового ввода/вывода процесс выгрузки страниц нуждается в асинхронном выполнении своих дисковых операций таким образом, чтобы он мог продолжать сканирование параллельно с записью на диск.
Изначально страницы обрабатывались с использованием алгоритма наиболее давнего использования. Недостатком этого алгоритма является то, что неожиданная вспышка активности памяти может сбросить из кеша многие полезные страницы. Чтобы смягчить такое поведение, FreeBSD использует для предохранения страниц, имеющих предысторию использования, алгоритм наименее активного использования, чтобы они имели преимущество перед однократно использованными страницами, загруженными в память в период большой потребности в памяти.
Когда страница впервые загружается в память, ей предоставляется начальный счетчик использования, равный трем. Дальнейшие сведения об использовании собираются демоном выгрузки во время его периодических просмотров памяти. При сканировании каждой страницы памяти проверяется его бит ссылки. Если бит установлен, он сбрасывается, а счетчик использования для страницы увеличивается (вплоть до предела в 64) на число ссылок на страницу. Если бит ссылки сброшен, счетчик использования уменьшается. Когда счетчик использований достигает нуля, страница перемещается из активного списка в неактивный. Повторно используемые страницы набирают большие значения счетчика использований, которые заставляют их оставаться в активном списке намного дольше, чем страницы, использованные лишь однажды.
Целью демона выгрузки является сохранение числа страниц неактивного, свободного списков и списка кеша в пределах их желательных диапазонов. Каждый раз, когда использующая страницы операция вызывает падение количества свободной памяти ниже минимального порога, пробуждается демон выгрузки. В следующем обзоре обозначенные буквами пункты ссылаются на метки в левой части кода.
Демон выгрузки вычисляет число страниц, которые нужно переместить из неактивного списка в список кеша. Поскольку некоторые будут позже перемещены в список свободных, в список кеша должно быть перемещено достаточно страниц, чтобы сохранить в нем минимальный уровень после заполнения свободного списка. Чтобы избежать насыщения системы ввода/вывода, демон выгрузки ограничивает число операций ввода/вывода, которые он запускает параллельно.
- 02/11/2010 21:26 - Переносимость
- 02/11/2010 12:16 - Процесс подкачки
- 01/11/2010 22:58 - Подкачка процессов
- 01/11/2010 08:04 - Изменение защиты
- 31/10/2010 22:44 - Отображение файлов
- 29/10/2010 05:27 - Параметры страничной подкачки
- 28/10/2010 17:19 - Изменение размера процесса
- 28/10/2010 08:07 - Манипулирование процесса своим адресным пространством
- 26/10/2010 13:51 - Исполнение файла
- 26/10/2010 11:57 - Дизайн аппаратного кеша