Что вызывает ошибки страницы? - PullRequest
25 голосов
/ 16 апреля 2011

Согласно Википедии :

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

Хорошо, это имеет смысл.

Но если это так, то почему при обновлении информации о процессе в Process Hacker я вижу около 15 сбоев страницы?

Screenshot

Или, другими словами, почему какая-то память выгружается? (Я понятия не имею, является ли это памятью пользователя или ядра.) У меня есть no файл подкачки, и использование ОЗУ составляет около 1,2 ГБ из 4 ГБ, то есть после чистой перезагрузки. Там нет недостатка в любом ресурсе; с чего бы что-нибудь выгружать?

Ответы [ 7 ]

39 голосов
/ 17 апреля 2011

(я автор Process Hacker.)

Во-первых:

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

Это не совсем правильно, как объяснено позже в той же статье ( Незначительная ошибка страницы ). Существуют программные сбои страниц, когда ядру нужно только добавить страницу в рабочий набор процесса. Вот таблица из книги Windows Internals (я исключил те, которые приводят к нарушению доступа):

  • Причина ошибки - Результат
  • Доступ к странице, которая не находится в памяти, но находится на диске в файле подкачки или в отображенном файле - Выделить физическую страницу и прочитать нужную страницу с диска и в соответствующий рабочий набор
  • Доступ к странице, находящейся в резервном или измененном списке - Переход страницы к соответствующему рабочему набору процесса, сеанса или системы
  • Доступ к нулевой странице спроса - Добавление заполненной нулями страницы к соответствующему рабочему набору
  • Запись на страницу копирования при записи - Создание частной (или закрытой для сеанса) копии страницы процесса и замена оригинала в рабочем или системном рабочем наборе

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

Теперь, чтобы ответить на ваш вопрос более конкретно: кажется, что Process Hacker имеет ошибки страницы только при обновлении своей служебной информации - то есть, когда он вызывает EnumServicesStatusEx , который RPCs для SCM (services.exe). Я предполагаю, что при этом выделяется много памяти, что приводит к сбоям страниц с нулевым потреблением (для хранения служебной информации требуется несколько страниц, IIRC).

5 голосов
/ 16 апреля 2011

Медленным, но постоянным источником сбоев страниц является то, что ОС проверяет нечасто посещаемые страницы. В этом случае операционная система помечает некоторые страницы как отсутствующие, но оставляет их в памяти как есть. Если приложение обращается к странице, возникает ловушка #PF, и ОС просто отмечает страницу, присутствующую снова, без лишних слов. Если проходит «долгое время», и страница никогда не вызывает ошибку, то ОС знает, что страница является хорошим кандидатом на обмен в случае необходимости. Этот механизм может работать активно даже в периоды отсутствия ресурсов.

4 голосов
/ 16 апреля 2011

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

Предположим, вы сопоставили файл журнала и продолжаете добавлять к нему.Каждый раз, когда вы превышаете конец выделенной памяти, возникает сбой страницы, операционная система предоставит вам новую пустую страницу и отрегулирует длину файла.


Это также могут быть нарушения прав доступа, которые обнаруживаются иобрабатывается программой.


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

В некотором смысле это вариант Ответ Дина : страницыуже находятся в физической ОЗУ, и ОС должна загрузить эти сопоставления в TLB, но не из-за IPC.

Брайан отметил, что x86 (и, следовательно, все системы Win32) обрабатывают это безсбой страницы.


Еще одна причина сбоев страниц - запуск защитных страниц, используемых для увеличения стека и копирования при записи, но обычно они не происходят без привязки.Я не уверен на 100%, будут ли они отображаться как нарушения доступа или нет, потому что они будут помечены как нарушения доступа при входе в ловушку MMU, но, вероятно, обрабатываются обработчиком ошибок страницы ОС и не преобразуются в пользователянарушение режима доступа (SEH).

2 голосов
/ 16 апреля 2011

Каждый раз, когда читается раздел mmap'd, генерируется сбой страницы, который включает в себя каждый раз, когда вы загружаете DLL. Таким образом, загрузка DLL фактически не считывает всю DLL в память, а только вызывает ошибку при выполнении кода.

1 голос
/ 16 апреля 2011

Вы увидите программные ошибки страницы , когда память будет разделена между процессами.По сути, если у вас есть файл с отображенной памятью, совместно используемый двумя процессами, когда второй процесс загружает файл с отображенной памятью, возникают программные ошибки страницы - память уже находится в физической памяти, но операционная система должна исправить памятьтаблицы менеджера, так что адрес виртуальной памяти в вашем процессе указывает на правильную физическую страницу.

Особенно для чего-то вроде Process Hacker, который, вероятно, внедряет код в каждый запущенный процесс (для сбора информации), который он, вероятно, делаетдовольно интенсивное использование разделяемой памяти для выполнения IPC.

0 голосов
/ 16 апреля 2011

Распределение ресурсов - это тонкий баланс между сохранением основного хранилища, доступного для использования, и предотвращением необходимости переходить на вторичное хранилище в максимально возможной степени.Если процесс пытается выделить память и не может, как правило, это исключение, а иногда и фатальное исключение.

По сути, вы не можете хранить все в ОЗУ без свободных ресурсов, потому что, когда программа запускается или запрашиваетЧем больше он рухнет.

0 голосов
/ 16 апреля 2011

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

и помните, что разные операционные системы различаются по алгоритмам подкачки.

Основы ошибок страницы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...