Разбор задач 5 и 6: биты A/D и пакеты
Задача 5. Биты A и D
Условие: «Как и какой частью ядра используются поля таблицы страниц: бит грязности и бит доступа?»
Образцовый ответ
Кто выставляет. Оба бита выставляет аппаратура (MMU) при трансляции адреса. A (accessed) — при любом обращении к странице. D (dirty) — при записи. Ядро их только читает и сбрасывает.
Бит доступа A использует подсистема замещения страниц — страничный демон (kswapd) и прямое освобождение памяти, когда свободных кадров мало. Это приближение LRU: алгоритм часов (второго шанса) обходит кадры. Если A = 1, страница недавно использовалась: демон сбрасывает A (и запись TLB, иначе MMU не выставит бит снова) и даёт ей второй шанс. Если A = 0, страница не использовалась с прошлого обхода и становится кандидатом на вытеснение. В Linux по A страницы перемещаются между активным и неактивным LRU-списками. Ещё A используют для оценки рабочего набора процесса.
Бит грязности D нужен при вытеснении и записи на диск:
- если D = 0, копия страницы на диске (в файле или подкачке) совпадает с памятью — кадр можно освободить сразу, без записи;
- если D = 1, страницу сначала нужно записать: анонимную — в раздел подкачки, файловую — в файл. Это делает подсистема обратной записи (writeback, потоки flush/
kworker) или сам демон. После записи D сбрасывается.
Улучшенный алгоритм часов выбирает жертву по паре (A, D): сначала (0, 0), затем (0, 1). Так меньше дисковых операций.
Также D используется при msync/fsync для файловых отображений: записываются только грязные страницы. При munmap и завершении процесса ядро переносит D из PTE в флаг страницы страничного кеша, чтобы изменения не потерялись.
Связь с copy-on-write
COW устроен иначе: ядро снимает право записи (R/W = 0), и запись вызывает страничный отказ. Бит D сам по себе COW не реализует, но после копирования новая страница становится грязной. Это хорошая деталь для ответа, если спросят дополнительно.
Повторить: уроки «Таблицы страниц» и «Замещение страниц» (с симулятором часов) модуля «Виртуальная память».
Задача 6. Пакеты
Условие: «Для чего в метаинформации к пакету могут присутствовать скрипты pre-install и post-install? В каких случаях осмысленно выполнить reinstall и что при этом происходит с конфигурационными файлами?»
Образцовый ответ
Скрипты нужны для действий, которых нельзя описать списком файлов. Менеджер пакетов запускает их от root до и после распаковки (preinst/postinst в dpkg, %pre/%post в RPM; для удаления — prerm/postrm).
- pre-install: проверить условия и прервать установку при несовместимости; остановить старую версию службы перед заменой файлов; создать пользователя, если файлы должны сразу ему принадлежать; сохранить данные для миграции.
- post-install: создать системных пользователей и каталоги с правами; сгенерировать уникальные данные (ключи SSH-сервера, сертификаты); зарегистрировать, включить, запустить или перезапустить службу; обновить кеши (
ldconfigдля библиотек, man, шрифты),update-alternatives,depmod; мигрировать конфигурацию и данные со старой версии.
Reinstall (apt install --reinstall, dnf reinstall) осмыслен, когда:
- файлы пакета повреждены или удалены (это показывают
debsums/rpm -V); - файлы перезаписаны вручную, например
make installповерх пакетной версии; - нужно повторно выполнить скрипты: сломалась регистрация службы, удалён системный пользователь.
Что происходит. Все файлы пакета распаковываются заново, скрипты выполняются как при обновлении на ту же версию. Конфигурационные файлы (conffiles, %config) обрабатываются особо:
- dpkg сравнивает контрольные суммы: файл, изменённый администратором, сохраняется, вопросов нет, так как пакетная версия не менялась. Неизменённый остаётся равным пакетному. Удалённый conffile не восстанавливается (считается намеренным удалением), нужен
--force-confmiss; - RPM: изменённый
%config(noreplace)остаётся, а версия пакета кладётся рядом как.rpmnew; для%configбез noreplace — наоборот, ставится пакетная, а старая сохраняется как.rpmsave.
Чтобы сбросить конфиги к умолчанию, нужен purge и установка заново, а не reinstall.
Повторить: уроки модуля «Пакеты».
Практика решено 0 из 5
Задача 5. Кто что делает с битами таблицы страниц?
| Бит доступа (A) | Бит грязности (D) | |
|---|---|---|
| MMU выставляет при любом обращении к странице (чтение или запись) | ||
| MMU выставляет только при записи в страницу | ||
| Страничный демон сбрасывает при обходе, чтобы узнать, использовалась ли страница с прошлого раза | ||
| Ядро проверяет перед вытеснением: нужно ли сначала записать страницу на диск | ||
| Ядро сбрасывает после записи страницы на диск (writeback) | ||
| Используется алгоритмом часов / LRU-приближением для выбора жертвы |
Страничный демон ищет кадр для освобождения. Расставьте шаги обработки страницы-кандидата:
- Посмотреть бит A: если 1 — сбросить в 0 (сброс TLB для этой страницы) и перейти к следующей
- Освободить кадр в список свободных
- Посмотреть бит D: если 1 — запланировать запись страницы на диск (в файл или раздел подкачки)
- Если A = 0, страница давно не использовалась — кандидат на вытеснение
- После записи сбросить D; пометить PTE «нет в памяти» (или удалить отображение)
Почему ядро после сброса бита A в PTE должно сбросить запись TLB (invlpg)?
Задача 6. Для чего могут быть нужны скрипты pre-install и post-install?
Администратор изменил /etc/nginx/nginx.conf и выполнил apt install --reinstall nginx. Что стало с файлом?
Войдите, чтобы отмечать пройденные уроки.