Just-In-Time-Compiler (2)

Ähnliche Dokumente
Assembler - Einleitung

Assembler - Adressierungsarten

Hardware-basierte Virtualisierung

Bibliotheks-basierte Virtualisierung

Aufgabe 1 Entwicklung einer Virtuellen Maschine

Hardware-basierte Virtualisierung

FAKULTÄT FÜR INFORMATIK

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2012 / Vorlesung 9, Dienstag 18.

Haskell auf der Überholspur mit LLVM. Henning Thielemann

Assembler-Programmierung

Sicheres C Programmieren in Embedded Systemen ARM II (ARM7TMDI [1] ) Wintersemester

Übung 1 - Betriebssysteme I

Multiuser Client/Server Systeme

Betriebssystem-basierte Virtualisierung

Echtzeit-Multitasking

Cache. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2011

Projekt für Systemprogrammierung WS 06/07

Software-basierter Speicherschutz durch spezialisierte Java-VMs auf Mikrocontrollersystemen

Diplomarbeit Antrittsvortrag

Betriebssystem-basierte Virtualisierung

Grundlagen Rechnerarchitektur und Betriebssysteme

IRS in virtualisierten Umgebungen

Berner Fachhochschule Hochschule für Technik und Informatik HTI. Kapitel 1. Einstieg in Java. Dr. Elham Firouzi

4D Server v12 64-bit Version BETA VERSION

Betriebssysteme Übung 2. Tutorium System Calls & Multiprogramming

Codesigned Virtual Machines

Optimierung der Code-Generierung virtualisierender Ausführungsumgebungen zur Erzielung deterministischer Ausführungszeiten


Die Mikroprogrammebene eines Rechners

Übersicht. Nebenläufige Programmierung. Praxis und Semantik. Einleitung. Sequentielle und nebenläufige Programmierung. Warum ist. interessant?

Paravirtualisierung (2)

Übersicht. Virtueller Speicher CPU-Modi Virtuelle Maschinen. ISM SS Teil 4/ProtectionI

Kontrollstrukturen MySQL Funktionen. MySQL 4, 5. Kapitel 20a: PHP Teil 2. Marcel Noe

x86 Open Source Virtualisierungstechniken Thomas Glanzmann

Einführung in die C-Programmierung

Tutorübung 7: Mikroprogrammierung I

Wie groß ist die Page Table?

Daniel Betz Wintersemester 2011/12

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

Smartphone Entwicklung mit Android und Java

Inhaltsverzeichnis. Definition Motivation Idee Problem auf x86. QEMU KVM Quickstart Speichermedien Beispiele Monitor Ausblick.

Virtual Machines. Peter Schmid Hochschule für Technik Zürich Master of Advanced Studies, Informatik

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Einführung in Betriebssysteme

CLR CIL MCS ECMA-335. Linux.Ne t Albrecht Liebscher, Erlanger Linux Tage

Lösungsvorschlag zur 4. Übung

Paging. Einfaches Paging. Paging mit virtuellem Speicher

Busse. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2008/2009

Fragenkatalog zur Klausur Computersysteme

Virtual Machines. Peter Schmid Hochschule für Technik Zürich Master of Advanced Studies, Informatik

5 Speicherverwaltung. bs-5.1 1

Betriebssysteme Vorstellung

Moderne C-Programmierung

2. Computer (Hardware) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

Von der Platte zur Anwendung (Platte, Treiber, Dateisystem)

Proseminar Technische Informatik A survey of virtualization technologies

Compiler: Vom Code zum Maschinen-Code. C Programmierung - Vorlesung 2 Hochschule Regensburg Universitätsstraße 31, Regensburg

Grundlagen zur nebenläufigen Programmierung in Java

Messwerterfassung mit Mittelwertbildung

Intel Cluster Studio. Michael Burger FG Scientific Computing TU Darmstadt

Linux Paging, Caching und Swapping

9 Strukturierte Programmierung

Tutorium Rechnerorganisation

Betriebssysteme Teil 4: Übersetzung von C-Programmen

Entwicklung einer echtzeitfähigen CLI-Laufzeitumgebung für den Einsatz in der Automatisierungstechnik

Die Linux Kernel Virtual Machine - Wo steht der Linux Hypervisor? 2. März 2008

(a) Wie unterscheiden sich synchrone und asynchrone Unterbrechungen? (b) In welchen drei Schritten wird auf Unterbrechungen reagiert?

Integer Integer Integer (Voreinstellung) Integer Gleitkomma Gleitkomma leer/unbestimmt Integer ohne Vorzeichen Integer (explizit) mit Vorzeichen

Programmierung. Programme, Compiler, virtuelle Maschinen, Java

Was machen wir heute? Betriebssysteme Tutorium 2. Organisatorisches. Frage 2.1.a. Theorieblätter Abgabe. Antwort. Probleme mit OS/161?

2. Aufgabenblatt Musterlösung

Praxiseinheit: Realisierung einer hardwarebeschleunigten Disparitätenberechnung zur automatischen Auswertung von Stereobildern

Virtueller Speicher. SS 2012 Grundlagen der Rechnerarchitektur Speicher 44

D i g i t a l l a b o r

Aufgabe 2 - Erweiterung um PIC und Interrupts

Debuggen mit GDB (Gnu DeBugger) unter Eclipse

x86 Assembler Praktische Einführung Sebastian Lackner Michael Müller 3. Juni 2013

Kap 4. 4 Die Mikroprogrammebene eines Rechners

Dynamische Skalierbarkeit

Virtualisierung. Zinching Dang. 12. August 2015

Code-Erzeugung aus UML-Klassendiagrammen

Softwaretechnik (WS 11/12)

Ein Laufzeitsystem für hochgradig parallele Simulationen

IPv6: Fragen, Antworten & Diskussion

Virtualisierung unter GNU/Linux für Einsteiger

Java für C++ Programmierer

3. Die Programmiersprache Java

0. Einführung. C und C++ (CPP)

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures

Anbindung eines Forth- Targets an einen Forth-Host. Rechner z.b. PC steuert ein Target System z.b. Evaluation Board

Transkript:

Just-In-Time-Compiler (2) Dr.-Ing. Volkmar Sieh Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2015/2016 V. Sieh Just-In-Time-Compiler (2) (WS15/16) 1 13

Just-In-Time-Compiler (2) Hauptproblem JIT: Viele reale Assembler-Instruktionen lassen sich nur aufwändig emulieren. Z.B. berechnen fast alle Arithmetik-Befehle die Condition-Codes/Flags neu. Gebraucht werden die Condition-Codes/Flags aber i.a. nur von bedingten Sprüngen. => Idee: neu entworfene, speziell auf JIT angepasste Hardware V. Sieh Just-In-Time-Compiler (2) (WS15/16) Motivation 2 13

Just-In-Time-Compiler (2) Schwierig/aufwändig zu emulieren: Exception Interrupts Condition-Code-Flags MMU/Segmentierung berechnete Sprünge selbst-modifizierender Code V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 3 13

Just-In-Time-Compiler (2) Exceptions nahezu jede Instruktion kann Fehler produzieren Fehler unterbrechen linearen Code-Block für einen Retry muss kompletter CPU-Zustand zum Fehlerzeitpunkt bekannt sein (CC-Flags, IP, Register,... ) => Instruktionen müssen praktisch komplett und der Reihe nach emuliert werden. => Exceptions sind schwierig zu emulieren. => Fehler vermeiden (z.b. keine MMU, Typ-sichere Pointer,... ) Retry einzelner Instruktionen nicht zulassen (statt dessen z.b. try/catch-blöcke) V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 4 13

Just-In-Time-Compiler (2) Interrupts Interrupts müssen vor Ausführung jeder Instruktion abgefragt werden. Sehr aufwändig. Interrupts müssen vor Ausführung jedes Blocks abgefragt werden. In kurzen Schleifen sehr aufwändig. Idee: Interrupts weglassen nebenläufige Prozesse zulassen V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 5 13

Just-In-Time-Compiler (2) Condition-Code-Flags Auf echter Hardware werden die Condition-Code-Flags parallel zum Rechenergebnis mitberechnet (kein Zeit-Overhead). Auf emulierter Hardware nicht parallel möglich => großer Aufwand. In den meisten Fällen werden die Condition-Code-Flags jedoch von der nächsten Instruktion überschrieben. In der Praxis zu >95% nur zwischen cmp-befehl und nachfolgendem bedingten Sprung gebraucht. => JIT-freundliche Hardware berechnet Condition-Codes nur mit cmp-befehl. Alle anderen (Arithmetik-) Befehle brauchen Condition-Code-Flags nicht berechnen. V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 6 13

Just-In-Time-Compiler (2) MMU Auf realer Hardware dient MMU u.a. zum gegenseitigen Schutz verschiedener User-Prozesse. Schutz nicht notwendig, wenn nur eine Applikation läuft. Schutz auch möglich, wenn sichere Pointer verwendet werden: Typ-Prüfung der Assembler-Instruktionen notwendig; Pointer dürfen nicht berechnet werden; damit Typ-Prüfung möglich ist, muss Code bestimmten Kriterien genügen Garbage-Collection notwendig V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 7 13

Just-In-Time-Compiler (2) berechnete Sprünge movl..., %eax movl..., %eax jmp *%eax call *%eax Problem: JIT kann hier nicht weiter-compilieren. %eax kann hier 2 32 Werte annehmen. Weiter ist nichts bekannt. V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 8 13

Just-In-Time-Compiler (2) berechnete Sprünge Beim Übersetzen moderner Programmiersprachen wird jmp *%eax nur für switch-konstrukte gebraucht. Idee: %eax kann nur wenige Werte annehmen (die Adressen der case-statements). Spezielle switch -Assembler-Instruktion einführen. => mögliche Sprungziele dem JIT-Compiler bekannt => JIT-Compiler kann über die switch -Anweisung hinaus weiter-compilieren. V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 9 13

Just-In-Time-Compiler (2) berechnete Sprünge call *%eax braucht einer Compiler beim Übersetzen moderner Programmiersprachen nur für Aufrufe virtueller Methoden. Die Anzahl der virtuellen Methoden, die an einer Stelle im Code aufgerufen werden können, ist i.a. klein und zur Compile-Zeit bekannt. Idee: Virtuellen Methoden vor dem Erzeugen eines Objektes JIT-compilieren. Adresse der virtuellen Methoden beim Erzeugen eines Objektes im Objekt speichern. => JIT-Compiler kann davon ausgehen, dass bei einem Aufruf einer virtuellen Methode, diese schon compiliert wurde. => JIT-Compiler kann über die call virtual -Anweisung hinaus weiter-compilieren. V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 10 13

Just-In-Time-Compiler (2) Selbst-modifizierender Code Reale Hardware gestattet es i.a., dass Software sich selbst modifiziert. Dies führt zu Problemen: Modifikation muss detektiert werden, um generierten Code verwerfen zu können. Code-Cache muss es erlauben, Code verwerfen zu können. => JIT-freundliche Hardware verbietet, einmal compilierten Code zu invalidieren. V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 11 13

Just-In-Time-Compiler (2) Werden alle obigen Punkte berücksichtigt, kann JIT-Compiler ganze Funktionen oder ganze Applikationen am Stück übersetzen. => optimale Optimierungsmöglichkeiten für JIT-Compiler => JIT-compilierter Code läuft in der VM etwa so schnell wie der gleiche Code compiliert für den Host V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 12 13

Just-In-Time-Compiler (2) Nachteile: JIT muss Code bei jedem Programmstart neu übersetzen. JIT muss Code bei jedem Programmstart neu optimieren. Vorteile: JIT kann sich auf Code beschränken, der wirklich gebraucht wird. JIT muss nur die Code-Bereiche optimieren, die häufig durchlaufen werden. JIT kann Laufzeit-Wissen nutzen, das normaler Compiler nicht hat. JIT kann auf die aktuelle Hardware optimieren. JIT-Code kann effizienter sein als direkt für den Host compilierter Code! V. Sieh Just-In-Time-Compiler (2) (WS15/16) Just-In-Time-Compiler (2) JIT-Hardware 13 13