Divne chovani mallocu

Martin Macok macok na kocour.ms.mff.cuni.cz
Pátek Říjen 29 18:24:02 CEST 1999


On Fri, 29 Oct 1999, Martin Macok wrote:

> On 29 Oct 1999, Cejka Rudolf wrote:
> 
> > Jeste maly dodatek: Nejspis jsme si trochu nerozumeli v pojmu
> > "namapovani". Ja jsem mel na mysli zarazeni pametove stranky
> > do adresoveho prostoru procesu a pripravu pro jeji pripadne
> > odswapovani (i v pripade modelu cela pamet = RAM + Swap ... on se
> > uz stejne jiny nepouziva)). Fyzicke pripojeni konkretni stranky
> > uz jsem povazoval za neco jineho.
> 
> Pravda, trochu jsme psali kazdy o necem jinem. Parkrat jsem pouzil
> nespravne termin "namapovani" ... 
> 
> Pri alokaci tabulka stranek adresoveho prostoru procesu vyplni s
> prislusnymi flagy (stranky byla alokovany, ale zatim nebyly pouzity,
> obsahuji nedefinovane hodnoty - proste se jenom vyplni tabulka, nic vic)
> ...  (koumnul jsem do src (2.2.13) a vykoukal jsem to tak - nejsem kernel
> guru a je mozne, ze se v necem pletu) - Asi by bylo vhodne, aby do teto
> debaty vnesl svetlo nekdo kompetentnejsi ...
> 
> Co myslite konkretne pripravou na odswapovani? 
> 
> Jestli tomu dobre rozumim (nerad bych vam neco podsouval), tak vam vadi
> tyto 3 veci:
> 
> 1) ze se ty stranky rovnou nejsou asociovane s realnou fyzickou adresou?
> Ze takto malloc-ovane stranky na zacatku proste nikde ve fyzicke pameti
> neexistuji?
> 
> 2) pri alokaci se nekontroluje velikost volne pameti proti velikosti RAM +
> SWAPu, ale pouze oproti free_mem_end_ptr (0x90000 na i386)?
> 
> 3) jakym zpusobem pracuje s takto alokovanou neinicializovanou pameti?
> (viz priklady nize)
> 
> > Pro zajimavost si zkuste treba toto:
> > 
> > a = malloc(XXX);
> > b = malloc(XXX);
> > kopie dat z a do b
> > 
> > proti
> > 
> > a = malloc(XXX);
> > inicializace bloku a
> > b = malloc(XXX);
> > kopie dat z a do b
> > 
> > V prvnim pripade byla (2.0.35) kopie bloku dat na mem starem pocitaci
> > v Linuxu 4x rychlejsi nez druhy pripad. Fyzicke moznosti rychlosti
> > kopie pameti pritom presne odpovidaly pouze druhemu pripadu.
> 
> Domnivam se, ze v tom prvnim pripade Linux vi
> (?vm_area_struct.vm_flags?), ze zachazi s takto alokovanou pameti (s
> nedefinovanym obsahem) a "nejak to proste osuli" - fyzicky neprovadi zadny
> presun dat ...
> 
> Pokud se mylim a mystifikuju, tak se hluboce omlouvam a prosim, aby me
> nekdo opravil.

Odpovim si sam ;-)

ad (2) (za behu systemu) Da se nastavit (myslim, ze az v jadrech >=2.1.x),
zda kernel ma kontrolovat velikost alokovane pameti (oproti velikosti RAM
+ SWAP), nebo se ma porad tvarit, ze je pameti dostatek. Viz:  

/usr/src/linux/Documentation/sysctl/vm.txt
/proc/sys/vm/overcommit_memory
/usr/src/linux/mm/mmap.c : int vm_enough_memory(long pages)

(Myslim, ze 2.0.x je volani malloc vzdycky uspesne)

Snad jsem to jeste vice nezatemnil ... Kazdopadne na 2.2.13 s nepovolenym
/proc/sys/vm/overcommit_memory (0) mi to dovoli jednorazove malloc()-ovat
pouze tolik pameti, kolik zvladne moje RAM + SWAP ...
Na druhou stranu mi ale dovoli alokovat spoustu mensich useku (ktere
nepouzivam), takze to zase neresi vsechno ...

-- 
< Martin Mačok    (e) martin.macok na underground.cz  <ISO-8859-2-compatible> 
 \ (h) http://kocour.ms.mff.cuni.cz/~macok/  (w) http://underground.cz/ /
   \\\\\            any OS that doesn't make me look              /////
     \\\  like a random mouse-clicking idiot is a Good Thing (c)  ///



Další informace o konferenci Linux