Отказ страницы
Отказ страницы (англ. 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. Большинство операционных систем не включают страницу, содержащую нулевой адрес, в адресное пространство процесса, поэтому попытки чтения или записи памяти через нулевой указатель приводят к отказу недействительной страницы.
ПримечанияПравить
- ↑ Э. Танненбаум. Современные операционные системы = Modern Operating Systems. — 2-е изд. — СПб.: Питер, 2002. — С. 235. — 1040 с. — ISBN 5-318-00299-4.
- ↑ 1 2 Chapter 2. Memory allocation (англ.). Дата обращения: 30 декабря 2017. Архивировано 11 февраля 2015 года.
- ↑ 1 2 3 Working Set (Windows) (англ.). Дата обращения: 30 декабря 2017. Архивировано 2 ноября 2017 года.
СсылкиПравить
- William Gatliff. The Linux Kernel’s Memory Management Unit API (англ.). Дата обращения: 30 декабря 2017. Архивировано из оригинала 29 августа 2017 года.