Открыть сервис

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

Страничный демон — это в компьютерной архитектуре и операционных системах системный процесс (или компонент ядра), отвечающий за управление виртуальной памятью, в частности за подкачку страниц (paging) между оперативной памятью и дисковым пространством (файлом подкачки или разделом подкачки). Термин происходит от английского «page daemon» (или «pager»), где «демон» (daemon) — это фоновый процесс, не имеющий прямого взаимодействия с пользователем. Страничный демон является ключевым элементом механизма виртуальной памяти, позволяя операционной системе выполнять программы, размер которых превышает объём физической оперативной памяти, и обеспечивая изоляцию процессов друг от друга.

История

Концепция виртуальной памяти и страничного обмена начала развиваться в 1960-х годах в рамках проектов по созданию многозадачных операционных систем. Первые реализации страничного демона появились в операционной системе MULTICS (1960-е), где был реализован механизм подкачки страниц (paging) для поддержки сегментированной виртуальной памяти. В 1970-х годах в операционной системе Unix (разработка AT&T Bell Labs) была внедрена упрощённая модель управления памятью, которая впоследствии эволюционировала в полноценный страничный демон в версиях BSD (Berkeley Software Distribution). В 1980-х годах в 4.3BSD был представлен демон pagedaemon, который стал прототипом для многих современных систем.

В операционной системе Linux (с 1991 года) страничный демон был реализован в ядре как часть подсистемы управления памятью. В ранних версиях Linux (до 2.4) использовался простой алгоритм вытеснения страниц, а начиная с версии 2.6 (2003 год) был внедрён более сложный механизм, основанный на алгоритме LRU (Least Recently Used) с несколькими списками (активные, неактивные страницы). В современных версиях Linux (5.x, 6.x) страничный демон работает в контексте ядра и называется kswapd (kernel swap daemon).

Принцип работы

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

  1. Мониторинг загрузки памяти. Демон отслеживает количество свободных страниц в оперативной памяти. Если оно падает ниже определённого порога (например, pages_low в Linux), демон активируется.
  2. Выбор страниц для вытеснения. Демон анализирует список страниц, используя алгоритмы, такие как LRU (Least Recently Used) или Clock (алгоритм «часов»). Страницы, которые не использовались дольше всего, помечаются как кандидаты на вытеснение.
  3. Запись на диск. Если страница была изменена (грязная страница, dirty page), её содержимое записывается в файл подкачки (swap) или на раздел подкачки. Если страница не изменялась (чистая страница), она просто освобождается, так как её копия уже есть на диске (например, в исполняемом файле).
  4. Освобождение памяти. После записи страница удаляется из физической памяти, а её запись в таблице страниц (page table) помечается как недействительная. При следующем обращении к этой странице возникнет страничное прерывание (page fault), и операционная система загрузит её обратно с диска.

Алгоритмы вытеснения

  • LRU (Least Recently Used) — классический алгоритм, вытесняющий страницы, к которым дольше всего не было обращений. Реализация требует поддержки списка или стека, что может быть накладно для больших объёмов памяти.
  • Алгоритм «часов» (Clock) — приближение LRU, использующее бит доступа (reference bit) и циклический обход страниц. Каждая страница имеет флаг, который сбрасывается при обходе; если флаг установлен, страница считается недавно использованной и пропускается.
  • NRU (Not Recently Used) — упрощённый алгоритм, классифицирующий страницы по двум битам (доступ и изменение). Вытесняются страницы из наименее приоритетной группы.
  • Алгоритм «рабочего набора» (Working Set) — учитывает, какие страницы активно используются процессом в данный момент, и не вытесняет их, пока они входят в рабочий набор.

Реализации в различных операционных системах

Linux

В ядре Linux страничный демон представлен несколькими процессами:

  • kswapd — основной демон, работающий для каждого узла NUMA (Non-Uniform Memory Access). Он активируется, когда количество свободных страниц падает ниже порога pages_low, и деактивируется при достижении порога pages_high.
  • kcompactd — демон, отвечающий за дефрагментацию памяти (компактификацию), перемещая страницы для создания больших непрерывных блоков.
  • oom_reaper — процесс, который завершает процессы, исчерпавшие память (OOM Killer), и освобождает их страницы.

Алгоритм вытеснения в Linux использует два списка: активные (active) и неактивные (inactive) страницы. Страницы перемещаются между списками на основе частоты обращений. Демон вытесняет страницы из неактивного списка.

BSD (FreeBSD, OpenBSD)

В системах BSD страничный демон называется pagedaemon. Он работает аналогично Linux, но использует алгоритм LRU с двумя списками (active queue и inactive queue). В FreeBSD также есть демон swapd, который управляет областью подкачки.

Windows

В операционной системе Windows (NT-линия) управление виртуальной памятью осуществляется компонентом Memory Manager (менеджер памяти), который работает в контексте ядра. Вместо отдельного демона используется рабочий поток Balance Set Manager (BSM), который выполняет функции, аналогичные страничному демону: мониторинг свободной памяти, вытеснение страниц и управление файлом подкачки (pagefile.sys). Алгоритм вытеснения основан на LRU с учётом приоритетов процессов.

macOS

В macOS (XNU-ядро) страничный демон реализован как часть подсистемы управления памятью VM (Virtual Memory). Он работает в фоновом режиме, используя алгоритм LRU и механизм compressed memory (сжатие неиспользуемых страниц в памяти, а не запись на диск). Демон называется vm_pageout и активируется при нехватке свободной памяти.

Влияние на производительность

Страничный демон оказывает значительное влияние на производительность системы. Чрезмерная активность демона (так называемый thrashing — «пробуксовка») возникает, когда операционная система тратит больше времени на подкачку страниц, чем на выполнение программ. Это происходит при нехватке физической памяти и высокой интенсивности страничных прерываний. Признаки thrashing:

  • Высокая загрузка диска (своп-активность).
  • Резкое падение производительности (система «зависает»).
  • Увеличение времени отклика процессов.

Для борьбы с thrashing используются методы:

  • Увеличение объёма оперативной памяти.
  • Настройка параметров демона (например, swappiness в Linux — параметр, определяющий склонность ядра к использованию свопа).
  • Использование SSD для файла подкачки (снижение задержек записи/чтения).
  • Алгоритмы рабочего набора — предотвращение вытеснения страниц, активно используемых процессом.

Критика и альтернативы

Страничный демон критикуется за то, что его работа может быть непредсказуемой и приводить к задержкам в реальном времени. В системах, где требуется детерминированное время отклика (например, встраиваемые системы, промышленные контроллеры), использование виртуальной памяти и страничного демона может быть нежелательным. В таких случаях применяются:

  • Статическое распределение памяти — все процессы получают фиксированные объёмы физической памяти.
  • Отключение свопа — файл подкачки не используется, что исключает вытеснение страниц, но может привести к нехватке памяти.
  • Использование real-time расширений (например, PREEMPT_RT в Linux) — модификации ядра, снижающие задержки, связанные с работой демона.

В современных системах также применяются гибридные подходы, такие как сжатие памяти (zswap, zram в Linux), которое позволяет хранить сжатые страницы в оперативной памяти, уменьшая необходимость обращения к диску.

Интересные факты

  • Термин «демон» (daemon) в контексте страничного демона не имеет отношения к мистике; он был заимствован из греческой мифологии (δαίμων — дух-покровитель) и популяризирован в проекте MULTICS.
  • В ранних версиях Unix (1970-е) страничный демон был реализован как отдельный пользовательский процесс, а не компонент ядра.
  • В Linux параметр swappiness может принимать значения от 0 до 100; значение 0 означает, что ядро будет избегать свопа, а 100 — активно использовать его. По умолчанию в большинстве дистрибутивов установлено значение 60.
  • В Windows файл подкачки (pagefile.sys) может быть расположен на нескольких дисках, что позволяет распределять нагрузку на ввод-вывод.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание, 2015).
  • Бовет Д., Чезати М. «Понимание ядра Linux» (3-е издание, 2005).
  • Документация ядра Linux: «Memory Management» (kernel.org).
  • Документация FreeBSD: «Virtual Memory System» (freebsd.org).
  • Документация Microsoft: «Memory Management in Windows» (learn.microsoft.com).
  • Статья «Page replacement algorithm» в Википедии (англ.).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →