Skip to main content.

Navigation:

2. theoretisches Aufgabenblatt

  1. Wodurch kann der Status eines Programms beschrieben werden? (2 Pkt.)
  2. Was ist unter Diensten und Betriebsmitteln zu verstehen und wie werden sie verwendet? (3 Pkt.)
  3. Wie können Betriebssystemdienste in einem Betriebssystem aufgerufen werden? (2 Pkt.)
  4. Worin besteht der Unterschied zwischen Traps und Interrupts und wie arbeiten ein Interrupt? (4 Pkt.)
  5. Welche Probleme entstehen, wenn Interrupts über einen längeren Zeitraum deaktiviert (maskiert) werden? (2 Pkt.)
  6. Was versteht man unter einem kritischen Abschnitt? Erläutere das Problem am Beispiel eines Druckerspoolers. (3 Pkt.)
  7. Was ist eine Ko-Routine und wie unterscheidet sie sich von einer Routine? (3 Pkt.)
  8. 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.)
  9. 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.)
  10. 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;
   }