Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik

Übungen zu BS - Aufgaben (WS 2013/14)

Aufgabe 3: Interruptsynchronisation für OOStuBS/MPStuBS mit dem Pro-/Epilogmodell

Lernziel

  • Schutz kritischer Abschnitte mit Hilfe des Prolog-/Epilogmodells.

Aufgabenbeschreibung

Die Synchronisation der Aktivitäten innerhalb von OOStuBS/MPStuBS soll auf die Verwendung des Pro-/Epilogmodells umgestellt werden. Euer bisheriges Programm (Aufgabe 2) soll also so verändert werden, dass die Synchronisation nicht mehr durch Interruptsperren (harte Synchronisation) erfolgt.

Hierzu müssen die Klassen Keyboard, Panic, Gate und die Funktion guardian() angepasst bzw. erweitert werden. Die Klassen Locker, Guard, Secure kommen neu dazu. Außerdem ist es natürlich notwendig, dass ihr eure Applikation entsprechend anpasst.

Außerdem soll ein globales Guard Objekt guard angelegt werden, mit dessen Hilfe alle kritischen Abschnitte geschützt werden sollen.

In MPStuBS muss der Guard nicht nur gegen Interrupts schützen, sondern auch andere CPUs aussperren und so am Betreten des kritischen Abschnittes hindern. Dazu soll der Guard aktiv warten und die Abarbeitung des kritischen Abschnitts auf diese Weise serialisieren.

dot_a3.png
Klassenübersicht für Aufgabe 3

Implementierungshinweise

  • Das Testprogramm kann von Aufgabe 2 übernommen werden. Auch diesmal sollen wieder Ausgaben an verschiedenen Positionen aus dem Hauptprogramm und aus dem Interrupthandler gemacht werden.
  • Da die Verwendung des Pro-/Epilogmodells den Schutz kritischer Abschnitte mit Hilfe von CPU::disable_int() und CPU::enable_int() und in MPStuBS auch mit Hilfe eines eigenen Spinlocks weitgehend überflüssig macht, sollten zunächst einmal wieder alle entsprechenden Aufrufe entfernt werden.
  • Da bei unserer Implementierung die Interrupts vor Aufruf von guardian() gesperrt werden, müssen sie an geeigneter Stelle "von Hand" wieder freigegeben werden.
  • In MPStuBS können zum Schutz der kritischen Abschnitte im Guard zusätzlich zu Interruptsperren die in Aufgabe 2 implementierten Spinlocks verwendet werden, um auch gegen andere CPUs synchronisieren zu können.

Vorgaben

Zur Erstellung der Epilog-Warteschlange werden die Hilfsklassen Queue und Chain vorgegeben. Bei Verwendung müsst ihr jedoch auf die richtige Synchronisation achten.