Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 4 » Verlauf (Übersicht)
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
pruefungen:hauptstudium:ls4:vm-2018-03-22-2 [22.03.2018 12:13] – ku91pigy | pruefungen:hauptstudium:ls4:vm-2018-03-22-2 [22.03.2018 15:52] (aktuell) – ku91pigy | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | **Prüfer: | ||
+ | **Beisitzer: | ||
+ | **ECTS:** 7,5 | ||
+ | |||
+ | Die Atmosphäre war entspannt und locker. Die Reaktionen auf die Erklärungen waren schwer deutbar. Ich hatte oft den Eindruck, die Antwort wäre nicht ganz richtig gewesen. Allerdings wurde ich anschließend nicht korrigiert und auch am Ende für keine Antwort kritisiert. Trotz ein paar Hängern bei unerwarteten Fragen, gab es noch eine 1,0. | ||
+ | |||
+ | ====== Verlauf ====== | ||
**P: Was gibt es für verschiedene Virtualisierungsarten und wie verwendet man sie?**\\ | **P: Was gibt es für verschiedene Virtualisierungsarten und wie verwendet man sie?**\\ | ||
S: | S: | ||
Zeile 8: | Zeile 15: | ||
* Biblitheksbasiert: | * Biblitheksbasiert: | ||
- | **P: Wie funktioniert OS-basierte Virtualisierung? | + | **P: Wie funktioniert OS-basierte Virtualisierung? |
S: Man verändert die Verwaltungsbefehle für Prozesse und User. Die Instanznummer wird als Präfix davor geschrieben. | S: Man verändert die Verwaltungsbefehle für Prozesse und User. Die Instanznummer wird als Präfix davor geschrieben. | ||
- | **P: Was macht man neben den Prozessen noch, was muss man schützen?\\** | + | **P: Was macht man neben den Prozessen noch, was muss man schützen? |
S: Man schützt auch noch die Dateien, in dem man für jede Instanz Kopien der Dateien erstellt, die sie verändert. | S: Man schützt auch noch die Dateien, in dem man für jede Instanz Kopien der Dateien erstellt, die sie verändert. | ||
- | **P: Wie ist das bei fork()?\\** | + | **P: Wie ist das bei fork()?**\\ |
S: Eine Instanz darf nicht zu viele Prozesse starten, das muss in fork überwacht werden.\\ | S: Eine Instanz darf nicht zu viele Prozesse starten, das muss in fork überwacht werden.\\ | ||
Das gleiche muss beim RAM und Festplatte passieren. Zuerst kann man den anderen Instanzen ungenutzten Speicher wegnehmen, aber irgendwann muss Schluss sein. | Das gleiche muss beim RAM und Festplatte passieren. Zuerst kann man den anderen Instanzen ungenutzten Speicher wegnehmen, aber irgendwann muss Schluss sein. | ||
- | **P: In der Übung haben wir einen Interpreter programmiert, | + | **P: In der Übung haben wir einen Interpreter programmiert, |
S: Weil er 100-1000 mal langsamer ist als das Originalsystem.\\ | S: Weil er 100-1000 mal langsamer ist als das Originalsystem.\\ | ||
- | **P: Warum ist der so viel langsamer? Wenn ein Add emuliert werden soll, gibt es bei x86 doch einen entsprechenden Befehl. Warum nimmt man den nicht einfach?\\** | + | **P: Warum ist der so viel langsamer? Wenn ein Add emuliert werden soll, gibt es bei x86 doch einen entsprechenden Befehl. Warum nimmt man den nicht einfach?**\\ |
S: Die Register vom Host passen normalerweise nicht zu denen von Gast.\\ | S: Die Register vom Host passen normalerweise nicht zu denen von Gast.\\ | ||
Zuerst müssen die Operanden in Register vom Gast geladen werden.\\ | Zuerst müssen die Operanden in Register vom Gast geladen werden.\\ | ||
Zeile 28: | Zeile 35: | ||
Dann muss das Ergebnis wieder in Gast Register oder Speicher geschrieben werden. Hier sind auch wieder Checks nötig. | Dann muss das Ergebnis wieder in Gast Register oder Speicher geschrieben werden. Hier sind auch wieder Checks nötig. | ||
- | **P: Was gibt es denn alles für Checks bei Speicherzugriff\\** | + | **P: Was gibt es denn alles für Checks bei Speicherzugriff**\\ |
S: Zuerst die Segmentierung. Es wird überprüft, | S: Zuerst die Segmentierung. Es wird überprüft, | ||
Außerdem werden Lese/ | Außerdem werden Lese/ | ||
Zeile 35: | Zeile 42: | ||
Dann müssen die Lese/ | Dann müssen die Lese/ | ||
- | **P: Wie kann man das im Emulator beschleunigen? | + | **P: Wie kann man das im Emulator beschleunigen? |
S: Man baut sich selber einen TLB. Dann kann man direkt den Host pointer für eine gast Page laden.\\ | S: Man baut sich selber einen TLB. Dann kann man direkt den Host pointer für eine gast Page laden.\\ | ||
Außerdem kann man mit dem TLB auch Alignment und Rechte überprüfen.\\ | Außerdem kann man mit dem TLB auch Alignment und Rechte überprüfen.\\ | ||
Zeile 50: | Zeile 57: | ||
In dem Fall stehen die Kernelpages sowieso nicht in diesem TLB, weil sie noch nie im User-Mode ausgeführt wurden. | In dem Fall stehen die Kernelpages sowieso nicht in diesem TLB, weil sie noch nie im User-Mode ausgeführt wurden. | ||
- | **P: Was kann man neben dem Speicher TLB noch machen?\\** | + | **P: Was kann man neben dem Speicher TLB noch machen?**\\ |
S: Man kann auch Alignment und Debug Checks mit dem JIT in die Code Blöcke kompilieren. | S: Man kann auch Alignment und Debug Checks mit dem JIT in die Code Blöcke kompilieren. | ||
- | **P: Ich meine eher I/O Geräte.\\** | + | **P: Ich meine eher I/O Geräte.**\\ |
S: Dann speichert man statt Pointern Callbacks im TLB. | S: Dann speichert man statt Pointern Callbacks im TLB. | ||
- | **P: Was machen die Callbacks genau?\\** | + | **P: Was machen die Callbacks genau?**\\ |
S: Wenn man z.B. in einen Port schreibt, um ein Pixel anzuzeigen, wird der entsprechende Callback aufgerufen. Der emuliert das Geräteverhalten und aktualisiert den Zustand. | S: Wenn man z.B. in einen Port schreibt, um ein Pixel anzuzeigen, wird der entsprechende Callback aufgerufen. Der emuliert das Geräteverhalten und aktualisiert den Zustand. | ||
- | **P: Und woher kommen die Callbacks?\\** | + | **P: Und woher kommen die Callbacks? |
S: Die werden beim Start des Systems registriert. Dann weiß man welche Geräte tatsächlich angeschlossen sind.\\ | S: Die werden beim Start des Systems registriert. Dann weiß man welche Geräte tatsächlich angeschlossen sind.\\ | ||
Man hat für jeden Komponenten ein Objekt, das registriert seine Callbacks am Bus. | Man hat für jeden Komponenten ein Objekt, das registriert seine Callbacks am Bus. | ||
- | P: Aber wenn sich jetzt ein Gerät am ISA-Bus registriert, | + | **P: Aber wenn sich jetzt ein Gerät am ISA-Bus registriert, |
S: Was? | S: Was? | ||
- | **P: *malt Bus-Hierarchie mit CPU-Bus, PCI-Bus etc. auf*\\** | + | **P: //malt Bus-Hierarchie mit CPU-Bus, PCI-Bus etc. auf//**\\ |
S: Der CPU gibt dem Bus den Port, der CPU-Bus schaut, zu welchem Unterbus/ | S: Der CPU gibt dem Bus den Port, der CPU-Bus schaut, zu welchem Unterbus/ | ||
Dann gibt der Unterbus das passende Callback an den CPU-Bus, der gibt es an den CPU und der führt es aus. | Dann gibt der Unterbus das passende Callback an den CPU-Bus, der gibt es an den CPU und der führt es aus. | ||
- | **P: Geht das noch besser?\\** | + | **P: Geht das noch besser?**\\ |
- | S: Man könnte das Endgerät-Callback im CPU Bus cachen. (nicht sicher, ob das die gewollte | + | S: Man könnte das Endgerät-Callback im CPU Bus cachen. |
- | **P: Intern hat ein Komponent ja auch Busse.\\** | + | **P: Intern hat ein Komponent ja auch Busse.**\\ |
S: Ja, allerdings sind die fest und es ist zur Compilezeit schon bekannt was wo angeschlossen ist.\\ | S: Ja, allerdings sind die fest und es ist zur Compilezeit schon bekannt was wo angeschlossen ist.\\ | ||
Deswegen braucht man keine Callbacks und kann Funktionen direkt aufrufen. Im Idealfall werden sie dann ge-inlined, sodass keine Calls mehr nötig sind. | Deswegen braucht man keine Callbacks und kann Funktionen direkt aufrufen. Im Idealfall werden sie dann ge-inlined, sodass keine Calls mehr nötig sind. | ||
- | **P: Wie funktioniert denn die JVM?\\** | + | **P: Wie funktioniert denn die JVM?**\\ |
S: Die JVM im speziellen oder eine JIT-optimierte Sprache? | S: Die JVM im speziellen oder eine JIT-optimierte Sprache? | ||
- | **P: JIT-optimierte Sprache am Beispiel der JVM.\\** | + | **P: JIT-optimierte Sprache am Beispiel der JVM.**\\ |
S: Die Anwendung arbeitet nur auf dem Stack und es werden sichere Pointer verwendet.\\ | S: Die Anwendung arbeitet nur auf dem Stack und es werden sichere Pointer verwendet.\\ | ||
Sie bekommt nur Pointer von der JVM und kann sie nicht verändern.\\ | Sie bekommt nur Pointer von der JVM und kann sie nicht verändern.\\ | ||
Zeile 91: | Zeile 98: | ||
Man kann man z.B. einen Counter in einen Block kompilieren. Wenn man merkt, dass der Block häufig ausgeführt wird, kann man ihn noch einmal kompilieren und besser optimieren. | Man kann man z.B. einen Counter in einen Block kompilieren. Wenn man merkt, dass der Block häufig ausgeführt wird, kann man ihn noch einmal kompilieren und besser optimieren. | ||
- | **P: Wie genau funktionieren die sicheren Pointer?\\** | + | **P: Wie genau funktionieren die sicheren Pointer?**\\ |
S: Das bedeutet, es gibt keine Pointerarithmetik, | S: Das bedeutet, es gibt keine Pointerarithmetik, | ||
Die Anwendung bekommt einen korrekten Pointer von der VM und weil sie daran nichts ändern kann, müssen keine Überprüfungen durchgeführt werden.\\ | Die Anwendung bekommt einen korrekten Pointer von der VM und weil sie daran nichts ändern kann, müssen keine Überprüfungen durchgeführt werden.\\ | ||
Weil die Pointer typisiert sind, ist auch die Größe bekannt und man braucht auch keine Bounds- und Alignment-Checks mehr. | Weil die Pointer typisiert sind, ist auch die Größe bekannt und man braucht auch keine Bounds- und Alignment-Checks mehr. | ||
- | **P: Wie funktionieren Exceptions in der JVM?\\** | + | **P: Wie funktionieren Exceptions in der JVM?**\\ |
S: Es gibt try/catch Blöcke. Tritte eine Exception auf, wird sofort in den catch-Block gesprungen. Man muss also keine Instruktion wiederholen oder Zustand wiederherstellen.\\ | S: Es gibt try/catch Blöcke. Tritte eine Exception auf, wird sofort in den catch-Block gesprungen. Man muss also keine Instruktion wiederholen oder Zustand wiederherstellen.\\ | ||
Es reicht, wenn man zum Verabreitungs-Abschnitt im Block springt und dann PC, Flags etc. setzt. Das ist dann nicht wesentlich aufwendiger als ein normales return. | Es reicht, wenn man zum Verabreitungs-Abschnitt im Block springt und dann PC, Flags etc. setzt. Das ist dann nicht wesentlich aufwendiger als ein normales return. | ||
- | **P: Wie werden die switch-Befehle dann ohne berechneter Sprünge übersetzt?\\** | + | **P: Wie werden die switch-Befehle dann ohne berechneter Sprünge übersetzt? |
S: Man kann keine Table-Switch verwenden. Stattdessen kann man eine if-Kaskade oder binäre Suche verwenden. | S: Man kann keine Table-Switch verwenden. Stattdessen kann man eine if-Kaskade oder binäre Suche verwenden. | ||
- | **P: Ein " | + | **P: Ein " |
S: Ja, allerdings kennt man das Sprungziel ahead-of-time. Dadurch kennt man trotzdem noch alle Pfade durch den Code, die genommen werden können. | S: Ja, allerdings kennt man das Sprungziel ahead-of-time. Dadurch kennt man trotzdem noch alle Pfade durch den Code, die genommen werden können. | ||
- | **P: Was wird jetzt noch zur Laufzeit gemacht?\\** | + | **P: Was wird jetzt noch zur Laufzeit gemacht?**\\ |
S: Bei Java gibt es den Bytecode Checker. Der durchläuft das Programm auf allen möglichen Wegen.\\ | S: Bei Java gibt es den Bytecode Checker. Der durchläuft das Programm auf allen möglichen Wegen.\\ | ||
Es gibt zu jeder Intruktion Vor- und Nachbedingungen. Vor einer Addition müssen z.B. zwei Integer auf dem Stack liegen und danach liegt ein Integer auf dem Stack.\\ | Es gibt zu jeder Intruktion Vor- und Nachbedingungen. Vor einer Addition müssen z.B. zwei Integer auf dem Stack liegen und danach liegt ein Integer auf dem Stack.\\ | ||
Zeile 112: | Zeile 119: | ||
Während der Ausführung muss man nur noch Array Bounds und Downcasts überprüfen. Null-Pointer exceptions werden über Segmentation-Faults des Host-Systems erzeugt. | Während der Ausführung muss man nur noch Array Bounds und Downcasts überprüfen. Null-Pointer exceptions werden über Segmentation-Faults des Host-Systems erzeugt. | ||
- | **P: Was kann man den bei einem return noch optimieren?\\** | + | **P: Was kann man den bei einem return noch optimieren? |
S: Wenn man bei einem Sprung weiß, wo er hinführen wird, kann man direkt den nächsten Block anspringen, solange er schon kompiliert ist.\\ | S: Wenn man bei einem Sprung weiß, wo er hinführen wird, kann man direkt den nächsten Block anspringen, solange er schon kompiliert ist.\\ | ||
- | (nicht sicher, ob das die gewollte Antwort war) | + | //(nicht sicher, ob das die gewollte Antwort war)// |
- | **P: Was passiert bei loops in einem Block?\\** | + | **P: Was passiert bei loops in einem Block?**\\ |
S: Man kann entweder einen Timer programmieren, | S: Man kann entweder einen Timer programmieren, | ||
- | **P: Das sind allgemeine JIT Lösungen. Wie macht das die JVM?\\** | + | **P: Das sind allgemeine JIT Lösungen. Wie macht das die JVM?**\\ |
S: Das weiß ich nicht. | S: Das weiß ich nicht. | ||
- | **P: Weil die JVM nur eine Applikation simuliert, muss sie nicht zwangsweise wieder in die Hauptschleife zurückkehren. \\** | + | **P: Weil die JVM nur eine Applikation simuliert, muss sie nicht zwangsweise wieder in die Hauptschleife zurückkehren.\\ |
- | Wenn die Applikation in einer Endlosschleife ist, dass hängt sie einfach fest. | + | Wenn die Applikation in einer Endlosschleife ist, dass hängt sie einfach fest.** |