Отказ страницы

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

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

Несмотря на название, отказы при обращении к допустимым страницам являются нормальной частью функционирования любой операционной системы, использующей виртуальную память, включая OpenVMS, Microsoft Windows и UNIX-подобных системы. Фактически, они являются просто сигналами, необходимыми операционной системе для выделения памяти работающим программам.

Типы

Лёгкий или программный

Отказ страницы, который в Linux-подобных системах называется лёгким (англ. minor)[2], а в Windows — программным (англ. soft)[3], означает, что требуемая страница либо уже находится в оперативной памяти, но не отмечена в блоке управления памятью как загруженная, либо она вновь выделена и ещё ни разу не использовалась. Обработчик исключения в операционной системе должен только добавить запись в таблицу страниц для требуемой страницы и указать, что она загружена в память. Загрузка страницы с диска не требуется. Отказ происходит в следующих случаях[3]:

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

Поскольку обработка таких отказов не сопровождается задержкой для обращения к диску, они обрабатываются быстрее значительных или аппаратных отказов.

Значительный или аппаратный

Отказ страницы, который в Linux-подобных системах называется значительным (англ. major)[2], а в Windows — аппаратным (англ. hard)[3], является основным механизмом, используемым операционной системой для выделения программам памяти по их запросу. Операционная система откладывает загрузку частей программы с диска до тех пор, пока программа не попытается получить доступ к ним и тем самым сгенерирует отказ страницы. Если страница не загружена в память на момент отказа, тогда отказ называется значительным или аппаратным. Обработчик отказа страницы в операционной системе должен найти свободное место в оперативной памяти: свободную либо занятую страницу. Занятая страница может принадлежать другому процессу. В этом случае операционная система должна выгрузить данные этой страницы на диск (если они не были выгружены ранее) и пометить эту страницу в таблице страниц процесса как отсутствующую в памяти. Как только свободное место становится доступным, операционная система может загрузить данные для новой страницы в память, добавить её физический адрес в таблицу страниц исходного процесса и пометить страницу, как находящуюся в памяти. Необходимость обращения к диску делает обработку таких отказов гораздо более медленной по сравнению с лёгкими.

Обращение к недействительной странице

Если отказ страницы возникает при обращении к адресу, не принадлежащему виртуальному адресному пространству процесса, то есть страницы в памяти, соответствующей этому адресу, не может быть, тогда этот отказ называется отказом недействительной страницы (англ. invalid page fault). Обработчик отказа страницы в операционной системе в этом случае, как правило, передает ошибку сегментации исходному процессу, показывая, что обращение было недействительным. Это приводит к аварийному завершению блока кода, выполнившего недействительное обращение. Примером недействительного обращения является разыменование нулевого указателя. Нулевой указатель — это указатель, не ссылающийся ни на какой объект. Обычно он представляется как указатель на адрес 0. Большинство операционных систем не включают страницу, содержащую нулевой адрес, в адресное пространство процесса, поэтому попытки чтения или записи памяти через нулевой указатель приводят к отказу недействительной страницы.

Примечания

  1. Э. Танненбаум. Современные операционные системы = Modern Operating Systems. — 2-е изд. — СПб.: Питер, 2002. — С. 235. — 1040 с. — ISBN 5-318-00299-4.
  2. 2,0 2,1 Chapter 2. Memory allocation (англ.). Дата обращения: 30 декабря 2017. Архивировано 11 февраля 2015 года.
  3. 3,0 3,1 3,2 Working Set (Windows) (англ.). Дата обращения: 30 декабря 2017. Архивировано 2 ноября 2017 года.

Ссылки