linux user group brescia

immagine del castello

Archivio della mailing list

Cattiva free() e OpenOffice

Luca Giuzzi giuzzi a lugbs.linux.it
Ven 1 Ago 2003 09:45:57 UTC
On Thu, Jul 31, 2003 at 03:36:51PM +0200, Vernia Damiano wrote:
> 
> 	Ciao, due quesiti assolutamente diversi uno dall'altro:
> 1. Sapete nulla circa inefficienze della funzione free()? Il mio programma 
> continua ad aumentare di dimensioni in memoria, nonostante io deallochi 
> sempre e per benino la memoria che uso. Non sara' che malloc() (e 
> calloc()) allocano comunque nuova memoria anche se dei blocchi precedenti 
> sono stati liberati? L'unica spiegazione che ho trovato finora e' che i 

Attento al problema di "frammentazione della memoria" (vedi sotto...)
per intenderci

a=malloc(x);
b=malloc(y);
free(a);
/* z>x */
a=malloc(z);

in generale alloca una area di memoria DIVERSA (e DISGIUNTA) da quella
della prima malloc. 
Si e' parlato per un po' in LKML a proposito di un sistema di
`compattazione' della memoria, ma i problemi nell'implementazione non
sono banali [in particolare "come evitare che il sistema si blocchi
completamente durante l'operazione?"].
Resta il fatto comunque che i buffers allocati da malloc sono accessibili
[al solito] utilizzando l'algebra (lineare!) dei puntatori,
 ma non c'e' nessuna garanzia
(soprattutto in sistemi con una MMU e memoria virtuale) che tali blocchi
siano fisicamente contigui.


> blocchi che alloco (di dimensioni diverse) "interferiscono" tra loro e 
> lasciano molti buchi inutilizzati. Comunque anche cosi' riseco a stento a
> giustificare la grande quantita' di RAM usata. Credete che allocare e 
> deallocare sempre e solo blocchi delle medesime dimensioni possa 
> migliorare questo aspetto?

Mah... sicuramente dovrebbe aiutare (almeno in parte), ma se i buffers
sono tutti delle stesse dimensioni, allora ti conviene semplicemente
usare una soluzione statica [ie. allocarli una volta per tutte all'inizio
o quando ti servono per la prima volta] e lasciare perdere le free()

Per essere sicuro che la memoria sia restituita al sistema con la free,
forse la cosa che ti conviene di piu' e' forzare l'uso di mmap (anche
se questo puo' penalizzare le prestazioni nel caso di tante allocazioni
piccole) con una chiamata del tipo

mallopt(M_MMAP_THRESHOLD, 65536);

diciamo. In questo modo, tutte le malloc di piu' di 64k
sono realizzate mediante mmap e, come dice l'info-page

This has
the great advantage that these chunks are returned to the system
immediately when they are freed.  Therefore, it cannot happen that a
large chunk becomes "locked" in between smaller ones and even after
calling `free' wastes memory.  The size threshold for `mmap' to be used
can be adjusted with `mallopt'.  The use of `mmap' can also be disabled
completely. 



> 2. Il discorso si e' interrotto quasi subito, ma siccome sono riuscito a 
> convincere mio padre a passare da Office a OpenOffice mi interesserebbe 
> sapere qualche opinione in piu' sul pacchetto. Lui lo userebbe con 
> losezozz, ma se non ricordo male la ML e' sul software libero anche in 
> generale, giusto? ;-P

Si', openoffice e' libero sotto tutte le piattaforme... 

ciao, 
luca



Maggiori informazioni sulla lista Lug