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ą:
- Firefox: około 200
- Gdm: 2
- 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.
Ponieważ jesteś prawdopodobnie na linux, dlaczego nie korzystać valgrind, które pomogą Ci znaleźć możliwego wycieku pamięci? – Palmik
Nie rozumiem, dlaczego uważasz, że ten kod pomoże ci sprawdzić wycieki pamięci. – Ferruccio
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. –