350 likes | 445 Views
Laufzeitumgebungen. Agenda. Programmiersprachen und Laufzeitumgebungen Stack Speichermanagement Automatische Speicherbereinigung Virtuelle Maschinen Fazit. Programmiersprachen. Variablen , Funktionen und Operatoren. .NET Common Intermediate Language .assembly extern mscorlib {}
E N D
Agenda • Programmiersprachen und Laufzeitumgebungen • Stack • Speichermanagement • Automatische Speicherbereinigung • Virtuelle Maschinen • Fazit
Programmiersprachen • Variablen, Funktionen und Operatoren .NET Common Intermediate Language .assemblyexternmscorlib{} .assembly hello {} .methodpublicstaticvoidMain() cilmanaged { .entrypoint .maxstack1 ldstr"Hallo Welt!" callvoid[mscorlib]System.Console::WriteLine(string) ret } • C# • using System; • namespaceConsoleApplication1 { • classHelloWorld • { • publicstaticvoidMain(string[] args) • { • System.Console.WriteLine("Hallo Welt!"); • } • } • } • Compiler übersetzt in ausführbaresProgramm
Programmiersprachen • Erstelltes Programm benötigt spezielle Routinen • Kommunikation mit dem Betriebssystem • Speicheranforderungen • E/A - Operationen • Abwicklung von Funktionsaufrufen • Bibliothek für diese Routinen: Laufzeitumgebung • Eng verknüpft mit dem Compiler • Funktionsumfang variiert
Laufzeitumgebungen • Schnittstelle • Anwendungsprogramm -Betriebssystem und Hardware • Umgebung in der Programme ausgeführt werden
Laufzeitumgebungen • Adressraum • Compiler • Programmcode • Statische Daten • Laufzeitumgebung • Stack • Heap
Agenda • Programmiersprachen und Laufzeitumgebungen • Stack • Speichermanagement • Automatische Speicherbereinigung • Virtuelle Maschinen • Fazit
Stack • Wird zur Funktionsausführung verwendet • Funktionsaufrufe zeitlich verschachtelt • Aktivierungsbaum • Aktivierungseintrag • Lokale Variablen • Prozessorstatus vor Funktionsaufruf • Rücksprungadresse • Rückgabewert • Übergebene Parameter • Funktionsaufruf legt Eintrag auf dem Stack ab • Funktionsende entfernt Eintrag vom Stack
Stack Aktivierungsbaum Stack main() int x = 6, y = 7 main a intresult a(6,7) int x = 6, y = 7 work(6,7) print(42) work intres int x = 6, y = 7 print intoutput = 42
Stack • Hardwareunterstützung • x86: push/pop, … • .NET CLR: Managed Stack • ldelem, stelem - Arrays • ldfld, stfld – Field ofObject • ldstr, ststr – Strings • …
Agenda • Programmiersprachen und Laufzeitumgebungen • Stack • Speichermanagement • Automatische Speicherbereinigung • Virtuelle Maschinen • Fazit
Speichermanagement • Heap • Dynamischer Speicher • Langlebige Daten • In .NET: für alle Referenztypen • Speichermanager • Verwaltet den Heap-Speicher • C: „malloc()“, „free()“ • C++: „new“, „delete“ • C#: „new“ • Reihenfolge von Zuweisung und Freigabe beliebig • Speicheranfragen an das Betriebssystem
Speichermanagement • Anforderungen an Speichermanager • Speichereffizienz • Wenig Speicher verwenden • Fragmentierung vermeiden • Programmeffizienz • Daten im Speicher sinnvoll anordnen • Lokalität • Arbeit mit relativ kleiner Befehls- oder Datenmenge • Zeitliche / Örtliche Lokalität • Geringer Overhead • Speicheranforderung und -Freigabe muss schnell sein CPU L1 L2 RAM
Speicherfragmentierung • Fragmentierung • Freie Blöcke auf dem Heap • Löcher • Entsteht durch Speicheranforderungen und –freigaben • Fragmentierung vermeiden • Speicherverbrauch steigt an • Neue Anforderungen können evtl. nicht mehr erfüllt werden • Lokalität leidet
Strategien für Heapmanagement • First-Fit • Erster passender Block • Next-Fit • Erster passender Block, nach zuletzt zu-gewiesenem Block
Strategien für Heapmanagement • Best-Fit • Genau passender Block • Best-Fit langsamer als First-Fit • Vermeidet Fragmentierung besser
Beispiel für Fragmentierung • Analyse des Heapspeichers von MozillaFirefox 3 • Ziel: Reduzierung des Speicherverbrauchs • Legende: • Voll belegter Block • Teilweise belegter Block • Freier Block • Auslagerbarer Block
Beispiel für Fragmentierung Standard Windows Heap
Beispiel für Fragmentierung jemalloc
Speichermanagement • Verbesserter Speichermanager (tcmalloc) für MySql
Agenda • Programmiersprachen und Laufzeitumgebungen • Stack • Speichermanagement • Automatische Speicherbereinigung • Virtuelle Maschinen • Fazit
Automatische Speicherbereinigung • Manuelle Speicherbereinigung • Fehlerbehaftet • Fragmentierung • Automatische Speicherbereinigung • Speicher von unbenutzten Objekten freigeben • Referenzen auf andere Objekte erkennbar • Anforderungen • Geschwindigkeit • Fragmentierung vermeiden • Pausenzeit minimieren
Mark-and-Sweep GC • Einfacher GC Algorithmus • Rootset: Alle aktiven Objekte • Stack, Register, statische Felder • Unscanned: Liste mit referenzierten Objekten • Free: Liste aller Gargabe Objekte • 2 – Phasen • Mark • Sweep
Mark-and-Sweep GC Sweep - Phase Mark - Phase Vorbereitung Heap Unscanned Rootset Obj 1 Obj 1 Obj 3 Obj 2 Obj 2 Obj 5 Obj 3 Obj 4 Free Obj 4 Obj 5 Obj 6 Obj 6
Mark-and-Sweep GC • Vorbereitung: • Für Rootset-Objekte Reached-Bit = 1 • Rootset-Objekte in Unscanned einfügen • Mark: Iteration über Unscanned Liste • Objekt o wird untersucht und aus der Liste entfernt • Existiert Referenz auf Objekt o‘, so wird dies auch untersucht • Sweep: Iteration über den Heap • Objekte mit Reached-Bit == 0 in Freiliste einfügen • Speicherbereiche der Freiliste werden wiederverwendet
Mark-and-Sweep GC • Algorithmus muss den kompletten Heap durchsuchen • Langsam • Gefahr des Thrashing • Verbesserter Algorithmus • Unreached: Zusätzliche Liste aller zugewiesenen Objekte • Mark-Phase aktualisiert Unreached-Liste • Garbage Objekte verbleiben in Unreached • Unerreichbare Objekte werden in die Freiliste eingefügt • Kein durchsuchen des Heap nötig
Mark-and-Compact GC • Mark-Phase • Keine Sweep-Phase • Erreichbare Objekte werden kopiert • Freier Speicherbereich für neue Zuweisungen • Keine Fragmentierung
Spezielle GC Algorithmen • GC nach Generationen • Reduzierung der Pausenzeit für den GC-Lauf • Objekte haben üblicherweise eine kurze Lebenszeit • Generation 0: Junge Objekte, wird häufig bereinigt • Generation n: Alte Objekte, selten bereinigt • Speicherbereinigung läuft immer für Generation und alle niedrigeren • Parallele GC • Idee: GC läuft in Threads parallel zu den Anwendungsthreads • Ideal für Serveranwendungen auf Multi-Prozessorsystemen
Beispiel .NET CLR • Managed Heap • Von der CLR verwaltet • Mehrere Segmente • Small Object Heap (SOH) • Large Object Heap (LOH) für Objekte > 85 KB • GarbageCollection • Nach Generationen mit 3 Generationen • Mark-and-Compact für SOH • Mark-and-Sweep für LOH • Verzicht auf Compact für große Objekte
Beispiel .NET CLR • ConcurrentGC • Parallel zu Anwendungsthreads • Zwei Pausenphasen, keine Allokationen möglich • Nur für Gen. 2 GC • Seit .NET CLR 1.0 • Background GC • Ab .NET CLR 4 • Nur für Gen. 2 GC • Allokationen durchgehend möglich • Pausiert für Gen. 0,1 GC (Foreground GC) • Verkürzte Pausenphasen
Agenda • Programmiersprachen und Laufzeitumgebungen • Stack • Speichermanagement • Automatische Speicherbereinigung • Virtuelle Maschinen • Fazit
Virtuelle Maschinen • Abstrahieren von der Hardware • Codeausführung durch Interpreter • Hotspots werden in Maschinencode übersetzt (JIT) • Beispiele: • Java VM • .NET CLR • TraceMonkey (JavaScript) • Smalltalk • …
Agenda • Programmiersprachen und Laufzeitumgebungen • Stack • Speichermanagement • Automatische Speicherbereinigung • Virtuelle Maschinen • Fazit
Fazit • Laufzeitumgebung • Verwendet bei Programmausführung • Schicht zwischen Anwendung und Hardware und OS • Spezielle Form: Virtuelle Maschinen • Stack • Steuerung der Funktionsausführung • Heap • Dynamischer Speicher • Verwaltet vom Speichermanager • Automatische Speicherbereinigung • Unreferenzierte Objekte vom Heap entfernen
Ende • Quellen: • http://en.csharp-online.net/HelloWorld_in_MSIL • http://mysqlha.blogspot.com/2009/01/double-sysbench-throughput-with_18.html • http://channel9.msdn.com/shows/Going+Deep/Maoni-Stephens-and-Andrew-Pardoe-CLR-4-Inside-Background-GC/ • http://www.ecma-international.org/publications/standards/Ecma-335.htm