Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: manager pamieci

Witam,

potrzebuje jakis info na temat pisania nakladki na menager pamieci, chodzi mi tu glownie o zmiane strategi alokowania malych blokow, kontrole wykorzystania zasobow oraz prostsze debugowanie.

mam takze pytanie bardziej teoretyczne: w jaki sposob radzic sobie z pamiecia w duzym programie? jak kontrolowac zzeranie zasobow, pozbyc sie memory leakow oraz nie tracic kontroli gdy cos w systemie sie wysypie.

temat troche z tylka, ale za wszelkie porady z gory dzieki :>

konto usunięte

Temat: manager pamieci

Łukasz Cepowski:
Witam,

potrzebuje jakis info na temat pisania nakladki na menager pamieci, chodzi mi tu glownie o zmiane strategi alokowania malych blokow


poszukaj o menory pool, bodajże Alekandersku w jednej ze swoich publikacji podał przykład dość dobrego rozwiązania.

konto usunięte

Temat: manager pamieci

Jednym ze sposobów na uniknięcie/zredukowanie wycieków to stosowanie inteligentnych wskaźników i kierowanie się zasadą RAII (Resource Acquisition is Initialization). Inni do tego starają się unikać alokacji pamięci gdzie popadnie i ograniczają się do robienia tego w jednym centralnym miejscu, dzięki czemu nieco łatwiej jest kontrolować zwalnianie przydzielonej pamięci. Dobrze jest też wykorzystywać fabryki, aby nie wciskać wszędzie w kodzie operatora "new", co już zwiększa ryzyko na to, że zapomnisz później pamięci zwolnić. No i ostatecznie... najlepszy sposób na brak wycieków to niestosowanie dynamicznych przydziałów pamięci ;). Jeśli chodzi o kontrolę nad "sypaniem się" - możesz stosować bloki try/catch i poszczególne wyjątki odpowiednio obsługiwać.

Co do pierwszej części pytania, w książce "C++ dla programistów gier" (Mike Dickheiser) jest podany dobry przykład menedżera pamięci, który dodatkowo redukuje problem jej fragmentacji po wielu alokacjach/dealokacjach z wykorzystaniem wspomnianych już pul pamięci.Krzysztof Kondrak edytował(a) ten post dnia 01.06.09 o godzinie 15:59
Artur Kęska

Artur Kęska Senior Software
Developer, XNet
Communications

Temat: manager pamieci

Łukasz Cepowski:
Witam,

potrzebuje jakis info na temat pisania nakladki na menager pamieci, chodzi mi tu glownie o zmiane strategi alokowania malych blokow, kontrole wykorzystania zasobow oraz prostsze debugowanie.

Hmm, z ciekawości - OS robi to źle? Czy może chodzi o jakąś szczególną sytuację, gdy da się przewidzieć użycie pamięci?
mam takze pytanie bardziej teoretyczne: w jaki sposob radzic sobie z pamiecia w duzym programie? jak kontrolowac zzeranie zasobow, pozbyc sie memory leakow oraz nie tracic kontroli gdy cos w systemie sie wysypie.

temat troche z tylka, ale za wszelkie porady z gory dzieki :>


Do technik podanych przez Krzysztofa dorzucę jeszcze możliwość korzystania z profierów (np. IBM oferuje bardzo dobre narzędzie Rational Purify - choć potwornie drogie).
Z tanich metod istnieje możliwość przeciążenia operatora new i delete. Pozwala to na napisania własnej ich obsługi i kontrolowanie wycieków. Ponieważ operator new można przeciążyć dodając dodatkowe parametry, umiejętne jego obmakrowanie pozwala nie tylko na stwierdzenie czy są wycieki, ale także np. w której linii kodu niezwolniona pamięć została przydzielona.

konto usunięte

Temat: manager pamieci

z mojego doswiadczenia wynika, ze standardowe dlmalloc/phkmalloc na linuxach radza sobie dobrze z bardzo wymagajacymi aplikacjami. dodatkowo zawsze warto program testowac valgrindem i oprofile. a jesli chodzi o ogolne porady to polecam artykul "the c10k problem" z http://www.kegel.com/c10k.html

pozdrawiam
Grzegorz

konto usunięte

Temat: manager pamieci

Można korzystać z narzędzi do kontrolowania wycieków np. http://dmoulding.googlepages.com/vld.
Marcin Bońka

Marcin Bońka Programista, Neubloc
Polska Sp. z o.o.

Temat: manager pamieci

Można korzystać z narzędzi do kontrolowania wycieków np. http://dmoulding.googlepages.com/vld.

Albo starego dobrego Valgrind'a ;)

Pozdrawiam,
Marcin

Temat: manager pamieci

http://msinilo.pl/blog/?cat=7
Prosty tool, ktory pomogl mi juz w wielu przypadkach. Wersje minimum mozna napisac w 1 popoludnie.
Szymon Kubisiak

Szymon Kubisiak Developer aplikacji
mobilnych Android

Temat: manager pamieci

Jeśli używasz MSVC to już masz opcję DEBUG_NEW i zamykając program widzisz w konsoli debugowej niezwolnione bloki, w której linii zaalokowane oraz ich zawartość. Oczywiście nie ma porównania z valgrindem, ale po prostu włączasz i masz.

Zgadzam się z unikaniem new w kodzie, niestety ma to taką wadę że ograniczając alokację do fabryk i funkcji pomocniczych dostajesz nic nie mówiący raport że osierocony blok zaalokowała fabryka a nie kto ją wywołał.
Mateusz Berezecki

Mateusz Berezecki no fluff, just stuff

Temat: manager pamieci

Zakladam z gory, ze potrafisz programowac, wiec moje podejscie to bardziej "ktory algorytm" niz "jak to zrobic" .

polecam algorytm "Two Level Segregate Fit". Sprawdzony w praktyce i dosc dobry do ogolnych zastosowan. Czasem warto tez wiedziec o tcmalloc oraz arena allocator.

Opis TLSF : http://rtportal.upv.es/rtmalloc/files/ecrts04_tlsf.pdf
TCMalloc : http://goog-perftools.sourceforge.net/doc/tcmalloc.html
Arena allocator rowniez znany jest pod nazwami zone allocator lub region allocator niestety nie udalo mi sie na szybko znalezc jakiegos porzadnego opisu.
Paweł Kozłowski

Paweł Kozłowski System Embedded
Developer, Software
Developer

Temat: manager pamieci

W literaturze w/w Mike'a Dickheisera przewija się wiele ciekawych rozdziałów na temat zarządzania pamięcią. Przy dużych projektach warto, aby jedna osoba z zespołu napisała prosty menadżer, który działałby w wersji beta programu, dobry sposób na wyśledzenie wycieków oraz wgląd na statystyki zużycia pamięci. Gotowe narzędzia są oczywiście dobre, ale ktoś je też musi pisać, czasami warto samemu coś takiego skrobnąć, aby mieć lepsze o tym pojęcie.

konto usunięte

Temat: manager pamieci

Hej,
Łukasz Cepowski:
potrzebuje jakis info na temat pisania nakladki na menager pamieci, chodzi mi tu glownie o zmiane strategi alokowania malych blokow, kontrole wykorzystania zasobow oraz prostsze debugowanie.

W sumie to nie okresliles sie "gdzie" chcesz alokowac, czy jest to user space, czy kernel space (badz jak kto woli Ring0), jaki system, architektura.
Jak chodzi o metody to D.Knuth bodajze opisywal problem alokatorow w swojej literaturze (Sztuka Programowania tom I jezeli dobrze pamietam).

A jezeli chodzi o wycieki: linuxowy Valgrind o ktorym byla juz tu mowa to potega :) [a przynajmniej w user space]
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: manager pamieci

user space, powinno byc jak najbardziej przenosne, ogolnie zarzadzanie pamiecia pod dwa typy problemow:

1 - alokacja duzej ilosci malych struktor danych, pozbycie sie narzutu zwiazanego z wyrownywaniem zaalokowanej pamieci do wielokrotnosci 16bajtow

2 - alokacja bardzo duzych blokow, np: pliki graficzne o duzej rozdzielczosci i glebi kolorow.

ogolnie chce zminimalizowac defragmentacje pamieci oraz pozbyc sie uzywania golego malloca do wszystkiego
Adam B.

Adam B.
elektronik-informaty
k

Temat: manager pamieci

Kiedyś też miałem podobny problem. Aby mieć zawsze możliwość przydzielenia pamięci na duże bloki niestety trzeba walczyć z defragmentacją pamięci - najlepiej poprzez wyrównywanie alokowanej pamięci do 16 lub więcej bajtów, natomiast przy małych strukturach danych dobrze byłoby nie używać wyrównywania lub przynajmniej zmniejszyć je do np. 4 bajtów. Ja rozwiązałem ten problem w taki sposób, że pamięć jest pobierana z różnych obszarów pamięci - w zależności czy potrzebny rozmiar jest mały czy duży.

konto usunięte

Temat: manager pamieci

Łukasz C.:
user space, powinno byc jak najbardziej przenosne, ogolnie zarzadzanie pamiecia pod dwa typy problemow:

Nie napisałeś jeszcze o jaki język chodzi? C czy C++?

Do C++ jest:
http://warp.povusers.org/FSBAllocator/

Mi się nie udało tego uruchomić, ale jest jeszcze Boost pool_alloc, który właśnie pozwala alokować małe obiekty (wyłączona wielowątkowość):


#include "boost/pool/pool_alloc.hpp"

typedef boost::shared_ptr<MyChild> MyChildTransporter;

typedef boost::fast_pool_allocator<
std::pair<string, MyChildTransporter>,
boost::default_user_allocator_new_delete,
boost::details::pool::null_mutex>
MyMapAllocator;

typedef std::map<string, MyChildTransporter, std::less<string>, MyMapAllocator > MyNameMap;


lub prościej:


#include "boost/pool/pool_alloc.hpp"
struct Item;

typedef std::list<Item *, boost::fast_pool_allocator<Item *, boost::default_user_allocator_new_delete, boost::details::pool::null_mutex> > ItemList;


Z narzędzi polecam:
- Memory Validator - pojazuje alokacje w czasie real-time (więc nawet jeśli nie ma wycieków można zobaczyć co pamięć zżera w trakcie działania)

Właśnie znalezione (artykuł z 2003) - narzędzia debugowania:
- http://www.linuxjournal.com/article/6556

Wymieniony wyżej tcmalloc wyglądał bardzo obiecująco, ale nigdzie nie znalazłem instrukcji jak to wykorzystać w VC2010, więc jeśli się coś uda Ci z tym zrobić do daj znać.Piotr L. edytował(a) ten post dnia 14.01.12 o godzinie 11:46

Następna dyskusja:

[win] render okna w pamieci




Wyślij zaproszenie do