malloc & free

Jiri Kosina jikos na jikos.cz
Pondělí Leden 30 22:23:05 CET 2006


On Mon, 30 Jan 2006, Libor Chocholaty wrote:

> >      Mohl bys to více rozvést? Buď jsem to špatně pochopil nebo je to
> > úplná kravina...:-)
> Nejspis to byla uplna kravina. Proste jsem nevedel, ze lze pamet
> pridelenou kernelem vratit. Jak pise Jirka Kosina, vraceni pameti se
> deje pomoci volani brk se zapornym parametrem. I kdyz to nemusi pomoct,
> protoze na konci pameti muze sedet par bytu, ktere clovek neuvolnil a
> pak neni mozne vratit kernelu uvolnenou pamet predtim. Nebo je to jeste
> jinak?

Pokud se po spusteni programu ze zacatku jeho behu alokuji male bloky, 
prelozi prislusna volani malloc() glibc na nekolik volani brk(). Pokud se 
timto postupnym rustem narazi na nejakou jiz obsazenou pamet (typicky kod 
nejake knihovny, namapovany linkerem na vyssi adresu nez je zacatek 
datoveho segmentu (ktery brk() zvetsuje)), zacne glibc pouzivat pro 
alokaci dalsi pameti na vyssich adresach mmap(). Vraceni obou "typu" 
pameti je pak mozne.

Nad touto pameti si samozrejme pak glibc dela vlastni pooly (kterym se 
rika chunky a jedna se o primerene sofistikovanou datovou strukturu), 
nicmene ji nic nebrani pamet kernelu vratit.

Toto vse se deje nad potencialne velmi fragmentovanym virtualnim adresnim 
prostorem - jak jiz radil mj, podivejte se na /proc/<pid>/maps, pro 
ilustraci kde zacina datovy segment, kde jsou dynamickym linkerem mapovane 
knihovny, atd.

-- 
JiKos.


Další informace o konferenci Linux