Подтвердить что ты не робот

Какая разница между состояниями MEM_RESERVE и MEM_COMMIT?

Насколько я понимаю, MEM_RESERVE на самом деле является "свободной" памятью, то есть доступной для использования моим процессом, но пока еще не выделен? Или он был ранее выделен, но с тех пор был освобожден?

В частности, см. в моем адресе ниже, как я почти из виртуального адресного пространства (99900 КБ бесплатно, 2307872 как MEM_PRIVATE. Но состояния показывают, что 44,75% от этого фактически MEM_RESERVE. Означает ли это, что это фактически бесплатно, в моем процессе... но, возможно, фрагментировано?

0:000> !address -summary
 --------- PEB a8bd8000 not found ----

-------------------- Usage SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots) Pct(Busy)   Usage
   259af000 (  616124) : 22.29%    23.12%    : RegionUsageIsVAD
    618f000 (   99900) : 03.61%    00.00%    : RegionUsageFree
   13e22000 (  325768) : 11.78%    12.22%    : RegionUsageImage
   42c04000 ( 1093648) : 39.56%    41.04%    : RegionUsageStack
     42d000 (    4276) : 00.15%    00.16%    : RegionUsageTeb
   2625d000 (  625012) : 22.61%    23.45%    : RegionUsageHeap
          0 (       0) : 00.00%    00.00%    : RegionUsagePageHeap
          0 (       0) : 00.00%    00.00%    : RegionUsagePeb
       1000 (       4) : 00.00%    00.00%    : RegionUsageProcessParametrs
       1000 (       4) : 00.00%    00.00%    : RegionUsageEnvironmentBlock
       Tot: a8bf0000 (2764736 KB) Busy: a2a61000 (2664836 KB)

-------------------- Type SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots)  Usage
    618f000 (   99900) : 03.61%   : <free>
   13e22000 (  325768) : 11.78%   : MEM_IMAGE
    1e77000 (   31196) : 01.13%   : MEM_MAPPED
   8cdc8000 ( 2307872) : 83.48%   : MEM_PRIVATE

-------------------- State SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots)  Usage
   57235000 ( 1427668) : 51.64%   : MEM_COMMIT
    618f000 (   99900) : 03.61%   : MEM_FREE
   4b82c000 ( 1237168) : 44.75%   : MEM_RESERVE

Largest free region: Base 7e4a1000 - Size 000ff000 (1020 KB)

ПОСЛЕДОВАТЕЛЬНОСТЬ:

Итак, с точки зрения моего примера, этот процесс сообщает об "нехватке памяти", но на самом деле он МОЖЕТ делать выделения, но кто-то MEM_RESERVED больше, чем им нужно в этот момент, не позволяя кому-то еще даже выделять возможности?

4b9b3361

Ответ 1

MEM_RESERVE выделяется процессом. То есть адресное пространство считается используемым. Однако он не был совершен. Чтобы фактически использовать память для хранения, она должна быть зафиксирована. У Марка Руссиновича отличный пост, который описывает все детали. Из сообщения

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