2010-12-13 13 views
11


Mam mała aplikacja, która byłem działa teraz i chciałem sprawdzić, czy mam jakieś wycieki pamięci w nim więc umieścić w tym kawałku kodu:Nieobowiązkowe przełączniki kontekstowe: jak mogę im zapobiec?

for (unsigned int i = 0; i<10000; i++) { 
    for (unsigned int j = 0; j<10000; j++) { 
     std::ifstream &a = s->fhandle->open("test"); 
     char temp[30]; 
     a.getline(temp, 30); 
     s->fhandle->close("test"); 
    } 
} 

Kiedy wpadłem aplikację i cat'ed/proc // status, aby sprawdzić, czy pamięć się zwiększy. Wyjście jest następujący po około 2 minutach wykonywania:

Name: origin-test 
State: R (running) 
Tgid: 7267 
Pid: 7267 
PPid: 6619 
TracerPid: 0 
Uid: 1000 1000 1000 1000 
Gid: 1000 1000 1000 1000 
FDSize: 256 
Groups: 4 20 24 46 110 111 119 122 1000 
VmPeak: 183848 kB 
VmSize: 118308 kB 
VmLck:   0 kB 
VmHWM:  5116 kB 
VmRSS:  5116 kB 
VmData:  9560 kB 
VmStk:  136 kB 
VmExe:  28 kB 
VmLib:  11496 kB 
VmPTE:  240 kB 
VmSwap:  0 kB 
Threads: 2 
SigQ: 0/16382 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000002004 
SigCgt: 00000001800044c2 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: ffffffffffffffff 
Cpus_allowed: 3f 
Cpus_allowed_list: 0-5 
Mems_allowed: 00000000,00000001 
Mems_allowed_list: 0 
voluntary_ctxt_switches: 120 
nonvoluntary_ctxt_switches: 26475 

Żadna z wartości uległa zmianie z wyjątkiem ostatniego, więc ma średnią nie ma wycieków pamięci?

Ale co ważniejsze i chciałbym wiedzieć to, jeśli jest źle, że ostatnia wartość szybko rośnie (około 26475 przełączników w około 2 minuty!).

Spojrzałem na innych aplikacjach porównać ile nie volunary przełączniki mają:

  1. Firefox: około 200
  2. Gdm: 2
  3. Netbeans: 19

Następnie Przeszukałem go i dowiedziałem się o kilku rzeczach, ale jest to technicznie dla mnie zrozumiałe. Co mam z tego wynika, że ​​dzieje się tak, gdy aplikacja przełącza procesor lub coś takiego? (Mam bz 6-rdzeniowy procesor Amd).

Jak mogę zapobiec temu, aby moja aplikacja to robiła i na ile to może być problem podczas uruchamiania aplikacji?

Z góry dziękuję, Robin.

+1

Ponieważ jesteś prawdopodobnie na linux, dlaczego nie korzystać valgrind, które pomogą Ci znaleźć możliwego wycieku pamięci? – Palmik

+0

Nie rozumiem, dlaczego uważasz, że ten kod pomoże ci sprawdzić wycieki pamięci. – Ferruccio

+0

Cóż, myślę, że to mogłoby pomóc mu znaleźć wyciek pamięci w kodzie, który przydziela/niszczy ten strumień plików wejściowych. –

Odpowiedz

19

Dobrowolna zmiana kontekstu pojawia się, gdy twoja aplikacja jest zablokowana w wywołaniu systemowym, a jądro decyduje o nadaniu jej czasu innym procesom.

Nieobowiązkowa zmiana kontekstu pojawia się, gdy aplikacja wykorzystała wszystkie timelice przypisane do harmonogramu (jądro próbuje udawać, że każda aplikacja ma dla siebie cały komputer i może używać tyle samo procesora, ile chce, ale ma przełączać się między nimi, aby użytkownik miał wrażenie, że wszystkie działają równolegle).

W twoim przypadku, ponieważ otwierasz, zamykasz i czytasz z tego samego pliku, prawdopodobnie pozostaje on w pamięci podręcznej systemu plików wirtualnych podczas całego wykonywania procesu, a twój program jest wywłaszczany przez jądro, ponieważ nie blokuje (z powodu pamięci podręcznych systemu lub biblioteki). Z drugiej strony, Firefox, Gdm i Netbeans w większości oczekują na dane wejściowe od użytkownika lub z sieci i nie mogą być uprzedzane przez jądro.

Te przełączniki kontekstu nie są szkodliwe. Wręcz przeciwnie, pozwala na to, aby twój procesor był właściwie wykorzystywany przez wszystkie aplikacje, nawet gdy jeden z nich czeka na jakiś zasób. "

A przy okazji, aby wykrywać wycieki pamięci, lepszym rozwiązaniem byłoby użycie dedykowanego narzędzia do tego, na przykład valgrind.

+6

Innymi słowy, to nie jest problem, tak działa Unix. –

+3

Więcej niż Unix, każdy system operacyjny wielozadaniowy z wyprzedzeniem (czyli prawie każdy powszechnie używany system operacyjny). –

+0

Nieobowiązkowe? Czy miałeś na myśli dobrowolne? Jak rozumiem, kiedy wywołujesz system operacyjny, dajesz mu kontrolę, więc jeśli zdecydujesz się na zmianę kontekstu, jest to "dobrowolne". A kiedy twoja aplikacja po prostu zużywa dużo procesora (jak w tych pętlach), system operacyjny może zdecydować się przymusowo zawiesić wykonanie aplikacji i zmienić kontekst "nie na zasadzie dobrowolności". Czy się mylę? –

1

szukać pamięć wyciek jest o wiele lepiej zainstalować i używać valgrind, http://www.valgrind.org/. Zidentyfikuje wycieki pamięci w stercie i błędy pamięci (używając niezainicjowanej pamięci, mnóstwo innych problemów). Używam go prawie codziennie.

Powiązane problemy