C++ zwalnianie pamięci na linuxie w STL

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
alojzikftp
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 09 mar 2011, 20:17
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: Brak
Architektura: x86

C++ zwalnianie pamięci na linuxie w STL

Post autor: alojzikftp »

Cześć,
natrafiłem na pewien problem w Debianie, ale sprawdziłem i to samo jest w Ubuntu i Gentoo.Kompilator g++
Oto kod:

Kod: Zaznacz cały

#include <iostream>
#include <set>
#include <cstdio>
using namespace std;
int main()
{
	set <int> S;
	for(int i=1;i<= 10000000;i++)
	{
		S.insert(i);
	}
	for(int i=1;i<= 10000000;i++)
	{
		S.erase(i);
	}
	while(1)
	{
	}

}
Wrzucam do seta dużo intów, a następnie wszystkie usuwam.
taskmgr w Windows pokazuje że program wykorzystuje ok 300 MB, a potem prawie wszystko zwalnia. Kompilowane przez MinGW.
Natomiast na linuxach program również dochodzi do tych 300 MB, ale już nic nie zwalnia.
Czy jest to normalne?
Wydaje mi się, iż to kwestia jakiegoś zarządzania pamięcią typu "lazy" w linuxach, i że pewnie zostanie zwolnione w razie potrzeby, ale wolę zapytać.
Linki do wyjaśnień może gdzieś w dokumentacji mile widziane :)
Pozdrawiam
Awatar użytkownika
Yuri20
Sędziwy Jeż
Sędziwy Jeż
Posty: 49
Rejestracja: 31 maja 2009, 13:35
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: C++ zwalnianie pamięci na linuxie w STL

Post autor: Yuri20 »

Nawet potem jak wyłaczysz program to nadal pamięć jest zajęta?

EDIT:
Przetestowalem program i niczego dziwnego nie uświadczyłem. Zmienne zwykłe (niereferencyjne, że tak to nazwę) kończą żywot wraz zakończeniem zakresu, w którym zostały zadeklarowane. Zakresem dla twojego seta jest funkcja main i pamięć zostanie zwolniona po zakończeniu tejże funkcji. Widocznie erase nie ma za zadania zwalniać pamięci po swoich elementach, tylko usuwać ja z siebie.
alojzikftp
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 09 mar 2011, 20:17
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: Brak
Architektura: x86

Re: C++ zwalnianie pamięci na linuxie w STL

Post autor: alojzikftp »

Może nie powiedziałem, ale myślałem że while(1) o tym świadczy: interesuje mnie pamięć PODCZAS pracy programu.
Rozmiar zajętej pamięci powinien się zmniejszać, i tak dzieje się na windowsie, a na linuxie nie.
Piszę daemona i nie chciałbym żeby brakło pamięci z takiego powodu, że system nie zwalnia pamięci przez erase.

Jest to oczekiwanym zachowaniem dla rzeczy z STL, które alokują i zwalniają pamięć dynamicznie.
Pozdrawiam
norvoles
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1113
Rejestracja: 04 sty 2008, 20:58
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86_64

Re: C++ zwalnianie pamięci na linuxie w STL

Post autor: norvoles »

Rozmiar zajętej pamięci powinien się zmniejszać, i tak dzieje się na windowsie, a na linuxie nie.
Linux trochę inaczej zarządza pamięcią i inaczej zgłasza jej zużycie. Z resztą, jest bardzo prawdopodobne, że Twój RAM jest aktualnie zajęty w 95-98% ;)
Piszę daemona i nie chciałbym żeby brakło pamięci z takiego powodu, że system nie zwalnia pamięci przez erase.
Wszystko jest w porządku i pamięci nie zabraknie. W tym przypadku system nie traktuje jej już jako zajętej, ale jako pamięć do ponownego użycia i użyje jej, gdy uzna to za stosowne. No chyba, że coś jest nie tak i pamięć Ci wycieka :D
Jest to oczekiwanym zachowaniem dla rzeczy z STL, które alokują i zwalniają pamięć dynamicznie.
Gdyby było inaczej, to po kilku(nastu) uruchomieniach swojego programu nie miałbyś już dostępnej pamięci.
alojzikftp
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 09 mar 2011, 20:17
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: Brak
Architektura: x86

Re: C++ zwalnianie pamięci na linuxie w STL

Post autor: alojzikftp »

Czyli wszystko w porządku, tak jak miałem nadzieję.
Linux trochę inaczej zarządza pamięcią i inaczej zgłasza jej zużycie. Z resztą, jest bardzo prawdopodobne, że Twój RAM jest aktualnie zajęty w 95-98%
O dziwo nie: przy 4 GB RAM prawie świeży Debian używa ok 300 MB RAM.
Gdyby było inaczej, to po kilku(nastu) uruchomieniach swojego programu nie miałbyś już dostępnej pamięci.
Raczej nie, gdyż po ubiciu programu system zwalnia wszystko co zajmował program.
"Problem" dotyczył wskazań podczas pracy mojego programu, które nigdy nie spadały :)
Dzięki za pomoc
norvoles
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1113
Rejestracja: 04 sty 2008, 20:58
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86_64

Re: C++ zwalnianie pamięci na linuxie w STL

Post autor: norvoles »

O dziwo nie: przy 4 GB RAM prawie świeży Debian używa ok 300 MB RAM.
O dziwo tak :D

Kod: Zaznacz cały

free -m
prawdę Ci powie. Te 300 MB to zajęty RAM, ale bez buforów i cache'y ;)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości