Страничное нарушение¶
Страничное нарушение (англ. page fault) — это событие, возникающее при попытке программы обратиться к странице виртуальной памяти, которая в данный момент не загружена в физическую оперативную память (ОЗУ). Страничное нарушение является механизмом, используемым операционными системами для реализации виртуальной памяти, подкачки (свопинга) и защиты памяти. При возникновении страничного нарушения процессор генерирует исключение (прерывание), которое обрабатывается ядром операционной системы.
¶Причины возникновения
Страничное нарушение происходит, когда процессор, выполняя инструкцию программы, обращается к виртуальному адресу, который не отображён на физическую страницу памяти. Основные причины:
- Отсутствие страницы в памяти: запрашиваемая страница была выгружена на диск (в файл подкачки или раздел свопа) для освобождения ОЗУ для других процессов.
- Недоступность страницы: страница существует в памяти, но процесс не имеет прав на её чтение, запись или выполнение (например, попытка записи в страницу, помеченную как «только для чтения»).
- Недействительное отображение: виртуальный адрес не соответствует ни одной странице в таблице страниц процесса (например, ошибка в программе или обращение к невыделенной памяти).
¶Типы страничных нарушений
В зависимости от причины и способа обработки различают несколько типов страничных нарушений:
¶Мягкое страничное нарушение (soft page fault)
Возникает, когда требуемая страница находится в оперативной памяти, но не отображена в таблицу страниц текущего процесса. Это может произойти, если страница используется другим процессом (например, в разделяемой памяти) или находится в кэше страниц (page cache) после недавнего освобождения. Обработка мягкого нарушения заключается в обновлении таблицы страниц без обращения к диску, что занимает относительно мало времени (порядка микросекунд).
¶Жёсткое страничное нарушение (hard page fault)
Требуемая страница отсутствует в ОЗУ и должна быть загружена с диска (из файла подкачки, исполняемого файла или файла данных). Обработка жёсткого нарушения включает:
- Приостановку выполнения процесса.
- Поиск свободной страницы в ОЗУ (или вытеснение другой страницы на диск, если память занята).
- Чтение данных с диска в выбранную физическую страницу.
- Обновление таблицы страниц.
- Возобновление выполнения программы.
Время обработки жёсткого нарушения может составлять миллисекунды, что значительно замедляет работу системы.
¶Недействительное страничное нарушение (invalid page fault)
Возникает при обращении к виртуальному адресу, который не выделен процессу (например, разыменование нулевого указателя). В этом случае операционная система обычно завершает процесс с ошибкой (segmentation fault в Unix-подобных системах или access violation в Windows).
¶Механизм обработки
Обработка страничного нарушения является частью подсистемы управления памятью операционной системы. Последовательность действий:
- Генерация исключения: процессор, обнаружив отсутствие отображения в таблице страниц (бит присутствия сброшен), передаёт управление ядру ОС.
- Определение причины: ядро проверяет, является ли адрес допустимым для процесса (находится ли он в адресном пространстве процесса). Если нет — генерируется ошибка.
- Поиск страницы: ядро ищет страницу в списке доступных физических страниц, в кэше или на диске.
- Загрузка или создание отображения: если страница на диске, она считывается в ОЗУ; если она уже в памяти (например, разделяемая), таблица страниц обновляется.
- Возобновление: выполнение прерванной инструкции повторяется — на этот раз обращение к памяти должно быть успешным.
¶Влияние на производительность
Страничные нарушения, особенно жёсткие, являются одним из основных факторов снижения производительности вычислительных систем. Частота страничных нарушений (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 →


