Какова точная разница между состояниями MEM_RESERVE и MEM_COMMIT? - PullRequest
12 голосов
/ 30 марта 2010

Насколько я понимаю, 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 больше, чем им нужно в этот момент, не позволяя кому-то еще даже иметь возможность выделять?

1 Ответ

9 голосов
/ 30 марта 2010

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

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

...