В чем разница между зарезервированной и выделенной памятью? - PullRequest
47 голосов
/ 14 марта 2010

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

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

Ответы [ 3 ]

48 голосов
/ 14 марта 2010

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

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

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

11 голосов
/ 18 сентября 2014

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

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

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

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

5 голосов
/ 29 августа 2014

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

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

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

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

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