2010-06-13 3 views
5

От docs:Что такое ошибка страницы памяти?

Примечание: Ядро данных избегает термина unfaulting, потому что это сбивает с толку. Ошибка «ошибки» виртуального . Ошибки страницы: срабатывает, вызван, запущен или встречен . Конечно, вы можете освободить память обратно в ядро ​​в различными способами (используя функции vm_deallocate, munmap или sbrk). Core Данные описывают это как «превращение объекта в неисправность».

Является ли ошибка в основных данных по существу ошибкой страницы памяти? У меня есть лишь небольшое представление о том, что такое страница памяти. Я считаю, что это своего рода «кусок кода в памяти», который необходим для выполнения процедур и т. Д., И по мере того, как приложение запускается, фрагменты кода всасываются в память как «страницы» и отбрасываются, поскольку они не являются нужно больше. Вероятно, 99% неверны;)

Кто-нибудь?

ответ

7

У меня есть лишь небольшое представление о том, что такое страница памяти. Я считаю, что это своего рода «кусок кода в памяти», который необходим для выполнения процедур и т. Д., И по мере того, как приложение запускается, фрагменты кода всасываются в память как «страницы» и отбрасываются, поскольку они не являются нужно больше.

Материал (например, код и данные) существуют в памяти.

Каждая вещь, которая существует в памяти, имеет адрес (адрес памяти).

Адресное пространство памяти (например, 4 ГБ на 32-разрядной машине) разделено на «страницы», где каждая страница представляет собой непрерывный фрагмент памяти (например, 4 КБ на страницу).

Адресное пространство отображается (по ЦП и О/С) в ОЗУ (или, возможно, отображается на порты ввода-вывода, но это совсем другая история).

Может быть установлено меньше ОЗУ (например, 1 ГБ), чем есть адресное пространство (например, 4 ГБ), поэтому некоторые вещи (например, наименее недавно используемые материалы) могут быть заменены (на O/S) из ОЗУ в файл страницы на диске. Целые, цельные страницы (например, 4KB) - это то, что обменивается (а не отдельные байты).

Когда приложение пытается получить доступ к адресу, который в настоящее время не отображается в ОЗУ, это так называемая ошибка страницы. Чтобы обработать ошибку страницы, то O/S может:

  • Освободите RAM, путем замены что-то (например, наименее недавно использованные) из оперативной памяти на диск
  • Карта, которая недавно освобожденный теперь доступной оперативной памяти адрес, к которому приложение пытается получить доступ
  • Переключитесь в ОЗУ с диска, независимо от того, что должно быть на этом адресе (который в какой-то момент ранее был выгружен из этого адреса на диск)
  • Резюме приложение, в котором оно остановилось: приложение снова пытается получить доступ к этому адресу памяти, только на этот раз без другой ошибки страницы.
+1

I не обращайте внимания на то, что вы замаскиваете всю вещь виртуальной памяти (как и я), но учитывая уровень детализации, который вы дали, разве вы не думаете, что вам стоит упомянуть об этом? То, как вы это описываете, похоже, что каждое приложение сопоставляет физическую память. Как правило, то, что поменялось, не привязано к физическому адресу, а скорее другая (виртуальная) страница вашего собственного приложения. Нет необходимости использовать характеристики использования памяти приложения для воздействия на чье-либо приложение. – tvanfosson

+1

@tvanfosson Мне не пришло в голову упомянуть об этом, и теперь, когда вы предложили его, я не знаю, как его суммировать. Но каким-то образом каждое приложение * является * отображением в физическую память: каждое приложение видит целые (или большую часть) адресного пространства, как если бы адресное пространство принадлежало только этому приложению, а O/S отображает адресное пространство в ОЗУ , Несколько приложений подразумевают несколько экземпляров адресного пространства, а разные экземпляры конкурируют друг с другом за ОЗУ. – ChrisW

+0

Решение о замене (например, выбор страницы, используемой этим приложением, или другим приложением) - это детализация реализации, специфичная для O/S (и я не знаю, какие детали для iPhone). – ChrisW

2

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

Этот механизм подлежит реализации ОС.
Для более полного изучения теории операционных систем я бы рекомендовал книгу «Современные операционные системы» А.С.Тененбаума.

3

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

+0

Таким образом, страница загружается в память автоматически, когда указатель указывает на местоположение, которое в настоящее время не загружено? – dontWatchMyProfile

+0

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

+0

связано с так называемым «файлом подкачки»? – dontWatchMyProfile

Смежные вопросы