Резервирование и фиксация памяти

Я читаю < Windows через C/С++ > и здесь некоторые цитаты.

Когда процесс создается и задается его адресное пространство, основная часть этого полезное адресное пространство является бесплатным, или нераспределенной. Чтобы использовать части этого адресное пространство, вы должны выделить регионов внутри него путем вызова VirtualAlloc. Акт выделения область называется резервированием.

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

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

Вот несколько вопросов:

  • Почему нам нужно следить за парадигмой резерв-comit при использовании памяти? Т.е. почему нам нужно следовать этой двухэтапной парадигме вместо того, чтобы напрямую распределять некоторую физическую память и использовать ее?

  • Если физическое хранилище, выделенное для региона, выделено из файла подкачки системы, зачем нам ОЗУ (звучит смешно)? На мой взгляд, область адресного пространства должна отображаться в ОЗУ (через механизм поискового вызова), а страницы ОЗУ должны поддерживаться файлом подкачки.

Возможно, на этот вопрос можно ответить, объяснив следующие 2 аспекта:

  • Что делает резервирование?

  • Что делает фиксация?

Обновление - 1 2:48 вечера 11/23/2010

Это следующая цитата из < Windows через C/С++ 5th edition > , что делает меня озадаченным.

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

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

Итак, где ОЗУ? Что делать, если я настраиваю свою машину на отсутствие файла страницы?

Ответ 1

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

Comming memory - это акт сопоставления какого-либо хранилища на странице. Это может быть расположено в физической RAM, где оно является частью рабочего набора или в файле подкачки. Он также может быть отображен в или в частной памяти. NtAllocateVirtualMemory/VirtualAlloc может резервировать и фиксировать в одно и то же время для удобства.

РЕДАКТИРОВАТЬ обновленный вопрос: когда вы совершаете страницы, это взимается с лимита обязательств квот процесса/общесистемного масштаба. Этот предел определяется объемом доступной физической памяти и размером файла подкачки. Это фактически не означает, что страницы хранятся или записываются в файл подкачки. Они могут быть, если память низкая, но в противном случае страницы в основном хранятся в физической памяти.

Ответ 2

  • Вам фактически не нужно следовать двухэтапной схеме резервирования/фиксации.

    Дело в том, что VirtualAlloc и VirtualFree могут делать несколько вещей. И иногда это действительно полезно. Однако вам не обязательно.

  • Область области памяти - это та, для которой система выделяет физическое хранилище.

    Вам не нужно беспокоиться о том, где именно он выделяется: RAM или файл страницы. Это должно быть прозрачным для вас (если вы не пишете драйвер устройства в режиме ядра). Кроме того, большая часть страниц памяти может быть заменена на файл страницы и загружена в оперативную память по запросу.

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

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