2010-03-13 2 views
44

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

Или есть какая-то большая разница?

+0

Не могли бы вы предоставить ссылку, где вы нашли это определение «зарезервировано»? –

+0

http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78

+3

Ознакомьтесь с презентацией Марка Руссиновича на PDC 10. Он был назван «PDC10: Тайны управления памятью в Windows: часть Один.' Он подробно рассказывает об этом. http://player.microsoftpdc.com – NigelTufnel

ответ

44

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

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

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

+1

«резервное хранилище, выделенное для них»: вы имеете в виду, когда данные, которые хранятся только в кеше, называются зарезервированными, а когда они записываются в ОЗУ или файл подкачки, это называется совершенным? – idbrii

+7

@pydave: Нет, «кеш» и «зарезервировано» - это не связанные понятия. Резервная память похожа на разработчика недвижимости, претендующего на землю, которая позже будет содержать дома. Там ничего нет, но никто не может строить там дома. Committing фактически строит дома и создает инфраструктуру, такую ​​как электричество и канализация. С другой стороны, кеш - это оптимизация для ускорения работы ЦП, все данные все еще хранятся где-то в ОЗУ. –

+1

Значит ли записывать данные на страницу памяти, чтобы эта страница была зафиксирована? (Тогда разница между зарезервированным и фиксированным - это зарезервированное выделение, но используется.) – idbrii

4

Процесс виртуальной памяти (адресное пространство) и фактическое ОЗУ оба разные. у вас может быть 512 МБ физической памяти, но все равно ваш процесс может адресовать виртуальное адресное пространство 4 ГБ (2 ГБ) Каждый адрес в процессе может считаться либо бесплатным, либо зарезервированным, либо совершенным в любой момент времени.

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

резервирование памяти означает резервирование адресного пространства virtuul для будущих целей. он не связан с физической оперативной памятью (сопоставлен с адресами ОЗУ). Где в качестве выделенной памяти означает, что она будет связана с реальной ОЗУ, чтобы вы могли хранить в ней данные.

http://msdn.microsoft.com/en-us/library/ms810627.aspx

+2

Привычка: виртуальную память не нужно резервировать _а отдельный шаг_ до ее совершения. VirtualAlloc может резервировать и фиксировать в одном вызове. Но «резерв» должен быть сделан. Кроме того, фиксация фактически не «распределяет» ОЗУ; это вызывает только последующая ошибка страницы. Я (пытался?) Редактировать «он будет связан» с «он может быть связан» соответственно. Я также добавлю следующее предложение к концу: «Фактическое ОЗУ не выделяется до тех пор, пока вы не получите доступ к выделенному региону и не будете выполняться поэтапно». И еще одно: другой способ использовать бесплатные страницы - это сопоставленная память. –

7

Мне нравится смотреть, как Reserved бронирование адреса пространства так, что никто не может передать его (но я не могу использовать память по этому адресу, потому что она еще не доступна). И Committed как сопоставление, что адресное пространство для физической памяти , чтобы его можно было использовать.

Зачем нужен резерв? Почему бы просто не захватить память? Есть несколько причин, почему я имею в виду:

  1. Некоторые приложения необходим определенный диапазон адресов, скажем, от 0x400000 до 0x600000, но не нуждается в памяти для хранения ничего. Он используется для блокировки доступа к памяти. Например, если какой-либо код обращается к такой области, он будет пойман. (Полезно по какой-то причине.)

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

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