Domanda

Ho controllato Boehm GC. Il GC per C / C ++.

Lo so algoritmo di mark-and-sweep. Quello che sto in curiosa è come si raccoglie solo i puntatori in C intera memoria. La mia comprensione sulla memoria C è solo un array di byte pianura. E 'possibile determinare un valore in memoria è puntatore o no?

È stato utile?

Soluzione

Il Boehm GC è un collettore conservatore, il che significa che assume tutto è un puntatore. Ciò significa che è possibile trovare riferimenti falsi positivi, come un intero che ha per coincidenza il valore di un indirizzo nel mucchio. Come risultato, alcuni blocchi possono rimanere in memoria lungo di quanto farebbe con un collettore non conservativa.

Ecco una descrizione da pagina di Boehm:

Il garbage collector utilizza una modifica algoritmo di mark-sweep. concettualmente opera sostanzialmente in quattro fasi, vengono eseguite occasionalmente come parte un'allocazione di memoria:

  1. Preparazione Ogni oggetto ha un po marchio associato. Cancellare tutto mark bit, che indica che tutti gli oggetti sono potenzialmente raggiungibile.
  2. Marks fase Segna tutti gli oggetti che possono essere raggiungibile tramite catene di puntatori da variabili. spesso il collettore non ha informazioni reali sulla posizione del puntatore variabili nel mucchio, quindi vede tutto aree di dati statici, pile e registri come potenzialmente contenenti puntatori. Eventuali modelli di bit che rappresentano indirizzi interni mucchio oggetti gestiti dal collettore sono visto come puntatori. A meno che il cliente programma ha reso la layout oggetto mucchio informazioni a disposizione della collettore, ogni mucchio oggetti risultata essere raggiungibile dalle variabili sono nuovamente digitalizzata in modo simile.
  3. fase Sweep Esegue la scansione heap per inaccessibile, e di conseguenza non marcato, oggetti, e li restituisce ad un appropriarsi lista libera per il riutilizzo. Questo in realtà non è una fase separata; anche in modalità non incrementale è operazione viene normalmente eseguita su domanda durante un'allocazione che scopre una lista libera vuota. Così il fase di spazzata è molto improbabile da toccare una pagina che non sarebbe stato toccato poco dopo in ogni caso.
  4. gli oggetti non raggiungibili fase di finalizzazione che erano state registrate per finalizzazione sono accodato per finalizzazione all'esterno del collettore.

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 ei registri sono automaticamente radici. È necessario aggiungere esplicitamente puntatori globali come radici.


EDIT: Nei commenti, alcune preoccupazioni sono state sottolineato su collettori conservatori in generale. E 'vero che i numeri interi che sembrano puntatori mucchio al collettore può causare la memoria non per essere rilasciato. Questo non è così grande di un problema come si potrebbe pensare. La maggior parte dei numeri interi scalari in un programma sono utilizzati per i conteggi e dimensioni e sono abbastanza contenute (in modo da non apparire come puntatori heap). Si potrebbe per lo più incorrere in problemi con gli array contenenti immagini bitmap, stringhe, dati in virgola mobile, o qualcosa del genere. Boehm GC consente di allocare un blocco con GC_MALLOC_ATOMIC che indica al collezionista che il blocco non conterrà tutti i puntatori. Se si guarda in gc_typed.h , puoi trovare anche modi per specificare quali parti del un blocco può contenere puntatori.

Detto, una limitazione fondamentale di un collettore conservativa è che non possa spostarsi memoria intorno durante la raccolta dal puntatore riscrittura non è sicuro. Questo significa che non sarà possibile ottenere nessuno dei benefici di compattazione come frammentazione abbassata e il miglioramento delle prestazioni della cache.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top