diff --git a/ws19.q b/ws19.q index 92ae64d159df09a8bfc723da0166bd38702c5fee..f9535a0151c31300aec0adac1f5a5d36de1bdb9c 100644 --- a/ws19.q +++ b/ws19.q @@ -5,22 +5,22 @@ - Um in einem System mit Seitennummerierung (Paging) Speicherseiten in die Auslagerungspartition (swap area) schreiben zu können. Nein, für die Implementation dessen ist das Betriebssystem zuständig. + Um auf einem Multiprozessorsystem einfache Modifikationen an Variablen ohne Sperren implementieren zu können. - Ja, die CAS-Instruktion erlaubt, eine Variable atomar nur dann auf den neuen Wert zu setzen, - wenn sie nicht währenddessen anderweitig modifiziert wurde. + Ja, die CAS-Instruktion erlaubt, eine Variable transaktional nur dann auf einen neuen Wert zu setzen, + wenn sie nicht anderweitig modifiziert wurde. Mittels einer CAS-Schleife kann somit der Wert einer Variable atomar ohne gegenseitigen Ausschluss geändert werden. - Um bei der Implementierung von Schlossvariablen (Locks) aktives Warten zu vermeiden. Nein, allein mit einer atomaren Variable *locks* zu implementieren, setzt aktives Warten auf die Änderung des Wertes voraus. - Stattdessen müsste für passives Warten der wartende Prozess in den Zustand blockiert übergehen, bis er von einem anderen Prozess "geweckt" wird. + Stattdessen müsste für passives Warten der wartende Prozess in den Zustand blockiert übergehen, bis er von einem anderen Prozess "geweckt" wird. Hierfür ist Betriebssystemunterstützung in Form eines Schedulers nötig. . 0 Was versteht man unter RAID 0? (Februar 2020) - Ein auf Flash-Speicher basierendes, extrem schnelles Speicherverfahren. - Nein, RAID 0 und andere RAID *level* bezeichnen, wie Daten auf mehrere Speichermedien aufgeteilt werden - und nicht, wie der Speicher in der echten Welt implementiert ist. + Nein, RAID 0 und andere RAID *level* bezeichnen, wie Daten auf mehrere Speichermedien (ein *redundant array of independent disks*) aufgeteilt werden + und nicht, wie der Speicher auf der physikalischen Ebene implementiert ist. - Auf Platte 0 wird Parity-Information der Datenblöcke der Platten 1 - 4 gespeichert. Nein, RAID 0 sorgt nicht für Redundanz, sondern dient nur zur Beschleunigung von Speicherzugriffen. Es werden keine Paritätsdaten angelegt. + Datenblöcke eines Dateisystems werden über mehrere Platten verteilt gespeichert. - Ja, ein Begriff hierfür lautet *striping* + Ja, ein Begriff hierfür lautet *striping*. - Datenblöcke werden über mehrere Platten verteilt und repliziert gespeichert. Nein, RAID 0 sorgt nicht für Redundanz, sondern dient nur zur Beschleunigung von Speicherzugriffen. Es werden keine Replikate von Datenblöcken angelegt. . @@ -32,17 +32,17 @@ - Der virtuelle Adressraum kann nie größer sein als der im Rechner vorhandene Hauptspeicher. Nein, durch Speichervirtualisierung können Seiten auf den Hintergrundspeicher ausgelagert werden (*swapping*). - Die maximale Größe des virtuellen Adressraums kann unabhängig von der verwendeten Hardware frei gewählt werden. - Nein, z. B. beträgt diese auf einem 32-Bit-System höchstens 2³² Datenwörter (In der Praxis also nur 4 GiB). + Nein, z. B. ist diese auf einem 32-Bit-System in der Regel auf höchstens 2³² Datenwörter beschränkt (In der Praxis also nur 4 GiB). + Der physikalische Adressraum ist durch die gegebene Hardwarekonfiguration definiert. Ja, jede physikalische Adresse korrespondiert zu einer tatsächlichen Stelle im Hauptspeicher, von dem eine bestimmte Menge in einem System verbaut ist. . 0 Welche Aussage zu Zeigern in C-Programmen ist richtig? (Februar 2020) -+ Zeiger können verwendet werden, um in C eine call-by-referenceÜbergabesemantik nachzubilden. ++ Zeiger können verwendet werden, um in C eine call-by-reference Übergabesemantik nachzubilden. Ja. C ist *call-by-value*, da Funktionsparameter als Kopie und nicht als Referenz weitergegeben werden. - Zeiger sind jedoch Referenzen auf Speicherstellen. Erhält eine Funktion also einen Zeiger als Wert, + Zeiger sind jedoch Referenzen auf Speicherstellen im Adressraum. Erhält eine Funktion also einen Zeiger als Wert, so kann sie mit dem Ziel des Zeigers so verfahren, als hätte sie das Ziel selbst per Referenz erhalten. -- Zeiger vom Typ `void*` existieren in C nicht, da solche Zeiger auf „Nichts“ keinen sinnvollen Einsatzzweck hätten. +- Zeiger vom Typ `void*` existieren in C nicht, da solche Zeiger auf "Nichts" keinen sinnvollen Einsatzzweck hätten. Nein, *void pointer* zeigen auf Daten mit unspezifiziertem Typ. Ein `void*` muss jedoch zuerst zu einem Zeiger auf einen nicht-`void`-Wert gecastet werden, bevor er dereferenziert werden kann, oder Pointerarithmetik durgeführt werden kann. - Ein Zeiger kann zur Manipulation von Daten in schreibgeschützten Speicherbereichen verwendet werden. @@ -62,7 +62,7 @@ int main(void) { int a = 5; - int* ptr = &a; ptr zeigt auf a. + int* ptr = &a; // ptr zeigt auf a. pointers_are_values_too(ptr); printf("%d\n", *ptr); // ptr zeigt immer noch auf a. } @@ -72,11 +72,12 @@ 0 Welche Aussage zu Programmbibliotheken ist richtig? (Februar 2020) - Eine statische Bibliothek, die in ein Programm eingebunden wurde, muss zum Ladezeitpunkt dieses Programms im Dateisystem vorhanden sein. Nein, das wäre bei einer dynamischen Bibliothek der Fall. - Bei statischen Binden wird bereits zur *link time* der Objektcode der Bibliothek in das Programm kopiert.A + Bei statischen Binden wird bereits zur *link time* der Objektcode der Bibliothek in das Programm kopiert. - Beim Binden mit einer statischen Bibliothek werden in einem Programm nur Verweise auf verwendete Symbole der Bibliothek angelegt. - Nein, das wäre bei einer dynamischen Bibliothek der Fall. + Nein, das wäre bei einer dynamischen Bibliothek der Fall. Bei einer statischen Bibliothek wird zunächst die gesamte Bibliothek in die ausführbare Datei eingebunden. + + Programm-Module, die von mehreren Anwendungen gemeinsam genutzt werden, können in Form einer dynamischen Bibliothek zentral installiert werden, um Speicherplatz zu sparen. - Ja, eine dynamische Bibliothek kann von mehreren Programmen referenziert werden. Somit ist nur eine Kopie dieser auf dem System nötig. Theoretisch kann so Speicherplatz gespart werden. + Ja, eine dynamische Bibliothek kann von mehreren Programmen referenziert werden. Somit ist nur eine Kopie dieser auf dem System nötig. So kann Speicherplatz gespart werden. - Eine Änderung am Code einer statischen Bibliothek (z. B. Bugfixes) erfordert kein erneutes Binden der Programme, die diese Bibliothek benutzen. Nein, bei statischen Bibliotheken wird der Objektcode zum Bindezeitpunkt in das Zielprogramm kopiert. Soll dieser geändert werden, so muss das Programm neu gebunden werden. Es reicht nicht aus, nur die statische Bibliothek zu ändern, da das Programm immer noch den ursprünglichen Objektcode enthält. @@ -84,7 +85,7 @@ 0 Welche der folgenden Aussagen über Einplanungsverfahren ist richtig? (Februar 2020) - Beim Einsatz präemptiver Einplanungsverfahren kann laufenden Prozessen die CPU nicht entzogen werden. - Nein, das wäre kooperative Einplanung. Bei präemptiver Einplanung kann einem Prozess durch einen Interrupt die CPU entzogen werden (Präemption). + Nein, das wäre kooperative Einplanung. Bei präemptiver Einplanung kann einem Prozess durch einen Timer-Interrupt die CPU entzogen werden (Präemption). - Probabilistische Einplanungsverfahren müssen die exakten CPU-Stoßlängen aller im System vorhandenen Prozesse kennen. Nein, diese betrachten nur die ungefähren Stoßlängen. + Bei kooperativer Einplanung kann es zur Monopolisierung der CPU kommen.