2. theoretisches Aufgabenblatt
-
Wodurch kann der Status eines Programms beschrieben werden? (2 Pkt.)
-
Was ist unter Diensten und Betriebsmitteln zu verstehen und wie werden
sie verwendet? (3 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? (2 Pkt.)
-
Was versteht man unter einem kritischen Abschnitt?
Erläutere das Problem am Beispiel eines Druckerspoolers.
(3 Pkt.)
-
Was ist eine Ko-Routine und wie unterscheidet sie sich von einer Routine?
(3 Pkt.)
-
Welche grundlegenden Ansätze zur Umsetzung eines Betriebssystemkerns
gibt es und worin unterscheiden sich diese Ansätze (Beschreibe Vor-
und Nachreile, die sich aus den Unterschieden ergeben)? (3 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;
}