Gegeben sind zwei Tasks und
mit folgenden kritischen Sektionen:
und
. Task
startet zuerst. Während der Ausführung mit Semaphor
startet Task
. Beide Tasks 'verhakeln' sich durch wechselseitige Anforderungen, da das Priority Inference Protokoll keine Regel besitzt, um Konflikte bei wechselseitigen Anforderungen zu verhindern.
Im Detail: Task tritt als erster auf und kann seine Ausführung beginnen, da kein anderer Task ihn daran hindert. Der Eintritt in die kritische Sektion mit Semaphor
ist problemlos. Während der Nutzung von Semaphor
tritt Task
auf. Da er eine höhere nominelle Priorität besitzt als Task
kann er seine nichtkritische Sektion ausführen und Task
muß warten. Dies gilt auch dann, wenn Task
in die Abarbeitung seiner kritrischen Sektion mit Semaphor
eintreten will. Da dieser Semaphor zu diesem Zeitpunkt von keinem anderen Task direkt belegt wird, kann Task
die Abarbeitung beginnen, da er auch eine höhere Priorität als Task
besitzt. Innerhalb der Nutzung von Semaphor
stößt Task
dann auf die eingebettete kritische Sektion mit Semaphor
. Bei der Anforderung von Semaphor
stößt er auf Task
, der diesen Semaphor noch unter Kontrolle hat. Task
wird durch Task
blockiert und muß zusätzlich noch für die Dauer der Nutzung von Semaphor
seine Priorität an Task
abgeben. Nun kann Task
seine Nutzung von Semaphor
fortsetzen. Während dieser Nutzung stößt task
auf die kritische Sektion mit Semaphor
. Dieser wird aber von Task
kontrolliert. Also muß auch Task
warten. Da nun beide Tasks wechselseitig aufeinander warten müssen, liegt ein Deadlock vor.
Intuitiv ist klar, dass der Konflikt dadurch auftritt, dass im Fall von eingebetteten kritischen Sektionen eigentlich alle Semaphoren , die relativ zum ersten Semaphor einer kritischen Sektion eingebettet sind, 'vorbeugend' reserviert werden müssen, um solche Blockaden zu verhinden. Eine Strategie, um solche Blockierungen vorbeugend auszuschließen, bietet das Priority-Ceiling Protokoll von Sha et al. (1990)[102] Dies soll kurz besprochen werden.
Gerd Doeben-Henisch 2013-01-16