Обслуживание отказов страниц и других требований памяти может осуществляться в течение некоторого времени из списка свободных страниц, но в конечном счете память должна быть возвращена для повторного использования. Некоторые страницы возвращаются при завершении процесса. На системах с большим объемом памяти и низкими ее запросами завершающиеся процессы могут предоставить достаточно свободной памяти для удовлетворения запросов. Такой случай возникает, когда для ядра и всех страниц, которые когда-либо использовались любым из текущих процессов, памяти достаточно. Очевидно, на многих компьютерах недостаточно оперативной памяти, чтобы сохранять в памяти все страницы. Таким образом, в конце концов становится необходимо переместить некоторые страницы во вторичное хранилище - обратно в файловую систему и пространство подкачки. Загрузки страниц управляются запросами. Однако для их выгрузки нет непосредственного указания, когда страница больше не нужна процессу. Ядро должно реализовать некоторую стратегию для решения, какие страницы выгрузить из памяти таким образом, чтобы оно могло заместить эти страницы другими, которым память нужна в настоящее время. В идеале эта стратегия будет выбирать те страницы для замещения, которые вскоре не понадобятся. Приближением к этой стратегии является нахождение страниц, которые не использовались активно или в последнее время.
Система 4.4BSD реализовала страничную подкачку по требованию с алгоритмом замещения страниц, который аппроксимирует глобальное наименее активное использование (global least-actively used) [Easton & Franaszek, 1979]. В FreeBSD однобитное поле использования для каждой страницы было дополнено счетчиком активности, чтобы аппроксимировать глобальное наименее активное использование. Оба этих алгоритма являются примерами алгоритма глобального замещения (global replacement algorithm): алгоритма, в котором выбор страницы для замещения осуществляется на основе критерия в масштабе всей системы. Алгоритм локального замещения (local replacement algorithm) выбрал бы процесс, для которого нужно заместить страницу, а затем выбрал бы страницу на основе критерия процесса. Хотя алгоритм в FreeBSD сходен по природе с алгоритмом в 4.4BSD, его реализация значительно отличается.
Ядро сканирует физическую память на регулярной основе, рассматривая страницы для замещения. Использование общесистемного списка страниц заставляет все процессы соперничать за память на равной основе. Обратите внимание, что это совместимо также со способом обработки FreeBSD других предоставляемых системой ресурсов. Обычной альтернативой тому, чтобы разрешить всем процессам в равной степени состязаться за память, является разделение памяти на множество независимых областей, каждая из которых относится к набору процессов, которые состязаются друг с другом за память. Эта схема используется, например, операционной системой VMS [Kenah & Bate, 1984]. При такой схеме системные администраторы могут гарантировать, что у процесса или набора процессов всегда будет минимальная доля памяти. К сожалению, такой схемой может быть тяжело управлять. Выделение разделу слишком маленького числа страниц может привести к недоиспользованию памяти и избыточной деятельности по вводу/выводу вторичных устройств хранения, тогда как установка этого числа слишком большим может привести к избыточной подкачке [Lazowska & Kelsey, 1978].
Ядро делит оперативную память на пять списков.
1. Переданная (wired): переданные страницы блокируются в памяти и не могут быть выгружены. Обычно эти страницы используются ядром или пейджером физической памяти, или они были заблокированы посредством mlock. Кроме того, все страницы, использующиеся для хранения структуры пользователя и стеков потоков загруженных (т. е. невыгруженных) процессов, также являются переданными. Переданные страницы нельзя выгрузить.
2. Активная: активные страницы используются одной или несколькими областями виртуальной памяти. Хотя ядро может их выгрузить, осуществление этого скорее всего вызовет отказы страниц активного процесса и обратную загрузку.
3. Неактивная: неактивные страницы имеют содержимое, которое по-прежнему известно, но они обычно не являются частью какой-либо активной области. Если содержание страниц грязное, до повторного использования страницы оно должно быть записано в резервную память. После очистки страницы она помещается в список кеша. Если система начинает испытывать недостаток памяти, демон выгрузки может попытаться переместить активные страницы в список неактивных в надежде найти страницы, которые на самом деле не используются. Критерии выбора, которые используются демоном выгрузки для выбора страниц для перемещения из активного списка в неактивный список. Когда списки свободной памяти и кеша становятся слишком маленькими, демон выгрузки проходит по неактивному списку, чтобы создать дополнительные страницы кеша и свободные страницы.
4. Кеш: страницы кеша имеют содержание, которое по-прежнему известно, но они обычно не являются частью какой-либо активной области. Если они отображаются в активную область, они должны быть помечены только для чтения таким образом, чтобы любая попытка записи вызвала их перемещение из списка кеша. Они сходны с неактивными страницами, за тем исключением, что они не грязные, либо потому, что не были модифицированы, поскольку они были загружены, либо потому, что они были записаны в свое резервное хранилище. При необходимости их можно переместить в свободный список.
5. Свободные: свободные страницы не содержат полезного содержания и будут использоваться для удовлетворения запросов на новые страницы. Процесс idle пытается хранить около 75 процентов страниц в списке свободных обнуленными таким образом, чтобы их не пришлось обнулять при обслуживании отказа страницы анонимной области. Страницы с неизвестным содержанием помещаются перед началом свободного списка. Обнуленные страницы помещаются в конец свободного списка. Процесс idle берет страницы из начала свободного списка, обнуляет их, помечает как обнуленные и помещает в конец свободного списка. Отказы страниц, которые будут заполнять страницы, берут их из начала свободного списка. Отказы страниц, которым нужны заполненные нулями страницы, берут их из конца свободного списка. Если страница помечена как обнуленная ее не нужно обнулять в ходе обслуживания отказа.
Страницами оперативной памяти, которые могут использоваться процессами пользователя, являются страницы в списках активных, неактивных, кеша и свободных. Запросы на новые страницы берутся сначала из свободного списка, если в нем есть доступные страницы, в противном случае из списка кеша. Свободный список и список кеша подразделяются на отдельные списки, организованные в соответствии с цветом страницы.
В идеале ядро поддерживало бы рабочий набор для каждого процесса в системе. При этом оно знало бы, сколько памяти предоставить каждому процессу, чтобы минимизировать в последнем отказы страниц. Система виртуальной памяти FreeBSD не использует модель рабочего набора, поскольку ему недостает точной информации о паттерне ссылок процесса. Она отслеживает число сохраняемых процессом страниц посредством размера резидентного набора (resident-set size), но не знает, какая из резидентных страниц составляет рабочий набор. В 4.3BSD число резидентных страниц использовалось в принятии решений о том, достаточно ли памяти для загрузки процесса, когда он хотел начать работать. Эта особенность не была перенесена в систему виртуальной памяти FreeBSD. Поскольку она хорошо работала в периоды большой потребности в памяти, эту особенность следует включить в будущих системах FreeBSD.
- 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 - Дизайн аппаратного кеша
- 26/10/2010 07:21 - Дублирование адресного пространства пользователя