Skip to main content.

Navigation:

2. theoretisches Aufgabenblatt

  1. Was versteht man unter dem Begriff Timesharing? (2 Pkt.)
  2. Wie können Betriebssystemdienste in einem Betriebssystem aufgerufen werden? (2 Pkt.)
  3. Worin besteht der Unterschied zwischen Traps und Interrupts und wie arbeiten ein Interrupt? (4 Pkt.)
  4. Welche Probleme entstehen, wenn Interrupts über einen längeren Zeitraum deaktiviert (maskiert) werden? (3 Pkt.)
  5. Was versteht man unter einem kritischen Abschnitt? Erläutere das Problem am Beispiel eines Druckerspoolers. (3 Pkt.)
  6. Was ist ein wechselseitige Ausschluss? (2 Pkt.)
  7. Welche grundlegenden Adressierungsarten gibt es? (2 Pkt.)
  8. 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.)
  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;
   }