2. theoretisches Aufgabenblatt
-
Was versteht man unter dem Begriff Timesharing? (2 Pkt.)
-
Wie können Betriebssystemdienste in einem Betriebssystem
aufgerufen werden? (2 Pkt.)
-
Worin besteht der Unterschied zwischen Traps und
Interrupts und wie arbeiten ein Interrupt? (4 Pkt.)
-
Welche Probleme entstehen, wenn Interrupts über einen längeren
Zeitraum deaktiviert (maskiert) werden? (3 Pkt.)
-
Was versteht man unter einem kritischen Abschnitt?
Erläutere das Problem am Beispiel eines Druckerspoolers.
(3 Pkt.)
-
Was ist ein wechselseitige Ausschluss? (2 Pkt.)
-
Welche grundlegenden Adressierungsarten gibt es? (2 Pkt.)
-
Was betrachtet man als virtuellen Speicher eines Systems?
Erläutere die Unterschiede zwischen physikalischen und
virtuellen Adressen und beschreibe, was in der Anwendung,
im Betriebssystem und auf der Hardware-Ebene passiert, wenn auf eine
virtuelle Adresse zugegriffen wird. (4 Pkt.)
-
Der Quellcode am Ende des Fragebogens implementieren die Funktionen
eines Ringpuffers. Mit
put()
kann ein Prozess ein Zeichen
in den Puffer eintragen und mit get()
holt er eines
heraus. Allerdings sind diese Funktionen noch nicht vor Unterbrechungen
oder zeitgleiche Ausführung durch einen anderen Prozessor
geschützt.
Zeige an zwei Beispielen, dass dadurch Probleme auftreten können.
(4 Pkt.)
-
Der schon in
Aufgabe 9
beschriebene Ringpuffer soll
eingesetzt werden, um Tastencodes, die der Tastatur-Interrupthandler
von der Tastatur abholt, zwischenzuspeichern, bis sie von einem
Anwendungsprozesss, der auf dem gleichen Prozessor ausgeführt wird,
benötigt werden.
Wie können die Datenstrukturen des Ringpuffers in diesem Fall
geschützt werden? (4 Pkt.)
#define BUF_SIZE 10
char buffer[BUF_SIZE];
int empty = 1;
int full = 0;
int posr = 0;
int posw = 0;
char put (char c) {
if (!full) {
buffer[posw] = c;
posw = (posw + 1) % BUF_SIZE;
empty = 0;
if (posw == posr) full = 1;
return c;
}
return 0;
}
char get () {
char c;
if (!empty) {
c = buffer[posr];
posr = (posr + 1) % BUF_SIZE;
full = 0;
if (posr == posw) empty = 1;
return c;
}
return 0;
}