2010-07-09 8 views
5

Stavo passando alcune delle decisioni prese per rendere Xara Xtreme, un'applicazione grafica SVG open source. La loro decisione sulla gestione della memoria era piuttosto intrigante per me dato che davo ingenuamente per scontato che l'allocazione dinamica su richiesta fosse il modo di scrivere un'applicazione orientata agli oggetti.In quali situazioni l'allocazione statica ha una migliore offerta rispetto all'allocazione dinamica?

La spiegazione della documentazione è

Come sulla terra può statica allocazioni essere efficace?

Se si è abituati a strutture di dati dinamici di grandi dimensioni, questo potrebbe sembrare strano . In primo luogo, tutti gli oggetti (e le dimensioni di allocazione ) sono molto più piccoli (in media) di ciascuna allocazione di area dinamica all'interno di un programma come Impression. Ciò significa che sebbene sia probabile che ci siano molti buchi nella memoria, , sono piccoli. Inoltre, abbiamo molto più oggetti allocati nella memoria, e quindi questi buchi si riempiono rapidamente. Inoltre, gestori di memoria virtuale libererà eventuali pagine di memoria che non contengono allocazioni e dare questa memoria indietro al sistema operativo in modo che possa essere riutilizzato (sia da noi o da un'altra attività).

Abbiamo beneficiare notevolmente il fatto che ogni volta che allocare memoria in questo modo, non abbiamo spostare qualsiasi memoria circa. Questo ha dimostrato un collo di bottiglia in ArtWorks che anche aveva molte allocazioni piccole che venivano usate contemporaneamente . more

In sintesi, la presenza di molti piccoli oggetti e la necessità di evitare memoria mossa sono le ragioni per la scelta allocazione statica. Non ho una chiara comprensione delle ragioni menzionate.

Anche se questo parla di allocazione statica, quello che vedo dall'aspetto superficiale del codice è che un blocco di memoria viene assegnato dinamicamente all'avvio dell'applicazione e mantenuto attivo fino alla fine dell'applicazione, simulando approssimativamente l'allocazione statica.

Puoi spiegare in quali situazioni le tariffe di allocazione statica sono migliori rispetto all'allocazione dinamica su richiesta per considerarla come la principale modalità di allocazione in applicazioni gravi?

risposta

2

È più veloce perché si evita l'overhead di chiamare una routine di sistema per gestire lo storage. malloc() mantiene un heap, quindi ogni richiesta richiede una scansione per un blocco di dimensioni appropriate, possibilmente ridimensionando il blocco, aggiornando l'elenco di blocchi per contrassegnare questo blocco come usato, ecc. Se si stanno allocando molti piccoli oggetti, questo overhead può essere eccessivo Con l'allocazione statica è possibile creare un pool di allocazioni e mantenere semplicemente una bitmap semplice per mostrare quali aree sono in uso. Ciò presuppone che ogni oggetto abbia la stessa dimensione, quindi di solito si crea un pool per tipo di oggetto.

+0

Grazie. Ora vedo che il pattern del pool di oggetti è la tecnica utilizzata in Xara Xtreme. http://en.wikipedia.org/wiki/Object_pool_pattern – rpattabi

1

In breve, non esiste davvero alcuna allocazione statica diversa dallo spazio assegnato per le funzioni stesse e altri tipi di memoria di sola lettura. (Esegui un solo "gcc -S" per l'assemblaggio e cerca tutti i blocchi di memoria, se sei interessato.) Se stai creando e rompendo oggetti, stai allocando dinamicamente. Detto questo, non c'è nulla che ti impedisca di controllare strettamente il meccanismo di allocazione stesso.

Ecco come funziona mallinfo() e mallopt() per controllare come malloc() fa la sua magia. Tuttavia, potrebbe non essere nemmeno abbastanza buono per te. Se sai che tutti i tuoi pezzi avranno le stesse dimensioni, puoi allocarli e deallocarli in modo molto più efficiente. E se sai di avere 3 dimensioni di roba, puoi tenere 3 arene di memoria ciascuna con il proprio allocatore.

Inoltre, in fase di esecuzione si ha la situazione in cui il processo non ha spazio sufficiente e deve chiedere di più al sistema operativo, che implica una chiamata di sistema che è più costosa di un semplice incremento di un indice di array. In Unix, di solito è brk() o sbrk() o simili. E questo può richiedere tempo prezioso.

Un'altra situazione, più rara, sarebbe se fosse necessario moltiplicare l'allocazione delle cose. Come 3 thread è necessario condividere le informazioni e solo quando tutti e 3 lo rilasciano vengono liberati. Questo è qualcosa di non standard e generalmente non coperto da tipici mallopt() o persino da memoria specifica pthread o blocchi mutex/semaforo bloccati.

Quindi, se si hanno problemi di ottimizzazione ad alta velocità o si sta eseguendo su un sistema integrato dove è necessario spremere tutto ciò che è possibile estrarre dalla memoria disponibile, quindi "l'allocazione statica", o almeno il controllo del meccanismo di allocazione, può essere la strada da percorrere

+0

Grazie per i dettagli. – rpattabi

Problemi correlati