Страничный сбой¶
Страничный сбой (англ. page fault) — это событие, возникающее при работе операционной системы (ОС), когда программа обращается к странице виртуальной памяти, которая в данный момент не загружена в физическую оперативную память (ОЗУ). Страничный сбой является штатным механизмом работы подсистемы управления памятью, реализующей концепцию виртуальной памяти. При возникновении сбоя процессор генерирует исключение (прерывание), которое обрабатывается ядром ОС: система приостанавливает выполнение текущей программы, загружает требуемую страницу с диска (из файла подкачки или исполняемого файла) в ОЗУ, обновляет таблицы страниц и возобновляет выполнение программы. В отличие от ошибок приложений, страничный сбой не является аварийным состоянием, а служит инструментом для эффективного распределения памяти между процессами.
¶Причины возникновения
Страничные сбои возникают в нескольких типовых ситуациях, связанных с особенностями работы виртуальной памяти.
¶Отсутствие страницы в памяти (недействительный бит присутствия)
Наиболее распространённая причина. Каждая страница виртуальной памяти имеет соответствующий бит присутствия в таблице страниц. Если этот бит сброшен, процессор считает, что страница не загружена, и инициирует сбой. Это может происходить в следующих случаях:
- Подкачка (swapping): страница была выгружена на диск (в файл подкачки или раздел подкачки) для освобождения ОЗУ для других процессов.
- Отложенная загрузка (demand paging): страница ещё ни разу не загружалась в память, хотя виртуальное адресное пространство уже выделено. ОС загружает её только при первом обращении.
- Отображение файлов (memory-mapped files): страница соответствует участку файла на диске, который ещё не был прочитан в ОЗУ.
¶Ошибка защиты (protection fault)
Возникает, когда программа пытается выполнить операцию, запрещённую для данной страницы. Например, попытка записи в страницу, помеченную как «только для чтения», или попытка выполнения кода на странице, помеченной как «неисполняемая». В зависимости от контекста, такой сбой может быть обработан ОС (например, при копировании при записи — copy-on-write) или приводить к аварийному завершению программы (segmentation fault).
¶Недействительный адрес (invalid page fault)
Программа обращается к виртуальному адресу, который не соответствует ни одной выделенной странице в её адресном пространстве. Это типичная ошибка программирования (например, разыменование нулевого указателя). В этом случае ОС, как правило, завершает процесс с сообщением об ошибке (в Windows — «Access violation», в Linux — «Segmentation fault»).
¶Типы страничных сбоев
В операционных системах различают два основных типа страничных сбоев по степени влияния на производительность.
¶Мягкий (незначительный) сбой (minor/soft page fault)
Страница, к которой происходит обращение, уже находится в физической памяти, но не отражена в таблице страниц текущего процесса. Такая ситуация возникает, например, при совместном использовании страниц несколькими процессами (shared memory) или при копировании при записи. ОС просто обновляет таблицу страниц, не выполняя операций ввода-вывода с диском. Мягкие сбои обрабатываются быстро и практически не влияют на производительность.
¶Жёсткий (значительный) сбой (major/hard page fault)
Страница отсутствует в физической памяти и должна быть загружена с диска. Это требует операции ввода-вывода, которая может занимать миллисекунды — на несколько порядков дольше, чем доступ к ОЗУ. Жёсткие сбои являются основной причиной замедления работы системы при нехватке оперативной памяти. Высокая частота жёстких страничных сбоев (так называемый «треппинг» или thrashing) свидетельствует о том, что системе не хватает ОЗУ для текущей нагрузки.
¶Обработка страничного сбоя
Последовательность действий, выполняемых ядром ОС при возникновении страничного сбоя, включает несколько этапов:
- Аппаратное прерывание: процессор, обнаружив отсутствие страницы, сохраняет контекст текущего процесса и передаёт управление обработчику прерываний в ядре.
- Проверка адреса: ядро определяет, является ли виртуальный адрес, вызвавший сбой, допустимым для данного процесса. Если адрес недействителен, процесс завершается.
- Поиск страницы: ядро находит расположение требуемой страницы на диске (в файле подкачки, в исполняемом файле или в специальной области).
- Освобождение места: если в ОЗУ нет свободных страниц, ядро выбирает страницу для вытеснения (жертву) согласно алгоритму замещения страниц (например, LRU — Least Recently Used). Если вытесняемая страница была изменена (dirty bit установлен), она записывается на диск.
- Загрузка страницы: ядро инициирует чтение страницы с диска в освобождённый или свободный кадр физической памяти. Во время ожидания ввода-вывода процесс может быть переведён в состояние ожидания, а процессор — переключён на выполнение другого процесса.
- Обновление таблиц: после завершения загрузки ядро обновляет таблицу страниц, устанавливая бит присутствия и указывая физический адрес страницы.
- Возобновление: контекст процесса восстанавливается, и выполнение прерванной инструкции повторяется. На этот раз страница присутствует, и инструкция выполняется успешно.
¶Влияние на производительность
Страничные сбои — неотъемлемая часть работы современных ОС, однако их избыточное количество, особенно жёстких сбоев, ведёт к резкому падению производительности. Операция чтения с диска (даже с SSD) занимает на несколько порядков больше времени, чем доступ к ОЗУ. Если система тратит большую часть времени на подкачку страниц вместо выполнения полезной работы, возникает состояние thrashing (треппинг). Это явление характерно для ситуаций, когда суммарный объём памяти, требуемый активными процессами, превышает объём физической ОЗУ.
Для снижения негативного влияния страничных сбоев применяются следующие методы:
- Увеличение объёма ОЗУ.
- Использование алгоритмов упреждающей подкачки (prefetching), когда ОС загружает страницы, которые, вероятно, скоро понадобятся, до фактического обращения.
- Оптимизация алгоритмов замещения страниц (например, использование алгоритма, учитывающего частоту обращений).
- Настройка размера страницы: более крупные страницы уменьшают количество сбоев, но увеличивают внутреннюю фрагментацию.
¶Страничные сбои в различных операционных системах
Механизм обработки страничных сбоев реализован во всех современных ОС общего назначения, но имеет особенности.
¶Windows
В Windows страничные сбои обрабатываются диспетчером памяти (Memory Manager). Система использует файл подкачки (pagefile.sys) для хранения выгруженных страниц. В Windows 10 и 11 предусмотрена функция сжатия памяти (Memory Compression), которая позволяет хранить часть страниц в сжатом виде в ОЗУ вместо выгрузки на диск, что снижает количество жёстких сбоев. Для мониторинга страничных сбоев используется системный монитор (Performance Monitor) и счётчики «Pages/sec» и «Page Faults/sec».
¶Linux
В Linux обработка страничных сбоев реализована в ядре (подсистема управления памятью). Для выгрузки страниц используется раздел подкачки (swap partition) или файл подкачки (swap file). Linux поддерживает механизм huge pages (большие страницы), который уменьшает количество записей в таблице страниц и, соответственно, количество сбоев для приложений, работающих с большими объёмами памяти. Для диагностики используются утилиты vmstat, sar, top, а также файловая система /proc (например, /proc/meminfo).
¶macOS
macOS (на базе ядра XNU) также использует механизм виртуальной памяти и страничных сбоев. Система применяет динамическую подкачку и сжатие памяти (Memory Compression), аналогичное Windows. Для мониторинга используется утилита vm_stat и приложение «Мониторинг системы» (Activity Monitor).
¶Инструменты диагностики
Для выявления и анализа страничных сбоев в ОС предусмотрены различные инструменты:
- Системные мониторы: Windows Performance Monitor, Linux
vmstat, macOSvm_stat. - Профилировщики: Intel VTune, perf (Linux), Xcode Instruments (macOS).
- Счётчики производительности: в Windows — «Memory\Page Faults/sec», «Memory\Pages Input/sec»; в Linux —
pgfaultиpgmajfaultиз/proc/vmstat.
Высокое значение счётчика «Pages Input/sec» (жёсткие сбои) указывает на нехватку ОЗУ. Нормальным считается уровень, когда количество жёстких сбоев не превышает нескольких единиц в секунду на процесс; значения в десятки и сотни свидетельствуют о проблемах с производительностью.
¶Источники
- Таненбаум Э., Бос Х. Современные операционные системы. — 4-е изд. — СПб.: Питер, 2015. — 1120 с.
- Сильбершац А., Гэлвин П., Гэгн Г. Операционные системы: внутренняя структура и принципы проектирования. — 9-е изд. — М.: Вильямс, 2016. — 912 с.
- Документация Microsoft: «Page Faults» (Windows Driver Kit).
- Документация Linux: «Memory Management» (Linux Kernel Documentation).
- Документация Apple: «Virtual Memory» (macOS Developer Library).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


