• Keine Ergebnisse gefunden

Conservative Garbage Collection (für C)

N/A
N/A
Protected

Academic year: 2022

Aktie "Conservative Garbage Collection (für C)"

Copied!
28
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Conservative Garbage Collection (für C)

Christian Höglinger, 0256505 Sa. 14.1.2006

(2)

Überblick

Motivation

Conservative Garbage Collection

Problemstellung

Allgemeine Aufgaben

Boehm-Demers–Weiser Collector

Lösung für C

Beispiele

Probleme

Performance

(3)

3 Conservative Garbage Collection: C

Motivation 1/2

Bisher: Unterstützung durch

Compiler

Laufzeitumgebung

GC ohne solche Unterstützung?

C, C++

In weiterer Folge

Modula-3

Haskell

...

What is Modula-3? Modula-3 is a systems programming language that descends from Mesa, Modula-2, Cedar, and Modula-2+. It also resembles its cousins Object Pascal, Oberon, and Euclid.

(4)

Motivation 2/2

Motivation speziell für C

Weit verbreitet

Altmodische Speicherverwaltung

Speicherverwaltung in C

Manuell

Aufwändig

Sehr fehleranfällig für komplexere Programme

(5)

5 Conservative Garbage Collection: C

Conservative Garbage Collection 1/3

Bisher: Type accurate Collectors

GC kennt Typen

Wo finden sich Referenzen

Zusammenarbeit mit dem Compiler

Information durch Laufzeitumgebung

Zumindest:

Unterscheidung pointer – kein pointer

(6)

Conservative Garbage Collection 2/3

Conservative Collectors

Keine Information von Compiler/Umgebung

Jedes „Wort“ potentielle Referenz bis Gegenteil bewiesen

Andererseits, möglicherweise falsche Referenzen

Konservativ

Userdaten dürfen nicht geändert werden (tagging...)

Ambigous roots collection

(7)

7 Conservative Garbage Collection: C

Conservative Garbage Collection 3/3

Besonders geeignet fuer Mark & Sweep

Copying erfordert update der Referenzen

Nicht garantiert, dass Referenz ein Pointer ist!

Aufgaben

Referenzen erkennen

root set finden

Stack

Register

Globale Variablen

Mark

Sweep

(8)

Boehm-Demers-Weiser Collector 1/4

Kriterien für C Garbage Collector

GC benötigt nur Laufzeit, wenn tatsächlich verwendet

Reference Counting unmöglich

Koexistenz mit bestehenden ...

Betriebssystemen

Bibliotheken

Kooperation mit bestehenden Compilern

(9)

9 Conservative Garbage Collection: C

Boehm-Demers-Weiser Collector 2/4

Conservative GC für C/C++

Ende der 80er

Mittlerweile für viele Systeme

Anwender:

Mono

Mozilla

GCJ

Inkrementell möglich

Hier nicht berücksichtigt

(10)

Boehm-Demers-Weiser Collector 3/4

Implementiert als Bibliothek

Bei Bedarf muss gegen diese Bibliothek gelinkt werden

Kriterien erfüllt

Schnittstelle zum Collector

GC_INIT()

malloc()  GC_MALLOC()

realloc()  GC_REALLOC()

GC_MALLOC_ATOMIC()

free()  GC_FREE()

(11)

11 Conservative Garbage Collection: C

Boehm-Demers-Weiser Collector 4/4

Main Program

exit()

GC_Init()

Garbage Collector Thread

GC_malloc()

malloc()

Operating System

Reserve initial Blocks

*p

GC_malloc()

malloc()

Reserve more memory from system

*p

Collect()

(12)

Allocation

2 Heaps

können parallel verwendet werden

Benutzerprogramm

Garbage Collector selbst

andere Bibliotheken verwenden Heap wie üblich

Collected Heap

4Kb Blocks

Collected Heap Heap

4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb

4 Kb 4 Kb 4 Kb 4 Kb

4 Kb 4 Kb 4 Kb 4 Kb

4 Kb

4 Kb 4 Kb 4 Kb 4 Kb

4 Kb 4 Kb 4 Kb 4 Kb 4 Kb 4 Kb

4 Kb 4 Kb 4 Kb 4 Kb 4 Kb

(13)

13 Conservative Garbage Collection: C

Allocation - Blocks

Eine Objektgrösse pro Block

Separate free-lists für verschiedene Objektgrössen

...

...

32 Byte

256 Byte

LinkedList – Block Header

Block 4 Kb

Block 4 Kb

struct hblkhdr

(14)

Allocation – alloc()

Hole aus free-list (first fit)

Wenn nichts frei...

sweep() auf Blocks richtiger Größe

eventuell ausreichend

gc()

Voraussetzung: genug allocation

neue Blocks vom System anfordern

(15)

15 Conservative Garbage Collection: C

Finden von Referenzen

Root-set finden

Systemabhänig

Anzahl Register, welche?

Stack Layout

Pointer identifizieren

Jedes Wort – Referenz

„The key to success is the ability to determine the validity of a potential pointer accurately and cheaply“ [Jones96]

Zu konservativ

Space leaks

Pointer wird nicht als solcher erkannt

Crash

Falsches Ergebnis

(16)

Kriterien für Referenzen

pointer p:

p > GC_MIN_HEAP_ADDR

P < GC_MAX_HEAP_ADDR

Block, der Objekt von p beinhaltet allocated?

Object in entpsprechender Object-Map enthalten?

Alle Kriterien erfüllt?

Mark bit in Blockheader setzen

(17)

17 Conservative Garbage Collection: C

2-level Suchstrategie

LOG_HBLKSIZE[12]LOG_BOTTOM_SZ[10]LOG_TOP_SZ[11]p:

.........

TOP_SZ items

GC_TOP_index

...

Index[]

...

...

...

bottom_index

hb_sz hb_next hb_descr

hb_map ...

hb_marks struct hblkhdr

GC_obj_map

BOTTOM_SZ items

eine map für jede Objekt- größe

pointer p

Blockheader

Mark bits für referenzierte Objekte

(18)

gc()

gc() {

set* roots;

find_potential_roots(roots);

foreach root in roots { mark(root);

}

sweep(); // … }

mark(*p) {

obj* o = find_and_mark(p);

if (o != NULL) {

foreach word w in o { mark(w);

} } }

find_and_mark(*p) { // vorige Folie }

(19)

19 Conservative Garbage Collection: C

Space leaks

Falsche Referenzen:

Integers

Strings

Bitmaps...

GC_MALLOC_ATOMIC()

Muss nicht initialisiert werden

g a r b a

“garbage”

g e ‘0’

find_and_mark()

(20)

Blacklists

Referenzen die auf den Heap verweisen, aber Tests nicht bestehen

Blacklisted Heap-Blocks meiden

Objekte so anlegen, dass blacklisted Referenz nicht in das Objekt zeigt (interior pointers...)

Erste Collection bevor Speicher zugewiesen wurde

Falsche Referenzen aus statischen Programmteilen eliminieren (auf blacklist)

Benötigt mehr Speicher

Problem, ausreichend grossen Speicher für grosse Objekte zu finden

(21)

21 Conservative Garbage Collection: C

Pointer Alignment

0 4 8 ...

0 4 8 ...

Zusätzliches Problem, wenn Zeiger nicht ausgerichtet sein müssen.

...

0-3 4-7 8-11

3-7 2-5

1-4 0-3

adr:

adr:

x4

bei 32bit

(22)

Problem: Compileroptimierungen

Interior pointers Hoffnungslos

(23)

23 Conservative Garbage Collection: C

Leak Detection

Spezieller Modus für Boehm-Demers-Weiser Collector

Bei Aufruf von GC_MALLOC()...

Aufrufende Methode merken

Debugging Information notwendig

GC_FREE() anstatt free()

Nur Mark()

Quellen von memory leaks können erkannt werden.

In Verwendung z.B. beim Mozilla Projekt

(24)

Performance: CGC vs. Explicit MM

[Zorn 93]

6 verschiedene Programme

5 Management-Strategien

4 Explizite ~ 4 Implementierungen von malloc(), free()

1 Automatische: Boehm-Demers-Weiser Collector

(25)

25 Conservative Garbage Collection: C

Performance - CPU

(26)

Performance – Speicher

(27)

27 Conservative Garbage Collection: C

Zusammenfassung CGC

Keine Hilfe durch Compiler/Umgebung

Kern: Finden/Identifizieren von Referenzen

Strategie: Referenzen sollten/dürfen nicht geändert werden.

Probleme:

Unsichere Operationen

Optimierende Compiler

Geschwindigkeit

Teils besser als bei explizitem MM

Abhängig vom konkreten Programm

(28)

Ende...

Referenzen

ÄHNLICHE DOKUMENTE

 von Wurzelzeiger: in den letzten Waggon des letzten Zugs (nicht erster Zug), wenn voll -&gt; neuer Zug.  von einem Waggon des Zugs z: in den letzten Waggon des Zugs z, wenn

Das Reference Counting ist das älteste Verfahren und ich möchte es nur der Vollständigkeit halber kurz erwähnen, da es nur mehr in Spezialfällen verwendet wird. In Java wird nicht

 Objekte im F-reachable Queue können noch NICHT freigegeben werden, da erst ihre Finalize-Methode aufgerufen werden muß..

Wenn die Verzögerung, die durch große Objekte verursacht wird, zu kostspielig ist, können diese Objekte einfach in einen separaten Bereich im Heap gespeichert

 Ist der Heap(-Teil) aufgebraucht, findet Garbage Collection statt und das Programm wird anschliessend im anderen Teil fortgesetzt... Vertauschen der beiden Hälften

The reason why Baker’s copying collector used a read barrier was to protect the mutator from the changes to the object locations by the collector when objects are moved into

Außerdem kann eine Softwarevariante, die als Standard einen generationellen Collector verwendet leicht so angepasst werden, dass der Collector der alten Generation

G1 stops the application threads for young collections, initial and finishing marks of old collection and does the rest of the GC concurrently except for compacting the old