Divne chovani mallocu

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Neděle Říjen 31 14:54:28 CET 1999


On 29 Oct 1999, Cejka Rudolf wrote:

> 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.

Zda se, ze prvni varianta neobsahuje cast "inicializace bloku a", kterazto
neni dale specifikovana, tudiz nelze posoudit, zda neni skutecnost, ze beh
druhe varianty je ctyrikrat delsi, naprosto prirozena. :)

Nicmene je pravda, ze kdyz se za "inicializace..." substituuje
"memset(a, 0, XXX)" a za "kopie..." zase "memcpy(b, a, XXX)", tak je v tom
rozdil docela znatelny, ovsem skutecny pomer byl pri malych objemech spis
lehce nad 2, ke ctyrem se priblizil, kdyz jsem se dostal k objemum
srovnatelnym s velikosti RAM, a divergoval k plus nekonecnu kdyz jsem
objem RAM prekrocil (mereno na 2.0.36).

To, co je ovsem pozoruhodne, je fakt, ze i davno pred tim, nez to zacne
swapovat, ma varianta cislo 2 zhruba dvakrat vic "minor pagefaults", nez
varianta 1, u ktere to vicemene odpovida objemu urcenemu hodnotou XXX.

Myslim, ze vysvetleni te anomalie je nasledujici: prvni varianta vypada
tak, ze behem kopirovani se pri cteni nove stranky z a vzdy naklonuje
predpripravena nulami vyplnena stranka (ZERO_PAGE) s copy-on-write a
pagefault se ani nezapocita, pri zapisu do b se vytvori opravdova nova
stranka, vyplni nulami a zapocita se jeden minor pagefault. V druhe
variante se zadne klonovani neprovadi, protoze vsechny vypadky dosud
"nerealizovanych" stranek se deji na zaklade zapisu. Vysledkem je, ze
varianta 2 ve skutecnosti zabere dvakrat vic objemu a ma dvakrat vetsi
rezii na vynulovani stranek.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux