4.2 Protokolle für Ressourcen-Zugriffe
231
4.2 Protokolle für Ressourcen-Zugriffe
In diesem Unterabschnitt benutzen wir den Begriff des Jobs.
Definition 4.4: Ein Job ist eine konkrete Ausführung einer (möglicherweise wiederholt auszuführenden) Task.
Ein Job ist eine abstraktere Sicht auf auszuführende Berechnungen als Prozesse
und Threads in Betriebssystemen, auf die Jobs letztlich im Rahmen des Entwurfs
abgebildet werden müssen. Eine Präzisierung dieser Definition wird in Definition
6.1 gegeben.
4.2.1 Prioritätsumkehr
In einigen Fällen muss sichergestellt werden, dass Jobs exklusiven Zugriff auf Ressourcen wie gemeinsame globale Variablen oder Geräte erhalten, um nichtdeterministisches oder anderweitig unerwünschtes Programmverhalten zu vermeiden.
Dieser exklusive Zugriff ist besonders wichtig bei eingebetteten Systemen, z.B. zur
Implementierung von Kommunikation über gemeinsamen Speicher oder für den exklusiven Zugriff auf ein bestimmtes Hardwaregerät. Die Programmabschnitte, die
einen solchen exklusiven Zugriff während ihrer Ausführung benötigen, werden kritische Abschnitte genannt. Kritische Abschnitte sollten kurz ein. Betriebssysteme
stellen meist Grundfunktionen (engl. primitives) zur Verfügung, um exklusiven Zugriff auf Ressourcen anzufordern und wieder freizugeben, diese werden auch Mutexe
(für „mutual exclusion” = gegenseitiger Ausschluss) genannt. Jobs, die keinen exklusiven Zugriff erhalten, müssen warten, bis die entsprechende Ressource freigegeben
wird. Demzufolge muss die Freigabeoperation prüfen, ob es wartende Jobs gibt und
den Job mit höchster Priorität fortsetzen.
In diesem Buch nennen wir die Anforderungsoperation P(S) und die Freigabeoperation V(S), wobei S für die jeweilige Ressource steht. P(S) und V(S) sind sogenannte
Semaphor-Operationen. Semaphore ermöglichen es, dass bis zu n (wobei n ein
Parameter ist) Jobs eine bestimmte Ressource, die von S geschützt wird, gleichzeitig
benutzen können. S kennzeichnet dabei eine Datenstruktur, die einen Zähler enthält, der angibt, wie viele Ressourcen noch verfügbar sind. P(S) prüft diesen Zähler
und blockiert den Aufrufer, wenn alle Ressourcen bereits belegt sind. Anderenfalls
wird der Zähler verändert und der Aufrufer darf fortfahren. V(S) inkrementiert die
Anzahl verfügbarer Ressourcen und stellt sicher, dass ein blockierter Aufrufer (falls
einer existiert) fortfahren kann. Wichtig ist, dass die Operationen P(S) und V(S) unteilbar sind, d.h. nie durch andere Operationen unterbrochen werden können. Die
Bezeichnungen P(S) und V(S) entstammen der niederländischen Sprache. Wir verwenden diese Operationen nur in Form von binären Semaphoren mit n = 1, d.h., wir
erlauben nur einem einzigen Aufrufer, die Ressource zu nutzen.
In eingebetteten Systemen sind Abhängigkeiten zwischen Jobs die Regel und keine Ausnahme. Auch ist die effektive Jobpriorität von Echtzeitanwendungen wichtiger
Précédent

- 251/485

Suivant