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

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

А именно, посмотрите в моем! вывод адреса ниже, как я почти вне виртуального адресного пространства (свободных 99 900 КБ, 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 больше, чем им было нужно в той точке, предотвращая кого-то еще даже от способности выделить?

12
задан pj4533 30 March 2010 в 15:20
поделиться

1 ответ

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

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

9
ответ дан 2 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: