Laufzeitumgebungen

Download Report

Transcript Laufzeitumgebungen

Laufzeitumgebungen
Seminar - Übersetzung künstlicher Sprachen
Christoph Kassen
Agenda
Programmiersprachen und Laufzeitumgebungen
Stack
Speichermanagement
Automatische Speicherbereinigung
Virtuelle Maschinen
Fazit
2
Programmiersprachen
Variablen, Funktionen und Operatoren
.NET
C# Common Intermediate Language
.assembly
extern mscorlib {}
using System;
.assembly hello {}
.method
public
static void Main()
cil managed
namespace
ConsoleApplication1
{
{ class HelloWorld
{ .entrypoint
.maxstack
1
public static
void Main(string[] args)
ldstr
"Hallo Welt!"
{
call void[mscorlib]System.Console::WriteLine(string)
System.Console.WriteLine("Hallo Welt!");
ret
}
} }
}
Compiler übersetzt in ausführbares Programm
3
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
4
Laufzeitumgebungen
Schnittstelle
Anwendungsprogramm - Betriebssystem und Hardware
Umgebung in der Programme ausgeführt werden
5
Laufzeitumgebungen
Adressraum
Compiler
Programmcode
Statische Daten
Laufzeitumgebung
Stack
Heap
6
Agenda
Programmiersprachen und Laufzeitumgebungen
Stack
Speichermanagement
Automatische Speicherbereinigung
Virtuelle Maschinen
Fazit
7
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
8
Stack
Aktivierungsbaum
main()
Stack
int
output = 42
work
int res
print
int x = 6, y = 7
a(6,7)
int result
a
work(6,7)
print(42)
int x = 6, y = 7
int x = 6, y = 7
main
9
Stack
Hardwareunterstützung
x86: push/pop, …
.NET CLR: Managed Stack
ldelem, stelem - Arrays
ldfld, stfld – Field of Object
ldstr, ststr – Strings
…
10
Agenda
Programmiersprachen und Laufzeitumgebungen
Stack
Speichermanagement
Automatische Speicherbereinigung
Virtuelle Maschinen
Fazit
11
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
12
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
13
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
14
Strategien für Heapmanagement
First-Fit
Erster passender
Block
Next-Fit
Erster passender
Block, nach zuletzt zugewiesenem Block
15
Strategien für Heapmanagement
Best-Fit
Genau passender
Block
Best-Fit langsamer als First-Fit
Vermeidet Fragmentierung besser
16
Beispiel für Fragmentierung
Analyse des Heapspeichers von Mozilla Firefox 3
Ziel: Reduzierung des Speicherverbrauchs
Legende:
Voll belegter Block
Teilweise belegter Block
Freier Block
Auslagerbarer Block
17
Beispiel für Fragmentierung
Standard Windows Heap
18
Beispiel für Fragmentierung
jemalloc
19
Speichermanagement
Verbesserter Speichermanager (tcmalloc) für MySql
20
Agenda
Programmiersprachen und Laufzeitumgebungen
Stack
Speichermanagement
Automatische Speicherbereinigung
Virtuelle Maschinen
Fazit
21
Automatische Speicherbereinigung
Manuelle Speicherbereinigung
Fehlerbehaftet
Fragmentierung
Automatische Speicherbereinigung
Speicher von unbenutzten Objekten freigeben
Referenzen auf andere Objekte erkennbar
Anforderungen
Geschwindigkeit
Fragmentierung vermeiden
Pausenzeit minimieren
22
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
23
Mark-and-Sweep GC
Mark - Phase
Sweep
Vorbereitung
- Phase
Heap
Rootset
Obj 1
Unscanned
Obj 1
Obj 3
Obj 2
Obj 2
Obj 3
Obj 5
Obj 4
Obj 5
Obj 6
24
Free
Obj 4
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
25
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
26
Mark-and-Compact GC
Mark-Phase
Keine Sweep-Phase
Erreichbare Objekte werden kopiert
Freier Speicherbereich für neue Zuweisungen
Keine Fragmentierung
27
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
28
Beispiel .NET CLR
Managed Heap
Von der CLR verwaltet
Mehrere Segmente
Small Object Heap (SOH)
Large Object Heap (LOH) für Objekte > 85 KB
Garbage Collection
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
29
Beispiel .NET CLR
Concurrent GC
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
30
Agenda
Programmiersprachen und Laufzeitumgebungen
Stack
Speichermanagement
Automatische Speicherbereinigung
Virtuelle Maschinen
Fazit
31
Virtuelle Maschinen
Abstrahieren von der Hardware
Codeausführung durch Interpreter
Hotspots werden in Maschinencode übersetzt (JIT)
Beispiele:
Java VM
.NET CLR
TraceMonkey (JavaScript)
Smalltalk
…
32
Agenda
Programmiersprachen und Laufzeitumgebungen
Stack
Speichermanagement
Automatische Speicherbereinigung
Virtuelle Maschinen
Fazit
33
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
34
Ende
Quellen:
http://en.csharp-online.net/HelloWorld_in_MSIL
http://mysqlha.blogspot.com/2009/01/double-sysbench-throughputwith_18.html
http://channel9.msdn.com/shows/Going+Deep/Maoni-Stephens-andAndrew-Pardoe-CLR-4-Inside-Background-GC/
http://www.ecma-international.org/publications/standards/Ecma335.htm
35