Mit Virtuellen Maschinen
PD Stefan Bosse
Universität Bremen - FB Mathematik und Informatik
PD Stefan Bosse - VPP - Virtuelle Maschinen ::
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung
Virtualisierung V transformiert i.A. eine Applikationsprogrammierschnittstelle (API) in eine andere API höherer Komplexität.
V:APIi→APIo,Θ(APIo)≫Θ(APIi)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung
A Computer System Architektur mit verschiedenen Ebenen (Software, Betriebssystem, Hardware) → verschiedene Virtualisierungsebenen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung
Java Application │ │ Java VM jvm (bytecode) ∇ Linux IA32 │ │ VMWARE (x86) ∇ Windows IA32 │ │ Code Morphing (x86 ──▶ Risc) ∇ Crusoe VLIW
Drei Ebenen von VMs. Eine Java-Anwendung, die auf einer Java-VM ausgeführt wird (Linux OS), die auf einer System-VM ausgeführt wird (Windows OS), die wiederum auf einem Code Morphing Prozessor VM läuft (VLIW: Very Large Instruction Word)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Prozessvirtualisierung
Häufig werden Programme in einer eigenen Metasprache und einem speziellen Anweisungsformat ausgeführt (Bytecode, Text)
Benötigt spezielle Verabeitung der Programme (nur auf dieser VM ausführbar)
Abstraktion von Hardware und Betriebssystemebene
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Prozessvirtualisierung
A Prozessvirtualisierung (Abstraktion von Hardware und Software) → Highlevel Language VM → Parallelisierung auf VM Instanzebene (1:1 Zuordnung P:VM)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Systemvirtualisierung
Verschiedene Programme und Programmformate können konventionell ausgeführt werden
Parallele Ausführung verschiedener gekapselter Betriebssysteme
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Systemvirtualisierung
A Systemvirtualisierung (Abstraktion von Hardware) und Parallelisierung (1:1 Zuordnung einer VM Zone zu virtuellen Prozessor)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Systemvirtualisierung
A Beispiel: Zwei Betriebssysteme werden auf virtualisierter Hardware (parallel) ausgeführt
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Compiler
Klassischer Softwareentwurf mit Compiler und Linker (C)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Interpreter
Edit - Compile - Execute Zyklus bei einem Interpreter
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtuelle Maschine und Bytecode Interpreter
Bytecode kann privat und abstrakt sein (nur interne Datenstrukturen) oder öffentlich in kodierter Binär- oder Assemblerform.
Ausführung des Bytecodes durch VM. Vorteile:
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtuelle Maschine und Bytecode Interpreter
Python Vergleich Interpreter mit Bytcode Compiler-Interpreter System
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Bytecode Ausführung
Bytecode wird i.A. durch eine große Ausführungsschleife ausgeführt. Diese besteht i.A. aus einem Dekoder (Mehrfachauswahl) und operationalen Programmabschnitten. Nach jeder Instruktion kann ein Taskwechsel erfolgen (Scheduling Point) um fein granuliertes Multitasking zu ermöglichen.
while not terminated do operation = decode(code[next]) select operation.code of case OP1 => DO IT case OP2 => DO IT .. endcase compute next if scheduling point then yield endifdone
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Serialisierung
Da Bytecode unabhängig von der Hostplattform sein sollte, kann Bytecode einfach von einer Maschine zu einer anderen übertragen und ausgeführt werden
Dazu ist eine Serialisierung von Daten und Code erforderlich (Flache Liste von Bytes), mit anschließender Deserialisierung (Wiederherstellung der Daten- und Codestruktur)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Serialisierung
A Serialisierung transformiert ein Objekt in ein implementierungs- und systemunabhängiges Format (a) für die Netzwerkübertragung (Text!) (b) für die persistente Speicherung
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Serialisierung
Peter Cawley Bytecode VM
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Lua Bytecode
PD Stefan Bosse - VPP - Virtuelle Maschinen :: JIT Compiler
King Fahd University of Petroleum and Minerals Vergleich Bytecode VM Interpreter mit JIT Compiler-Interpreter Systemen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung
Aufgabe
Überlege Dir die Vor- und Nachteile von
Was sind die Bewertungskriterien?
Welche Ausführungsarchitekturen könnten für Parallele Systeme mit VMs geeignet sein?
Wo gibt es Engpässe?
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung
B Typische Datenverarbeitungsebenen in Eingebetteten Systemen und Virtualisierung
PD Stefan Bosse - VPP - Virtuelle Maschinen :: NODE.JS Architektur
Die "Eventloop" und die UV Bibliothek sind neben der Google V8 JS VM zentraler Architekturbestandteile
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Performanz von Interpretern
Dhrystone Benchmark (Kombination aus Berechnung, Objekten, Arrays, Strings, Funktionen)
VM/OS-ARCH | Linux-i686 | Linux-armv6l (PI-3B) | Linux-armv6l (PI Zero) |
---|---|---|---|
python2.71 | 105k/s | 23k/s | 4k/s |
lua 5.12 | 140k/s | 36k/s | - |
luajit 2.0.5X/lvm2 | 660k/s | 108k/s | 40k/s |
jerryscript 1.1.7X3 | 45k/s | - | - |
nodejs/V8-43 | 6300k/s | 879k/s | 40k/s |
C/gcc | 18000k/s | 3700k/s | ? |
(1: Python, 2: Lua, 3: JavaScript)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherbedarf von Interpretern
Dhrystone Benchmark (Kombination aus Berechnung, Objekten, Arrays, Strings, Funktionen)
VM/OS-ARCH | Linux-i686 | Linux-armv6l (PI-3B) | Linux-armv6l (PI Zero) |
---|---|---|---|
python2.7 | - | - | - |
lua 5.1 | - | - | - |
luajit 2.0.5X/lvm | 2MB | 2MB | - |
jerryscript 1.1.7X | 2MB | - | - |
nodejs 4/10 | 24MB | 32MB | - |
C/gcc | 1MB | ? | ? |
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Automatisches Speichermanagement
In C/C++ muss für jedes zur Laufzeit dynamisch erzeugte Datenobjekt (Array, String, Record, ..) immer explizit Speicherplatz im Hauptspeicher angefragt werden (malloc
,new
) und wieder frei gegeben werden wenn das Datenobjket nicht mehr benötigt wird (free
,delete
)
In Skriptsprachen gibt es i.A. ein automatisches Speichermanagement mit einem sog. Garbage Collector und Objektreferenzierung
Jedes Datenobjekt welches verwendet wird (z.B. in Variablen oder Funktionen) besitzt eine Referenz
Es muss eine Wurzeltabelle geben von der aus alle Referenzen auf verwendete Objekte auffindbar sind
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Objekte und Referenzen
local o1 = { a=1, b={1,2,3,4} }local o2 = { op = o1, index=2 }function show (o) print (o2.op.a-o.a } end; show(o1)
Beispiel von Objektreferenzierungen in Lua: Wo existieren Referenzen?
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Objekte und Referenzen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Objekte und Referenzen
A Verschiedene Objekte: Objekte die nicht mehr referenziert sind, werden freigegeben
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherarchitektur von Programmen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherarchitektur von Programmen
Speicherhierarchie von Programmen und Zusammenhang mit Maschinenanweisungen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherorganisation von Virtuellen Maschinen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicher
Die meisten Objekte in Programmiersprachen benötigen Speicher
Der Kontext von Speicherobjekten ist wichtig:
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicher und Variablen
Global = 1local lokal = 2function f1 () local lokal1 = 3endfunction f2 () local lokal2 = 3end
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicher und Variablen
Ein Teil des Speicher ist vorbelegt:
Ein anderer Teil des Speichers wird zur Laufzeit auf dem Stack und Heap belegt und benötigt Verwaltung:
Achtung: Bei Programmiersprachen bei denen Funktionen Werte erster Ordnung sind befindet sich auch Code im Heap oder auf dem Stack!
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Polymorphie und Dynamische Typisierung
Nativer Maschinencode unterscheidet Operanden nach ihren Datentypen → Speicherumfang von Datentypen ist sehr unterschiedlich (Boolean, Float64, Int16, Arrays, Records, ..)
HLL Skript Programmierung bietet häufig dynamische Typisierung, d.h., eine Variable hat zunächst keinen Datentyp
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Polymorphie und Dynamische Typisierung
Welche Vor-und welche Nachteile hat dynamische Typisierung zur Laufzeit?
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Polymorphie und Dynamische Typisierung
typedef struct { typedef union { int t; GCObject *gc; Value v; void *p;} TObject; lua_Number n; int b; } Value;
Lua Werte werden als "tagged unions" repräsentiert (C)
Lua Tabellen (Arrays, Records) sind Referenzlisten auf weitere Objekte aus Werten
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speichersegmente und Fragmentierung
Ein (statisches oder dynamische) Speichersegment ist ein linearer zusammenhängender Bereich
Hochsprachen haben kein Speichermodell, sondern nur Speicherobjekte (Variablen)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speichersegmente und Fragmentierung
Durch Speicherallokation und Freigabe Zyklen (Speicherbedarf der Objekte variiert) kommt es zu Fragmentierung, d.h., der einst lineare Speicherbereich eines Segments besteht aus einer irregulären Folge aus freien und belegten Bereichen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speichersegmente und Fragmentierung
Segment S alloc ┌───────┐ free ┌───────┐ compact ┌───────┐ a:=1 ──────▶│ a=1 │ │ a=1 │ │ a=1 │ b:=2 ───┐ ├───────┤ /b ├───────┤ ├───────┤ │ │ │ │ │ ┌──▶│ c=3 │ .. └──▶│ b=2 │ │ │ │ ├───────┤ ├───────┤ ├───────┤ │ │ │ c:=3 ──────▶│ c=3 │ │ c=3 │ └───┤ │ └───────┘ └───────┘ └───────┘ (a) (b) (c)
(a) Speicherbelegung, (b) Freigabe, und (c) Kompaktierung
Welches Problem tritt bei Kompaktierung auf?
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherverwaltung
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherverwaltung
Vorteile
Nachteile
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Speicherverwaltung
Vorteile
Nachteile
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Garbage Collection
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Garbage Collection
local o1 = { x=100,y=200 }e1 [e1.ref=1(o1)]local o2 = { pos=o1, color="red" }e2 [e1.ref=2(o2,o1)]function draw (o) local o3 = { pos=o.pos, color="white" }e3 [e3.ref=1(o3), e1.ref=4(o3,..)] local o4 = { pos={x=o.pos.x,y=o.pos.y}e4, color="black" } [e1.ref=5(o4,o4,..)] draw(o3) draw(o4) → [e3.ref=0, e4.ref=0, e1.ref=3, e2.ref=2]enddraw(o2) [e2.ref=2(o,o2), e1.ref=3(o,o2,o1)]o2=nil [e2.ref=0, e1.ref=1(o1)]o1=nil [e1.ref=0]
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Referenzzählung
Wenn ein Objekt (also ein Wert) erzeugt wird, wird der Referenzzähler auf Null gesetzt
Jede weitere Referenzierung erhöht den Zähler um eins (also bereits das zuweisen eines Objektes an eine variable!)
Wird eine Referenzierung vom Objekt entfernt (explizit → =null
, oder implizit durch Entfernen des referenzierenden Objektes), dann wird der Zähler um eins erniedrigt
Ist der Zähler wieder Null, dann wird der Speicher freigegeben
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Referenzzählung
Nachteile
local o1 = { x=100,y=100 }local o2 = { prev=o1 }o1.next = o2
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Referenzzählung
Vorteile
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Mark & Sweep
Bestimmte Objekte sind direkt zugänglich, und es muss herausgefunden werden welche Objekte erreichbar sind → Graphensuche
Es gibt einen Stammsatz von Speicherplätzen im Programm, dessen Objekte direkt erreichbar sind.
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Mark & Sweep
Mark-and-Sweep verläuft in zwei Phasen
Markierungsphase
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Mark & Sweep
Sweepphase
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Mark & Sweep
Vorteile
Nachteile
PD Stefan Bosse - VPP - Virtuelle Maschinen :: GC: Mark & Sweep
Beispiel eines M&S Durchlaufes mit anschließender Freigabe von nicht mehr erreichbaren == benötigten Objekten
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Multitasking
Auf einem Rechnerknoten gibt es eine Vielzahl von Aufgaben die bearbeitet werden müssen:
Zum Teil müssten Aufgaben parallel verarbeitet werden → Multitasking → Parallelisierung → nur bedingt möglich → Task Scheduling erforderlich
Es gibt verschiedene Ausführungsebenen für Tasks:
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Prozesse, Threads, Fibers
(a) (b) (c)
┌─────────┐ ┌─────────┐ ┌─────────────────────┐ ┌─────────────────────┐│ │ │ │ │ ┌───────┐ ┌───────┐ │ │ Fiber ││ Process │ │ Process │ │ │Thread ├─┤Thread │ │ │ Fiber ││ │ │ │ │ └───────┘ └───────┘ │ │ Fiber │└────┬────┘ └────┬────┘ └────┬────────────────┘ └─────┬───────────────┘ │ │ │ Process │ Process/Thread┌────┴──────────────┴────────────┴─────────────────────────┴───────────────┐│ Operating System │└──────────────────────────────────────────────────────────────────────────┘
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung und Parallelisierung
Grundkonzept: Aufteilung einer Berechnung in eine Menge von Teilberechnungen die auf verschiedenen Prozessoren parallel ausgeführt werden.
Auf generischen Mehrprozessorsystemen (Multicore) wird Multithreading unf Multiprocessing Kontrollpfade
Auf spezialisierten Mehrprozessorsystemen (GPU) wird sowohl Mutlithreading als auch Datenpfadparallelität ausgenutzt (Mehrere Kontroll- und Datenpfade)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Virtualisierung und Parallelisierung
Aber: Bei Virtuellen Maschinen lassen sich diese Konzepte nicht direkt übertragen!
Automatisches Speichermanagement ("stop the world" Phase) schwierig zur parallelisieren (Konkurrenz und Ressourcenkonflikte)
Speicherraum einer VM ist gekapselt (man spricht von einer Ausführungsinstanz oder einem isolierten Kontainer)
VM arbeiten daher i.A. mit nur einem einzigen Kontrollfluss (auf Programmierebene)!
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Architekturen Paralleler VMs
Background/Foreground Systeme
Multithreading
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Architekturen Paralleler VMs
(a) Sequenzielles System (1 Prozess/Thread) Stop-the-world GC (b) Multithreading Stop-the-world GC (c) Multithreading und paralleler/nebenläufiger GC
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Parallelisierung des GC Algorithmus
Es wird weiterhin Synchronisation zw. den parallel ausgeführten GC Threads und dem eigentlichen VM Ausführungsthread (oder mehreren) benötigt!
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Synchronisation
Neben der Synchronisierung von Operationen an Kollektordatenstrukturen kann es auch erforderlich sein, Operationen auf einzelnen Objekten zu synchronisieren.
Das Markieren ist im Prinzip eine idempotente Operation: Es spielt keine Rolle, ob ein Objekt mehr als einmal markiert wird.
Wenn z.B. ein Kollektor jedoch einen Vektor von Markierungsbits verwendet, muss der Marker diese Bits atomar setzen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Synchronisation
⇒ Also: Die Details von Rechnerarchitektur und GC Algorithmus bestimmen notwendige Synchronisation
Zum GC Algorithmus gehören auch immer die Datenstrukturen und Allokationsmethoden!
Schließlich muss die Beendigung einer Sammelphase korrekt bestimmt werden!
Barrieren können z.B. für die Synchronisation bei der konkurrierenden/parallelen Kollektion eingesetzt werden
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Parallele vs. Konkurrierend
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Parallele vs. Konkurrierend
Jones, 2012, TGCH (rot) Parallele und synchronisierte Ausführung (VM Main Loop angehalten) (blau) Konkurrierende Ausführung und überlappend mit VM Main Loop
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Parallele VM Instanzen
Parallelität daher durch mehrere VM Instanzen möglich.
Eine Instanz ↠ Ein Prozess (Thread)
Aber: Die Start- und Initialisierungszeit einer VM Instanz kann hoch sein (JS nodejs/v8: 100ms, LuaJit: 1ms)
Weiterhin ist der Speicherbedarf einer VM Instanz zu beachten ("baseline" ohne Nutzprogramm, nodejs: 20MB, LuaJit: 1MB)
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Parallele VM Instanzen
Bei hoher Initialisierungszeit einer VM Instanz muss diese im voraus gestartet werden (in-advance) und über eine Service Loop auf Prozesscode warten.
Bei kleiner Initialisierungszeit einer VM Instanz kann ein VM Prozess ad-hoc und dynamisch gestartet werden.
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Stack vs Register vs Speichermaschinen
┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐ │ Stack │ │ Code │ │ Register │ │ RAM │ ├─────────┤ ├─────────┤ ├──────────┤ ├─────────┤ │ │◀───┐ │ │ ┌─▶│ R1 │ ┌──┤ Instr │◀──┐ │ │ │ │ │ │ │ │ │ │ │ │ │ Instr ├────┤ │ Instr │◀─┼──┤ R2 │ │ │ Op ├───┤ │ │ │ │ │ │ │ │ │ ├─────────┤ │ │ Op ├────┤ │ Op ├──┘ │ R3 │ │ │ Data ├───┘ │ │ │ │ │ │ │ │ │ │ │ Op ├────┘ │ │ │ │ └─▶│ │ └─────────┘ └─────────┘ └──────────┘ └─────────┘ (a) (b) (c)
(a) Stack Maschine (keine ext. Abhängigkeit) (b) Register Maschine (c) Speichermaschine
Parallelisierungsgrad (Multi-Instanz VM): Stack ≫ Register ≫ Speicher
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Echtzeitverarbeitung
B Echtzeitspektrum: Weiche und harte Echtzeitanforderungen bei unterschiedlichen Applikationen
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Echtzeitverarbeitung
B Periodische, sporadische, und aperiodische Tasks
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Echtzeitverarbeitung
Wenn schon nicht alles Tasks gleichzeitig verarbeitet werden können, dann wenigstens die wichtigsten vorrangig ausführen
Das erfordert aber:
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Echtzeitverarbeitung
B Unterschied preemptive und nicht preemptive Ausführung von Tasks
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Echtzeitverarbeitung
Schon die Parallelisierung der Programmausführung ist schwierig und eher schwergewichtig!
Dis Ausführungszeiten von Programmen sind nicht im voraus bekannt und deterministisch
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Echtzeitverarbeitung
Echtzeitfähigkeit bei automatischen Speichermanagement ("stop the world" Phase), JIT und umfangreiche Nutzung dynamischer Datenstrukturen kaum zu gewährleisten!
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Multiinstanz VM: Beispiel (P)LVM
┌──────────────┬─────┐ ┌─────┬──────────────┐ │ VMI 1 │ GC │ Ref. │ GC │ VMI 2 │ │ X=1 │ │ Count │ │ X=1 │ │ local c=IPC ├──▶ │ ◀─────▶ │ ◀──┤ local c=IPC │ │ function foo │ │ ┌─────┐ │ │ function foo │ │ local x=X │ │ │ │ │ │ local x=X │ │ c() ◀────┬─────┬─┬─────┬─┬─────┬─▶ c() │ │ │ │ │ IPC │ │ │ │ └──────────────┴─────┘ └─────┘ └─────┴──────────────┘ alloc/free ┌───────────────────────────────────────────────────┐ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ Thread T1 │ │ Thread T2 │ │ Process P│ └──────────────────┘ └──────────────────┘ │ └───────────────────────────────────────────────────┘
Zwei Lua LVM Instanzen mit gemeinsamen eng gekoppelten Interprozeßkommunikationsobjekten und implizite GC Kopplung über Referenzzählung
PD Stefan Bosse - VPP - Virtuelle Maschinen :: Zusammenfassung
Die Parallelisierung von VMs ist stark eingeschränkt
Hauptsächlich Einschränkungen durch das autom. Speichermanagenent (GC)
Parallel ausgeführte getrennte VM Instanzen auf Prozessebene (Cluster) immer möglich (geringe Kopplung) → Interprozesskommunikation über Nachrichten optional mit generischen SM
Parallel ausgeführte VM Instanzen auf Threadebene mit gemeinsam geteilten Objekten und spezialisierten SM die teils durch GC behandelt werden ist die optimale Lösung!