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