Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultät Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Betriebssysteme
 
  Vorlesung
    - UnivIS-Infos
    - Inhalt
    - Folien
 
  Übungen
    - UnivIS-Infos
    - Inhalt
    - Ergänzendes Material
    - Terminübersicht
    - Aufgaben
       * Umgebung
       * Typische Fehler
       * Aufgabe 1
          Dokumentation
       * Aufgabe 2
          Dokumentation
       * Aufgabe 3
          Dokumentation
       * Aufgabe 4
          Dokumentation
       * Aufgabe 5
          Dokumentation
       * Aufgabe 6
          Dokumentation
       * Aufgabe 7
          Dokumentation
 
  Evaluation
Department Informatik  >  Informatik 4  >  Lehre  >  WS 2009/10  >  Betriebssysteme  >  Übungen  >  Aufgaben  >  Aufgabe 7

Guard Klassenreferenz

Synchronisation des BS-Kerns mit Unterbrechungen. Mehr ...

#include <guard.h>

Klassendiagramm fĂŒr Guard:
Zusammengehörigkeiten von Guard:

Aufstellung aller Elemente

Öffentliche Methoden

 Guard ()
 Konstruktor.
void enter ()
 Betreten des kritischen Abschnitts.
void leave ()
 Verlassen des kritischen Abschnitts.
void try_idling ()
 Kritischen Abschnitt verlassen und versuchen sich atomar schlafen zu legen.
void relay (Gate *item)
 Ein Prolog möchte, dass seine Epilog-AktivitĂ€t ausgefĂŒhrt wird.


AusfĂŒhrliche Beschreibung

Synchronisation des BS-Kerns mit Unterbrechungen.

Die Klasse Guard dient der Synchronisation zwischen "normalen" KernaktivitÀten (zur Zeit Ausgaben, spÀter Systemaufrufe) und Unterbrechungsbehandlungsroutinen. Dazu besitzt Guard eine Warteschlange (ein Queue Objekt), in die Gate Objekte eingereiht werden können. Das ist immer dann erforderlich, wenn zum Zeitpunkt des Auftretens einer Unterbrechung der kritische Abschnitt gerade besetzt ist, die epilogue() Methode also nicht sofort bearbeitet werden darf. Die angesammelten Epiloge werden behandelt, sobald der kritische Abschnitt wieder freigegeben wird.

Hinweise
  • Die Epilogqueue stellt eine zentrale Datenstruktur dar, deren Konsistenz geeignet gesichert werden muß. Die von uns durch die Klasse Queue bereitgestellte Implementierung ist nicht unterbrechungstransparent! Entweder ihr implementiert also selbst eine unterbrechungstransparente Queue, oder ihr synchronisiert die bereitgestellte Queue entsprechend hart. Im Multiprozessorfall muss zusĂ€tzlich noch auf die Synchronisation mit anderen CPUs geachtet werden.
  • Da Gate Objekte nur einen einzigen Verkettungszeiger besitzen, dĂŒrfen sie zu einem Zeitpunkt nur ein einziges Mal in der Epilogliste aufgefĂŒhrt sein. Wenn also zwei gleichartige Interrupts so schnell aufeinanderfolgen, dass der zugehörige Epilog noch gar nicht behandelt wurde, darf nicht versucht werden, dasselbe Gate Objekt zweimal in die Epilogliste einzutragen. Die Klasse Gate bietet Methoden, dies zu vermerken bzw. zu prĂŒfen.
  • Ein Betriebssystem sollte Unterbrechungen immer nur so kurz wie möglich sperren. Daher sieht das Pro-/Epilog-Modell vor, dass Epiloge durch Prologe unterbrochen werden können. FĂŒr OOStuBS bedeutet das, dass bereits vor der AusfĂŒhrung des Epilogs einer Unterbrechungsbehandlung Interrupts wieder zugelassen werden sollten.

Dokumentation der Elementfunktionen

void Guard::enter (  ) 

Betreten des kritischen Abschnitts.

Das Betreten des kritischen Abschnittes ist je nach Art des Systems unterschiedlich zu handhaben. Bei einem Uniprozessorsystem genĂŒgt es mittels Locker::enter() die Sperrvariable zu setzen, da nur ein einziger Kontrollfluss gleichzeitig den kritischen Bereich betreten kann. Sobald jedoch mehrere CPUs vorhanden sind, ist dies nicht mehr der Fall. Will nun eine CPU den kritischen Bereich betreten, obwohl sich dort schon eine andere CPU befindet, so soll hier aktiv gewartet werden, bis der kritische Bereich wieder freigegeben wurde.

Erneute Implementation von Locker.

void Guard::leave (  ) 

Verlassen des kritischen Abschnitts.

Mit dieser Methode wird der kritische Abschnitt verlassen und die angestauten Epiloge werden abgearbeitet.

void Guard::try_idling (  ) 

Kritischen Abschnitt verlassen und versuchen sich atomar schlafen zu legen.

Der normale Kontrollfluss verlÀsst den kritischen Abschnitt. Angestaute Epiloge können jetzt abgearbeitet werden. Guard wird jedoch nicht nur einfach verlassen, sondern es wird noch versucht die aktuelle CPU in den Idlemodus zu schicken. Wurden jedoch wÀhrend des Verlassens Epiloge abgearbeitet, so können diese wieder Prozesse bereit setzen. Dann darf man nicht idln und macht hier ein einfaches leave. Sollten keine Epiloge angelaufen sein, so kann man den Prozessor in den Idle-Modus schicken.

void Guard::relay ( Gate item  ) 

Ein Prolog möchte, dass seine Epilog-AktivitĂ€t ausgefĂŒhrt wird.

Diese Methode wird von guardian () aufgerufen, falls der zuvor ausgefĂŒhrte Prolog durch einen RĂŒckgabewert true angezeigt hat, dass sein Epilog ausgefĂŒhrt werden soll. Ob der Epilog sofort behandelt oder zunĂ€chst nur in die Epilogliste eingehĂ€ngt wird, hĂ€ngt davon ab, ob der kritische Abschnitt frei oder besetzt ist.


Die Dokumentation fĂŒr diese Klasse wurde erzeugt aufgrund der Dateien:
  Impressum   Datenschutz Stand: 2010-07-19 12:37   BO, DL