2010-03-30 12 views
11

Jak rozumiem, MEM_RESERVE jest w rzeczywistości "wolną" pamięcią, tj. Dostępną do wykorzystania przez mój proces, ale po prostu jeszcze jej nie przydzielono? Lub został wcześniej przydzielony, ale od tego czasu został uwolniony?Jaka jest dokładna różnica pomiędzy stanami MEM_RESERVE i MEM_COMMIT?

Dokładniej, zobacz w moim adresie wynik poniżej, jak jestem prawie poza wirtualną przestrzenią adresową (99900 KB za darmo, 2307872 jako MEM_PRIVATE, ale stany pokazują, że 44,75% z tego jest w rzeczywistości MEM_RESERVE. Czy to oznacza, że ​​jest rzeczywiście wolny, w moim procesie ... ale może rozdrobniony

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) 

Kontynuacja:

to w kategoriach moim przykładzie, proces ten donosi „out of memory”, ale w rzeczywistości może sprawić przydziały, ale ktoś MEM_RESERVED więcej niż potrzebował w tym momencie, uniemożliwiając innym nawet przydzielenie?

Odpowiedz

7

MEM_RESERVE jest przydzielane przez proces. To znaczy. przestrzeń adresowa jest rozważana w użyciu. Jednak nie zostało ono popełnione. Aby rzeczywiście używać pamięci do przechowywania, należy ją zatwierdzić. Mark Russinovich ma an excellent post, który opisuje wszystkie szczegóły. Ze stanowiska

-r przełącznik Testlimit zawiera ona zarezerwować pamięci wirtualnej, ale nie faktycznie popełnienia go. Zarezerwowana pamięć wirtualna nie może faktycznie przechowywania danych lub kodu, ale aplikacje czasami użyć rezerwacji do stworzenia dużego bloku pamięci wirtualnej, a następnie zatwierdzić go jako konieczne do zapewnienia, że ​​zaangażowana pamięć przylega adres przestrzeń. Gdy proces zatwierdza region pamięci wirtualnej, działający system gwarantuje, że może on przechowywać wszystkie dane przechowywane w pamięci w pamięci fizycznej lub na dysku . Oznacza to, że proces może przebiegać w stosunku do innego ograniczenia: limit zatwierdzania .

+0

Więc jeśli chodzi o mój przykład, proces ten zgłasza "brak pamięci", ale w rzeczywistości MOŻE zrobić alokacje, ale ktoś MEM_RESERVED więcej, niż było to potrzebne w tym momencie, uniemożliwiając komuś innemu przydzielenie? – pj4533

+0

MEM_RESERVED jest za proces, więc proces zarezerwował tę pamięć, a nie kogoś innego (jak w innym procesie). –

+0

Oczywiście, ale chodzi o to, że ten proces raportuje, że alokacje się nie udają, więc problem polega na tym, że ktoś (jakiś podsystem w tym procesie) MEM_RESERVED więcej pamięci, a jej zapobieganie innemu podsystemowi przed przydzielaniem? – pj4533

Powiązane problemy