2011-01-25 6 views
13

Ho controllato Boehm GC. Il GC per C/C++.Come funziona Boehm GC per il programma C?

Conosco algoritmo mark-and-sweep. Quello che mi interessa è come raccolga solo i puntatori nell'intera memoria C. La mia comprensione della memoria C è solo una semplice matrice di byte. È possibile determinare un valore in memoria è puntatore o no?

risposta

17

Il GC Boehm è un collettore conservatore, il che significa che presuppone che tutto sia un puntatore. Ciò significa che può trovare riferimenti falsi positivi, come un numero intero che ha per coincidenza il valore di un indirizzo nell'heap. Di conseguenza, alcuni blocchi potrebbero rimanere in memoria più a lungo di quanto farebbero con un raccoglitore non conservatore.

Ecco una descrizione da Boehm's page:

Il garbage collector utilizza un algoritmo modificato mark-sweep. Concettualmente opera sostanzialmente in quattro fasi, che eseguite occasionalmente come parte di un'allocazione di memoria:

  1. Preparazione Ogni oggetto ha un bit di segno associato. Cancella tutti i contrassegni bit, indicando che tutti gli oggetti sono potenzialmente irraggiungibili.
  2. Segna fase Contrassegna tutti gli oggetti che possono essere raggiunti tramite catene di puntatori da variabili . Spesso il collettore non ha informazioni reali sulla posizione di puntatore variabili nel mucchio, quindi visualizza tutti aree statiche dati, pile e registri come potenzialmente contenenti puntatori. Qualsiasi schema di bit che rappresenta gli indirizzi all'interno dell'heap oggetti gestiti dal raccoglitore sono visualizzati come puntatori. A meno che il programma client non abbia reso disponibili le informazioni sul layout heap oggetto al programma di raccolta , gli oggetti heap individuati su sono raggiungibili dalle variabili nuovamente con lo scanner analogo.
  3. Fase di scansione Esegue la scansione dell'heap per oggetti inaccessibili, e quindi non contrassegnati, e li restituisce a un elenco gratuito appropriato di per il riutilizzo. Questo non è in realtà una fase separata; anche in modalità non incrementale questa operazione è di solito viene eseguita su richiesta durante un'assegnazione che trova una lista libera vuota. Pertanto è improbabile che la fase di swap tocchi una pagina che non sarebbe stata toccata poco dopo.
  4. Fase di finalizzazione Gli oggetti non raggiungibili che sono stati registrati per la finalizzazione sono accodati per la finalizzazione all'esterno del collector.

si dovrebbe anche sapere che il Boehm GC deve essere data una serie di "radici", che sono punti di partenza per l'algoritmo mark-and-sweep. Lo stack e i registri sono automaticamente root. È necessario aggiungere esplicitamente i puntatori globali come radici.


MODIFICA: nei commenti, sono state segnalate alcune preoccupazioni sui collezionisti conservatori in generale.È vero che i numeri interi che assomigliano a puntatori di heap al raccoglitore possono causare il mancato rilascio della memoria. Questo non è un grosso problema come si potrebbe pensare. La maggior parte degli interi scalari in un programma sono usati per conteggi e dimensioni e sono piuttosto piccoli (quindi non apparirebbero come puntatori di heap). Per lo più si incontrano problemi con array contenenti bitmap, stringhe, dati in virgola mobile o qualcosa del genere. Boehm GC consente di allocare un blocco con GC_MALLOC_ATOMIC che indica al raccoglitore che il blocco non conterrà alcun puntatore. Se si guarda in gc_typed.h, si troveranno anche modi per specificare quali parti di un blocco possono contenere puntatori.

Detto questo, un limite fondamentale di un collezionista conservatore è che non può spostare in modo sicuro la memoria durante la raccolta poiché la riscrittura del puntatore non è sicura. Ciò significa che non otterrai nessuno dei vantaggi della compattazione, come la frammentazione ridotta e il miglioramento delle prestazioni della cache.

+1

lol, se questo è vero, questo algoritmo è spazzatura semplice xD – codymanix

+6

Probabilmente è buono come si può ottenere senza l'aiuto del compilatore (dicendoti dove sono i puntatori). –

+0

+1. Risposta molto chiara –