ВАП (Вирт. Адр простр) процесса делится на однородные непрерывные области, состоящие из соседних страниц с одинаковым режимом защиты и свойствами подкачки. Например, сегменты текса и отображенных файлов.
Каждый процесс имеет список областей, где каждая область представлена структурой vm_area_struct. Эта структура содержит следующую информацию:
1. Режим защиты (чтение, чт/запись)
2. Является ли данная область фиксированной или выгружаемой
3. Направление роста области
4. Является ли область приватной или совместно используемой
5. Есть ли у области место хранения на диске и где оно расположено (текстовые сегменты имеют в качестве места резервного копирования двоичные файлы, файлы, отображаемые на память – соответствующие им файлы, напр, библиотеки. Все остальные сегменты не имеют области резервного копирования пока не потребуется из выгрузка на диск, тогда создаются временные файлы.)
В Linux используется трехуровневая система страничной подкачки. Каждый виртуальный адрес разбит на четыре поля:
- Каталог (используется как индекс в каталоге /proc, который содержит ссылку на среднюю таблицу страниц)
- Середина (указывает на таблицу из средней таблицы страниц)
- Страница (указывает на страницу из таблицы станиц)
- Смещение (указывает на текущее слово)
Рисунок 4.8 - Трехуровневая система страничной подкачки Linux
Для управления памяти в Linux используются три алгоритма, взятые из System V.
Первый – «дружественный» - выделяет память с произвольным количеством страниц. При выделении памяти процессу общий размер памяти делится пополам до тех пор, пока не получим нужный размер.
Рисунок 4.9 – Дружественный алгоритм
При таком выделении памяти получается большая фрагментация. Для решения этой проблемы применяется второй алгоритм, нарезающий из блоков более мелкие фрагменты и управляющий ими отдельно.
Кроме того, есть еще третий алгоритм, который используется, когда выделяемая память должна быть непрерывна только в ВАП, но не в физической памяти.
В Linux реализована страничная подкачка по требованию без предварительной загрузки страниц и без концепции рабочего набора.
Алгоритм замещения страниц работает следующим образом. Страничный демон должен поддерживать достаточное количество свободных страниц. Для этого он просыпается каждую секунду.
Страничный демон состоит из цикла, который выполняется до шести раз с возрастающей скоростью. Тело цикла выполняет обращения к трем процедурам, каждая из которых пытается получить различные типы страниц. Процедурам передается параметр скорости. В результате сначала выбираются легко доступные страницы каждой категории, а потом переходит к труднодоступным. Первая процедура ищет страницы в страничном и буферном кэше по алгоритму часов. Вторая – ищет совместно используемые страницы. Третья – пытается получить страницы, используемые пользователями.
В управлении памятью используется еще один демон, bdflush. Он следит за тем, чтобы количество «грязных» страниц (бит обращения очищен, но страница хранит информацию) не превышало определенного уровня. Если превысило, демон начинает сохранять их на диск.