- Schutz kritischer Abschnitte mit Hilfe des Prolog-/Epilogmodells.
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.
Klassenübersicht für Aufgabe 3
- 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 kann zum Schutz der kritischen Abschnitte im Guard zusätzlich zur Klasse CPU die Klasse Spinlock aus Aufgabe 2 verwendet werden, um auch gegen andere CPUs synchronisieren zu können.
Zur Erstellung der Epilog-Warteschlange werden die Hilfsklassen
Queue und
Chain vorgegeben. Bei Verwendung müsst ihr jedoch auf die richtige Synchronisation achten.