malloc & free

Libor Chocholaty libor_ml1 na mts.cz
Pondělí Leden 30 18:57:02 CET 2006


Martin `MJ' Mares wrote:

>Hello, world!\n
>
>  
>
>>Mam pocit, ze proces od kernelu muze pamet jen dostat nikoli vratit. Na 
>>to by melo slouzit volani brk(2). Programu pak malloc dava pozadovanou 
>>pamet z pameti alokovane procesu.
>>    
>>
>
>Jak uz bylo receno, brk() muze dostat i zaporny parametr.
>
>Ovsem hlavne se uz pro alokovani pameti casto misto brk() pouziva mmap().
>  
>
A alokace pomoci mmap() umoznuje, aby proces mel pridelen nesouvisly kus 
pameti? Jak jinak chcete pamet vracet kernelu? Mel jsem za to, ze proces 
muze mit vzdycky jen ruzne velky souvisly kus pameti. Volanim malloc() 
misto narokuje a pokud mu uz prideleny kus pameti nestaci, tak libc si 
rekne kernelu o dalsi. Naopak zase pomoci free() rika alokatoru v libc, 
ze tenhle kousek uz nebude potrebovat a alokator ho muze znovu pouzit 
pri nekterem pristim volani malloc(). Myslel jsem, ze pamet, kterou 
process dostane od kernelu, funguje jako pool a program pomoci volani 
funkci malloc() a free() z libc si s tou pameti hospodari. Kdyz se 
nedostava, tak si libc rekne o dalsi. Jak je videt, dokaze libc pamet 
kernelu vratit, ale predpokladam, ze to nic nemeni na tom, ze proces ma 
stale k dispozici souvisly usek. Takze kdyz pomoci malloc() dostanu maly 
kousek na konci (pominu-li sofistikovanou vlastnost alokatoru pro 
pridelovani malych kousku pameti) a pak pomoci free() uvolnim 1GB 
alokovany na zacatku, tak libc stejne kernelu zadnou pamet nebude moci 
vratit, protoze na konci ji vadi ten maly kousek, ktery jako na potvoru 
odmitam uvolnit. :-)

Je to tak?

Libor





Další informace o konferenci Linux