Разбор задач 5 и 6: биты A/D и пакеты

⏱ 30 мин · 🧩 заданий: 5

Задача 5. Биты A и D

Условие: «Как и какой частью ядра используются поля таблицы страниц: бит грязности и бит доступа?»

PTE (i386): [ номер кадра | ... | D | A | ... | U/S | R/W | P ] │ │ MMU ставит при записи ───┘ └── MMU ставит при любом обращении ядро (writeback) сбрасывает страничный демон сбрасывает
Образцовый ответ

Кто выставляет. Оба бита выставляет аппаратура (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

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

Задача 5. Кто что делает с битами таблицы страниц?

Бит доступа (A)Бит грязности (D)
MMU выставляет при любом обращении к странице (чтение или запись)
MMU выставляет только при записи в страницу
Страничный демон сбрасывает при обходе, чтобы узнать, использовалась ли страница с прошлого раза
Ядро проверяет перед вытеснением: нужно ли сначала записать страницу на диск
Ядро сбрасывает после записи страницы на диск (writeback)
Используется алгоритмом часов / LRU-приближением для выбора жертвы
Отметьте ячейку — «+», пустая — «−».
Задание 2 Расставить по порядку

Страничный демон ищет кадр для освобождения. Расставьте шаги обработки страницы-кандидата:

  1. Посмотреть бит A: если 1 — сбросить в 0 (сброс TLB для этой страницы) и перейти к следующей
  2. Освободить кадр в список свободных
  3. Посмотреть бит D: если 1 — запланировать запись страницы на диск (в файл или раздел подкачки)
  4. Если A = 0, страница давно не использовалась — кандидат на вытеснение
  5. После записи сбросить D; пометить PTE «нет в памяти» (или удалить отображение)
Задание 3 Один вариант ответа

Почему ядро после сброса бита A в PTE должно сбросить запись TLB (invlpg)?

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

Задача 6. Для чего могут быть нужны скрипты pre-install и post-install?

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

Администратор изменил /etc/nginx/nginx.conf и выполнил apt install --reinstall nginx. Что стало с файлом?

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