Какая разница между состояниями 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 больше, чем им нужно в этот момент, не позволяя кому-то еще даже выделять возможности?
Ответы
Ответ 1
MEM_RESERVE выделяется процессом. То есть адресное пространство считается используемым. Однако он не был совершен. Чтобы фактически использовать память для хранения, она должна быть зафиксирована. У Марка Руссиновича отличный пост, который описывает все детали. Из сообщения
Testlimits -r имеет резерв виртуальной памяти, но не на самом деле зафиксируйте это. Зарезервированная виртуальная память фактически не хранить данные или код, но приложения иногда используют резервирование для создания большого блока виртуальную память, а затем зафиксировать ее как необходимо обеспечить, чтобы память смежна по адресу пространство. Когда процесс совершает область виртуальной памяти, система гарантирует, что она может поддерживать все данные, хранящиеся в памяти в физической памяти или на диск. Это означает, что процесс может столкнуться с другим лимитом: фиксация.