diff --git a/ws20.q b/ws20.q
index ce4c166d646499ea5298363b4f484813f06d8d11..50026daefd5392951b897363b0ad87787bef2978 100644
--- a/ws20.q
+++ b/ws20.q
@@ -1 +1,69 @@
 # https://sys.cs.fau.de/extern/lehre/ws23/sp2/pruefung/klausuren/2020w-SP-Klausur_www.pdf
+0 Gegeben seien die folgenden Präprozessor-Makros: (2021-02)
+|
+|
+|~~~
+|#define ADD(a, b) a + b
+|#define DIV(a, b) a / b
+|~~~
+|
+|Was ist das Ergebnis des folgenden Ausdrucks?
+|
+|~~~
+|3 * DIV(ADD(4, 8), 2)
+|~~~
+- 18
+- 10
+- 24
++ 16
+Ja. Makros, die mit `#define` definiert sind, werden rein syntaktisch vor dem eigentlichen Kompiliervorgang vom Präprozessor expandiert,
+indem an der Stelle, an der das Makro verwendet wird, die Definition dessen, bis auf Ersetzung der Parameter mit dem angegebenen Text, unverändert eingesetzt wird.
+Hier wird also nach dem Präprozessor-Schritt der folgende Ausdruck kompiliert: `3 * 4 + 8 / 2`. Das ergibt 16.
+.
+
+0 Welche Aussage über Einplanungsverfahren ist richtig? (2021-02)
+- Im Round-Robin-Verfahren nutzen E/A-intensive Prozesse die ihnen zugeteilte Zeitscheibe immer voll aus
+Nein. Bei *round-robin* wird jedem Prozess reihum eine gleich lange Zeitscheibe zugeteilt. Ein E/A-intensiver Prozess, der oft früh in seiner Zeitscheibe durch eine E/A-Operation
+in den Zustand "blockiert" übergeht, kann seine Zeitscheibe nicht bis zum Ende ausnutzen.
+- Der Konvoieffekt kann bei kooperativen Einplanungsverfahren wie First-Come-First-Served nicht auftreten.
+Nein. Insbesondere dort muss ein Prozess, der nur einen kurzen Rechenstoß macht, alle länger dauernden Rechenstöße in der Warteschlange abwarten.
+- Bei kooperativen Verfahren können Prozesse die CPU nicht monopolisieren.
+Nein. Genau bei kooperativen Verfahren, bei denen Prozesse die CPU freiwillig abgeben müssen, ist dies möglich. Präemptive Verfahren können im Gegensatz dazu derartige Prozesse unterbrechen.
++ In einem asymmetrischen Multiprozessorsystem ist der Einsatz von asymmetrischen Verfahren zur Planung obligatorisch.
+Ja. Man betrachte z. B. den Fall CPU + GPU. Ein Prozess, der auf der CPU rechnen möchte, kann nicht unbedingt auch auf der GPU rechnen. Deswegen ist der Einsatz einer Bereitliste für
+alle Rechenkerne (symmetrisches Planungsverfahren) hier unmöglich. Stattdessen müssen zumindest für GPU und CPU separate Bereitlisten existieren. Dies zeichnet asymmetrische Planungsverfahren aus.
+.
+
+0 Welche Aussage zu virtuellem Speicher ist richtig? (2021-02)
+- Virtueller Speicher sind die nicht vorhandenen Bereiche des physikalischen Adressraums.
+Nein. Mit virtuellem Speicher ist kein Bereich des physikalischen Adressraums gemeint. Stattdessen bezeichnet man damit die partielle Abbildung vom logischen zum physikalischen Adressraum.
+- Virtueller Speicher kann dynamisch zur Laufzeit von einem Programm mit der Funktion malloc(3p) erzeugt werden.
+Nein. Die Implementation von `malloc` kann das Betriebssystem dazu auffordern (`mmap(2), brk(2)`), den verfügbaren Speicherbereich des Prozesses zu vergrößern. Benutzerprogramme können jedoch nicht
+selbst die Abbildung von virtuellen Adressen zu physikalischen Adressen ändern.
+- Unter einem Virtuellen Speicher versteht man einen physikalischen Adressraum, dessen Adressen durch eine MMU vor dem Zugriff auf logische Adressen umgesetzt werden.
+Nein. Die *memory management unit* übersetzt logische Adressen auf physikalische.
++ Virtueller Speicher kann größer sein als der physikalisch vorhandene Arbeitsspeicher. Gerade nicht benötigte Speicherbereiche können auf Hintergrundspeicher ausgelagert werden.
+Ja. Das bezeichnet man als *swapping*.
+.
+
+0 Beim Einsatz von RAID-Systemen kann durch zusätzliche Festplatten Fehlertoleranz erzielt werden. Welche Aussage dazu ist richtig? (2021-02)
++ Bei allen RAID-Systemen ist ein höherer Lese-Durchsatz als bei einer einzelnen Platte möglich, da mehrere Platten gleichzeitig beauftragt werden können.
+Ja, zumindest bei den in SP betrachteten Systemen wird dies bei allen als Vorteil genannt.
+- Bei RAID 4 Systemen wird Paritätsinformation gleichmäßig über alle beteiligten Platten verteilt.
+Nein. Das wäre RAID 5. Bei RAID 4 gibt es eine designierte Paritätsplatte.
+- RAID 0 erzielt Fehlertoleranz durch das Verteilen der Daten auf mehrere Platten.
+Nein. RAID 0 erzielt keine Fehlertoleranz sondern erhöht nur die Lese- und Schreibgeschwindigkeit.
+- Bei RAID 4 und 5 darf eine bestimmte Menge von Festplatten nicht überschritten werden, da es sonst nicht mehr möglich ist, die Paritätsinformation zu bilden
+Nein. Derartige Einschränkungen existieren nicht.
+.
+
+0 Man unterscheidet Programmunterbrechungen in Traps und Interrupts. Welche Aussage ist richtig? (2021-02)
+- Weil das Betriebssystem nicht vorhersagen kann, wann ein Prozess einen Systemaufruf tätigt, sind Systemaufrufe in die Kategorie Interrupt einzuordnen.
+Nein. Systemaufrufe werden deterministisch ausgeführt, also werden sie der Kategorie Trap zugeordnet.
+- Bei der mehrfachen Ausführung eines unveränderten Programms mit gleichen Eingabedaten treten Interrupts immer an den gleichen Stellen auf.
+Nein. Das wäre die Definition von Traps. Interrupts, wie z. B. das Eintreffen eines Netzwerkpakets treten ohne direkten Zusammenhang zum unterbrochenen Prozess auf.
+- Ein gerade laufendes Maschinenprogramm kann bei Bedarf die Behandlung aller Programmunterbrechungen unterdrücken.
+Nein. Das Unterdrücken von Interrupts ist eine privilegierte Operation, die dem Betriebssystem vorbehalten ist. (Das würde sonst z. B. einem Benutzerprozess das Umgehen einer präemptiven Einplanung ermöglichen)
++ Normale Rechenoperationen können zu einem Trap führen.
+Ja, wenn z. B. [Division auf x86_64](https://www.felixcloutier.com/x86/div) mit einem Divisor von 0 ausgeführt wird.
+.