Введение
Ошибка процесса при обращении к невыделенной памяти.
В вычислительной технике ошибка страницы (иногда называемая PF или аппаратной ошибкой) — это исключение, которое генерирует блок управления памятью (MMU), когда процесс обращается к странице памяти без предварительной подготовки. Для доступа к странице требуется добавление сопоставления в виртуальное адресное пространство процесса. Кроме того, фактическое содержимое страницы может потребоваться загрузить из хранилища, например, с диска. MMU обнаруживает ошибку страницы, но ядро операционной системы обрабатывает исключение, делая требуемую страницу доступной в физической памяти или отклоняя недопустимый доступ к памяти. Допустимые ошибки страниц распространены и необходимы для увеличения объема памяти, доступной программам в любой операционной системе, использующей виртуальную память, такой как Windows, macOS и ядро Linux.
Незначительная
Если страница загружена в память в момент возникновения ошибки, но не помечена в блоке управления памятью как находящаяся в памяти, то это называется незначительной или мягкой ошибкой страницы. Обработчику ошибок страницы в операционной системе достаточно обновить запись для этой страницы в блоке управления памятью, указав на её местоположение в памяти и отметив, что страница загружена; повторно считывать страницу с диска не требуется. Это может произойти, если память совместно используется разными программами, и страница уже находится в памяти для других программ. Страница также могла быть исключена из рабочего набора процесса, но ещё не записана на диск или удалена, как это происходит в операционных системах, использующих вторичное кэширование страниц. Например, OpenVMS может удалить страницу, которую не нужно записывать на диск (если она не изменялась с момента последнего чтения с диска), и поместить её в список свободных страниц, если рабочий набор считается слишком большим. Однако содержимое страницы не будет перезаписано, пока она не будет выделена для другого процесса, то есть она остаётся доступной, если к ней обратится исходный процесс до повторного выделения. Поскольку эти ошибки не связаны с задержками, вызванными диском, они выполняются быстрее и обходятся дешевле, чем основные ошибки страницы.
Майор .
Это механизм, используемый операционной системой для увеличения объема доступной программе памяти по требованию. Операционная система откладывает загрузку частей программы с диска до тех пор, пока программа не попытается к ним обратиться и не возникнет ошибка страницы. Если страница не загружена в память в момент возникновения ошибки, это называется серьезной или аппаратной ошибкой страницы. Обработчик ошибок страницы в ОС должен найти свободное место: либо свободную страницу в памяти, либо занятую страницу в памяти. В последнем случае эта страница может использоваться другим процессом, тогда ОС необходимо выгрузить данные с этой страницы на диск (если они не были выгружены после последнего изменения) и отметить эту страницу как не загруженную в таблице страниц процесса. После освобождения места ОС может прочитать данные для новой страницы в память, внести запись о ее расположении в блок управления памятью и отметить страницу как загруженную. Таким образом, серьезные ошибки обходятся дороже незначительных и увеличивают задержку доступа к хранилищу при выполнении прерванной программы.
Недействительный
Если возникает ошибка страницы при обращении к адресу, который не входит в виртуальное адресное пространство, то есть не существует соответствующей ему страницы в памяти, это называется недействительной ошибкой страницы. Обработчик ошибок страницы в операционной системе обычно передает нарушающему процессу ошибку сегментации, указывая на недопустимость доступа; это, как правило, приводит к аварийному завершению кода, вызвавшего недопустимое обращение. Нулевой указатель обычно представляется как указатель на адрес 0 в адресном пространстве; многие операционные системы конфигурируют MMU таким образом, чтобы сигнализировать об отсутствии страницы, содержащей этот адрес, в памяти, и не включают эту страницу в виртуальное адресное пространство, в результате чего попытки чтения или записи памяти, на которую указывает нулевой указатель, вызывают недействительную ошибку страницы.
Недействительные условия
Незаконный доступ и недействительные ошибки страницы могут привести к ошибке сегментации или ошибке шины, вызывая сбой приложения или операционной системы. Чаще всего причиной этих проблем являются программные ошибки, но аппаратные ошибки памяти, например, вызванные разгоном, могут повредить указатели и привести к сбою корректного кода. Операционные системы используют различные механизмы для сообщения об ошибках страниц. Microsoft Windows использует структурированную обработку исключений для сообщения о недействительных ошибках страниц в виде исключений нарушения доступа. UNIX-подобные системы обычно используют сигналы, такие как SIGSEGV, для сообщения об этих ошибках программам. Если программа, получившая ошибку, не обрабатывает её, операционная система выполняет действие по умолчанию, обычно заключающееся в завершении процесса, вызвавшего ошибку, и уведомлении пользователя о некорректной работе программы. Windows часто сообщает о таких сбоях без подробностей. Опытный пользователь может получить детальную информацию с помощью WinDbg и файла минидампа, создаваемого Windows при сбое. UNIX-подобные операционные системы сообщают об этих ситуациях с помощью сообщений об ошибках, таких как "нарушение сегментации" или "ошибка шины", и могут создать дамп памяти (core dump).
Влияние на производительность
Ошибки страниц снижают производительность системы и могут вызывать эффект трешинга. Большие ошибки страниц на обычных компьютерах с жесткими дисками могут существенно влиять на их производительность, поскольку средний жесткий диск имеет среднюю задержку вращения 3 мс, время поиска 5 мс и время передачи 0,05 мс на страницу. Таким образом, общее время для подкачки составляет около 8 мс (= 8000 мкс). Если время доступа к памяти составляет 0,2 мкс, то ошибка страницы замедлит операцию примерно в 40 000 раз. Оптимизация производительности программ или операционных систем часто включает в себя уменьшение количества ошибок страниц. Два основных направления оптимизации – снижение общего объема используемой памяти и повышение локальности данных в памяти. Чтобы уменьшить количество ошибок страниц, разработчики должны использовать подходящий алгоритм замещения страниц, который максимизирует количество попаданий в страницы. Предложено множество таких алгоритмов, например, реализация эвристических алгоритмов для снижения частоты возникновения ошибок страниц. Увеличение объема физической памяти также уменьшает количество ошибок страниц.