2012-06-11 10 views
7

Używam tego kodu:pamięci obraz spadek

#include <iostream> 
#include <cstddef> 


int main(int argc, char *argv[]){ 
    int a1=0, a2=0; 
    int a3,a4; 

    int b1=++a1; 
    int b2=a2++; 

    int*p1=&a1; 
    int*p2=&++a1; 

    size_t st; 
    ptrdiff_t pt; 

    int i=0; 
    while(true){ 
     printf("i: %d",i++); 
    } 
    printf("\n\ni now is: %d\n",i); 
    return 0; 
} 

dlaczego obserwować taki spadek w pamięci obrazu (fiolet): enter image description here legenda:

enter image description here Zrobiłem ten ogólny projekt Win32, nie CLR. Zmieniłem kod, więc zobaczę, kiedy int stało się ostatecznie ujemne. Obecnie() jest:

int i=0; 
    while(0<++i){ 
     printf("i: %d",i++); 
    } 
    printf("\n\ni now is: %d\n",i); 

To dziwne: zobacz co się stało po zaledwie 30000 iteracjach. Dlaczego widzimy te fluktuacje w pamięci obrazu? Teraz widzę, że prawdopodobnie dotyczy to samej VMMap, ponieważ dzieje się tak tylko wtedy, gdy wybiorę "uruchomienie & śledzić nowy proces", ale nie wtedy, gdy "zobacz działający proces" i wskaż działający exe uruchomiony z VS2010. Oto ekran procesu „rozpoczęła & prześledzić”: enter image description here

zaobserwowałem również ogromny stronicowania pamięci, która rozpoczęła się mniej więcej z tego spadku w obrazie (ten stronicowania prawie przyspieszył i szybko wywołał limitu RAM, że mam ustawiony 2GB): enter image description here i tutaj jest uruchomiony proces tylko „oglądane” (prowadzona od VS2010): enter image description here

więc może jakiś problem z zastrzeżeniem zarządzania pamięcią wniosków NET odbywa się tutaj? Wciąż czekam na moją int przekraczania granicy dwóch dopełnień.

cóż ... Muszę ponownie edytować: okazuje się, że jak wcześniej sądzono - malejący efekt obrazu pamięci jest obecny, gdy proces jest oglądany tylko (nie uruchomiony). Poniżej jest dołączony obraz samego procesu 10 minut później (wciąż czeka na toczenie int do ujemny): enter image description here

i tutaj jest:

enter image description here

więc największy dodatni 2-dopełniacza na mój maszyna znajduje się 2 147 483 647 i najmniejszy ujemny jest -2 147 483 648, co jest łatwe do sprawdzenia w ten sposób:

#include <limits> 
const int min_int = std::numeric_limits<int>::min(); 
const int max_int = std::numeric_limits<int>::max(); 

dał mi ten sam wynik: -2 14 7 483 648 i 2 147 483 647

powrót do początku kiedy komentuję wszystko oprócz pętli while() - to samo dzieje się: obraz zmniejsza się po procesie trwającym około 10 minut, więc to nie jest bezużyteczne kod, który to powoduje. ale co?

+0

Czy można odtworzyć ten wzór zużycia pamięci w kółko? – dirkgently

+1

Być może rejestrowanie printf zajmuje trochę miejsca w grafice? –

+0

Jak to możliwe, że obraz ma charakter? @dirkgently, do tej pory to nadal działa, ponieważ chcę zobaczyć, co int ostatecznie będzie – 4pie0

Odpowiedz

3

Zestaw roboczy w dużej mierze znajduje się pod kontrolą systemu operacyjnego. To, co robi twój kod, jest tylko jednym czynnikiem, który bierze pod uwagę przy podejmowaniu decyzji o powiększeniu lub przycięciu zestawu roboczego. Inne czynniki to między innymi to, czy twoja aplikacja jest na pierwszym planie, jak aktywna, jak chciwy jest algorytm sterty, ile ciśnienia pamięci istnieje z powodu wymagań innych procesów itd. Jest to zgodne z projektem.

Krople są prawdopodobnie związane z systemem Windows decydującym o przycięciu zestawu roboczego. Ponieważ większość kodu, który był pierwotnie załadowany, była prawdopodobnie przeznaczona tylko do inicjalizacji i nie była zaangażowana w pętlę, system mógł łatwo odzyskać strony z obrazami na podstawie algorytmu LRU.

Należy zauważyć, że zestaw roboczy przydzielony do rozmiaru obrazu nie jest jedyną częścią, która została przycięta.

+0

tak, stertę również przycięto. dlaczego sterty? i co jest przyczyną tego ogromnego stronicowania, które w końcu wyrzuciło VMMap? stało się to bardzo szybko, około 10 minut. – 4pie0

+0

stronicowanie jest obecne tylko wtedy, gdy proces jest uruchamiany z poziomu VMMap, a nie wtedy, gdy jest obserwowany po wybraniu "zobacz działający proces" – 4pie0

+0

kiedy komentuję wszystko, ale pętla while() to samo dzieje się: obraz maleje po uruchomieniu procesu około 10 minut – 4pie0

Powiązane problemy