Страничные отказы, замещение страниц, биты A и D

⏱ 40 мин · 🧩 заданий: 6

Подкачка по требованию

Страница загружается в память только тогда, когда к ней обратились (demand paging). Если физическая память кончилась, ядро освобождает кадр — вытесняет какую-то страницу на диск: в файл подкачки (swap) для анонимной памяти или обратно в файл для отображённых файлов.

обращение → MMU: P=0 → страничный отказ → ядро: 1. найти VMA, проверить права (иначе SIGSEGV) 2. найти свободный кадр └─ нет свободных? → выбрать жертву (алгоритм замещения) ├─ D=1: записать жертву на диск └─ D=0: просто забрать кадр → в PTE жертвы: P=0, запомнить место на диске → сбросить запись TLB 3. прочитать нужную страницу с диска (или обнулить кадр) 4. PTE: номер кадра, P=1; повторить инструкцию

Алгоритмы замещения

OPT (оптимальный, алгоритм Белади)

Вытеснить страницу, которая понадобится позже всех. Минимум отказов, но требует знать будущее — используется как эталон.

FIFO

Вытеснить страницу, загруженную раньше всех. Просто, но может выбросить активно используемую страницу. Подвержен аномалии Белади: больше кадров — иногда больше отказов.

LRU (Least Recently Used)

Вытеснить страницу, к которой дольше всего не обращались. Хорошо приближает OPT. Но точный LRU требует отмечать время каждого обращения — аппаратура этого не делает. Зато она умеет ставить бит A — и на нём строятся приближения LRU.

«Часы» (второй шанс)

Кадры по кругу, стрелка указывает на кандидата:

  • если у страницы A = 1 — сбросить A в 0 («второй шанс») и сдвинуть стрелку;
  • если A = 0 — вытеснить.

Буква w — запись: у страницы ставится бит D. Обратите внимание, когда вытеснение требует записи на диск.

NRU (Not Recently Used)

Периодически (по таймеру) ядро сбрасывает биты A. При вытеснении страницы делятся на 4 класса по (A, D):

Класс A D Значение
0 0 0 давно не использовалась, чистая — лучшая жертва
1 0 1 давно не использовалась, грязная
2 1 0 недавно использовалась, чистая
3 1 1 недавно использовалась, грязная — худшая жертва

Вытесняется случайная страница из наименьшего непустого класса.

Рабочее множество

Множество страниц, к которым процесс обращался за последние Δ единиц времени. Если сумма рабочих множеств больше памяти — пробуксовка (thrashing): система занята подкачкой, а не работой.

Страничный демон

Ждать, пока память кончится совсем, и только тогда искать жертву — медленно: процесс, вызвавший отказ, будет ждать записи на диск. Поэтому ядро держит запас свободных кадров. Этим занимается страничный демон — поток ядра (в Linux kswapd, по одному на узел памяти; в BSD — pagedaemon):

  • просыпается, когда свободных кадров меньше нижнего порога (low watermark);
  • просматривает страницы, используя бит A (в Linux — списки активных и неактивных страниц), выбирает давно не использовавшиеся;
  • грязные (D = 1) отправляет на запись, чистые сразу освобождает;
  • работает, пока не наберётся верхний порог (high watermark).

Если демон не справляется, процессы сами занимаются освобождением (direct reclaim), а в крайнем случае ядро запускает OOM killer.

Биты A и D: кто и как

Это ответ на задачу 5 экзамена.

Устанавливает биты аппаратура (MMU) — при обращении через запись таблицы страниц: A — при любом чтении или записи, D — при записи. Читает и сбрасывает их ядро — подсистема управления памятью: страничный демон, алгоритм замещения и подсистема записи изменённых страниц (writeback).

Бит доступа (A, accessed / referenced):

  1. Страничный демон периодически проходит по страницам: смотрит A и сбрасывает его.
  2. Если к следующему проходу A снова 1 — страница используется (активная); если 0 — давно не использовалась, кандидат на вытеснение.
  3. Так ядро приближает LRU (алгоритмы «часы», NRU, активный и неактивный списки Linux).
  4. Сбросив A, ядро должно сбросить запись TLB для этой страницы: пока трансляция в TLB, процессор не обновляет бит в памяти.

Бит грязности (D, dirty / modified):

  1. При вытеснении: если D = 0, на диске (в файле или swap) уже есть точная копия — кадр можно освободить без записи. Если D = 1 — страницу сначала нужно записать.
  2. Для отображённых файлов и кеша страниц: потоки записи (writeback; в старых ядрах pdflush/bdflush) периодически записывают грязные страницы в файл; msync, fsync, sync — по запросу.
  3. После записи ядро сбрасывает D (и запись TLB).
  4. Алгоритм замещения предпочитает чистые страницы: их вытеснение дешевле.

А если аппаратура не ставит биты?

На архитектурах без аппаратных A/D ядро их эмулирует: помечает страницу как отсутствующую (или только для чтения), и первое обращение (запись) вызывает страничный отказ — в его обработчике ядро отмечает «доступ» («грязная») и восстанавливает права.

Итог

  • Подкачка по требованию: страничный отказ → найти кадр → при нехватке вытеснить жертву → загрузить страницу.
  • Алгоритмы: OPT (эталон), FIFO (аномалия Белади), LRU, «часы», NRU по классам (A, D).
  • Страничный демон держит запас свободных кадров между порогами.
  • A и D ставит аппаратура; ядро сбрасывает A, чтобы находить неиспользуемые страницы, и смотрит D, чтобы решить, писать ли страницу на диск.

Практика решено 0 из 6

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Ввод ответа

3 кадра, алгоритм FIFO. Последовательность обращений к страницам: 1 2 3 4 1 2 5 1 2 3 4 5. Сколько страничных отказов?

Задание 2 Ввод ответа

Та же последовательность 1 2 3 4 1 2 5 1 2 3 4 5, но 4 кадра и FIFO. Сколько отказов?

Задание 3 Заполнить таблицу

Классы страниц в алгоритме NRU по битам (A, D). Какой класс вытесняется первым, а какой — последним?

Вытеснять первымВытеснять последним
A=0, D=0 — не использовалась, чистая
A=0, D=1 — не использовалась, грязная
A=1, D=0 — использовалась, чистая
A=1, D=1 — использовалась, грязная
Отметьте ячейку — «+», пустая — «−».
Задание 4 Несколько вариантов

Как ядро использует бит грязности D?

Задание 5 Несколько вариантов

Как ядро использует бит доступа A?

Задание 6 Один вариант ответа

Что такое страничный демон (в Linux — kswapd)?

Войдите, чтобы отмечать пройденные уроки.