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

Страничное нарушение

Страничное нарушение (англ. page fault) — это событие, возникающее при попытке программы обратиться к странице виртуальной памяти, которая в данный момент не загружена в физическую оперативную память (ОЗУ). Страничное нарушение является механизмом, используемым операционными системами для реализации виртуальной памяти, подкачки (свопинга) и защиты памяти. При возникновении страничного нарушения процессор генерирует исключение (прерывание), которое обрабатывается ядром операционной системы.

Причины возникновения

Страничное нарушение происходит, когда процессор, выполняя инструкцию программы, обращается к виртуальному адресу, который не отображён на физическую страницу памяти. Основные причины:

  • Отсутствие страницы в памяти: запрашиваемая страница была выгружена на диск (в файл подкачки или раздел свопа) для освобождения ОЗУ для других процессов.
  • Недоступность страницы: страница существует в памяти, но процесс не имеет прав на её чтение, запись или выполнение (например, попытка записи в страницу, помеченную как «только для чтения»).
  • Недействительное отображение: виртуальный адрес не соответствует ни одной странице в таблице страниц процесса (например, ошибка в программе или обращение к невыделенной памяти).

Типы страничных нарушений

В зависимости от причины и способа обработки различают несколько типов страничных нарушений:

Мягкое страничное нарушение (soft page fault)

Возникает, когда требуемая страница находится в оперативной памяти, но не отображена в таблицу страниц текущего процесса. Это может произойти, если страница используется другим процессом (например, в разделяемой памяти) или находится в кэше страниц (page cache) после недавнего освобождения. Обработка мягкого нарушения заключается в обновлении таблицы страниц без обращения к диску, что занимает относительно мало времени (порядка микросекунд).

Жёсткое страничное нарушение (hard page fault)

Требуемая страница отсутствует в ОЗУ и должна быть загружена с диска (из файла подкачки, исполняемого файла или файла данных). Обработка жёсткого нарушения включает:

  1. Приостановку выполнения процесса.
  2. Поиск свободной страницы в ОЗУ (или вытеснение другой страницы на диск, если память занята).
  3. Чтение данных с диска в выбранную физическую страницу.
  4. Обновление таблицы страниц.
  5. Возобновление выполнения программы.

Время обработки жёсткого нарушения может составлять миллисекунды, что значительно замедляет работу системы.

Недействительное страничное нарушение (invalid page fault)

Возникает при обращении к виртуальному адресу, который не выделен процессу (например, разыменование нулевого указателя). В этом случае операционная система обычно завершает процесс с ошибкой (segmentation fault в Unix-подобных системах или access violation в Windows).

Механизм обработки

Обработка страничного нарушения является частью подсистемы управления памятью операционной системы. Последовательность действий:

  1. Генерация исключения: процессор, обнаружив отсутствие отображения в таблице страниц (бит присутствия сброшен), передаёт управление ядру ОС.
  2. Определение причины: ядро проверяет, является ли адрес допустимым для процесса (находится ли он в адресном пространстве процесса). Если нет — генерируется ошибка.
  3. Поиск страницы: ядро ищет страницу в списке доступных физических страниц, в кэше или на диске.
  4. Загрузка или создание отображения: если страница на диске, она считывается в ОЗУ; если она уже в памяти (например, разделяемая), таблица страниц обновляется.
  5. Возобновление: выполнение прерванной инструкции повторяется — на этот раз обращение к памяти должно быть успешным.

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

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

  • Размера рабочего набора процесса: чем больше памяти требуется программе, тем выше вероятность вытеснения страниц.
  • Алгоритма замещения страниц: используемый ОС алгоритм (LRU, FIFO, Clock и др.) определяет, какие страницы выгружаются на диск при нехватке памяти.
  • Объёма доступной физической памяти: при недостатке ОЗУ система тратит значительное время на подкачку (thrashing — «пробуксовка»).

Для снижения числа страничных нарушений применяются методы предварительной подкачки (prefetching), увеличение объёма ОЗУ и оптимизация алгоритмов планирования памяти.

История

Концепция страничного нарушения возникла вместе с развитием виртуальной памяти в 1960-х годах. Первые коммерческие системы, использующие подкачку страниц, появились в начале 1970-х годов (например, IBM System/370). В современных операционных системах (Windows, Linux, macOS) механизм страничных нарушений остаётся ключевым для обеспечения изоляции процессов и эффективного использования памяти.

Примеры

  • Windows: при запуске приложения, часть кода которого выгружена в файл подкачки, возникает жёсткое страничное нарушение, и ОС загружает недостающие страницы.
  • Linux: в ядре Linux обработка страничных нарушений реализована в функции do_page_fault(), которая анализирует причину и вызывает соответствующий обработчик (например, handle_mm_fault()).
  • Браузеры: при прокрутке веб-страницы с большим количеством изображений могут возникать мягкие страничные нарушения, если изображения кэшированы в памяти.

Критика и ограничения

Основной недостаток механизма страничных нарушений — непредсказуемая задержка при обращениях к памяти, что критично для систем реального времени. В таких системах часто применяется фиксация страниц в памяти (page locking) или использование статического выделения памяти. Кроме того, при интенсивной подкачке (thrashing) производительность системы может резко упасть, так как большая часть времени тратится на дисковые операции.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы». 4-е изд. — СПб.: Питер, 2015.
  • Love R. «Linux Kernel Development». 3rd ed. — Addison-Wesley, 2010.
  • Silberschatz A., Galvin P. B., Gagne G. «Operating System Concepts». 10th ed. — Wiley, 2018.
  • Документация ядра Linux: «Memory Management» (kernel.org).
  • Microsoft Docs: «Page Faults» (Windows Driver Kit).

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

На главную BFOmetr →