3. Kommunikation
b. Anwendungen
Gegenseitiger Ausschluss durch Prozesskommunikation
Durch das Versenden und Empfangen von Nachrichten lässt sich relativ einfach der gegenseitige Ausschluss realisieren. Hierzu wird eine Mailbox „mutex“ eingeführt. Es wird asynchrone Kommunikation vorausgesetzt, sowie eine nicht-leere Initialisierung dieser Mailbox. Ein Programmausschnitt in Pseudocode sieht demnach wie folgt aus:
Mailbox mutex = not null; while (true) { receive (mutex, msg); kritischer Abschnitt; send (mutex, msg); … } |
Hier ist zu erkennen, dass der Prozess solange wartet (blockierendes Empfangen), bis eine Nachricht in der Mailbox mutex zur Abholung bereitsteht. Dadurch wird der Prozess aufgeweckt und tritt in seinen kritischen Abschnitt ein. Wenn dieser durchlaufen ist, sendet der Prozess eine Nachricht an die Mailbox, um den nächsten, auf den kritischen Abschnitt wartenden Prozess aufzuwecken.
Erzeuger-Verbraucher-Problem
Auch das schon weiter oben besprochene Erzeuger-Verbraucher-Problem lässt sich durch das Prinzip der Interprozesskommunikation lösen. Der zugehörige Beispiel-Quellcode sähe demnach wie folgt aus:
Erzeuger: while (true) { |
Verbraucher: for (i=0; i<N; i++) { |
In der for-Schleife des Verbraucherprozesses
wird zuerst veranlasst, dass der Produzent N „items“ produziert,
dadurch, dass ihm N Nachrichten geschickt werden. Der Erzeuger produziert immer
ein item, wenn er eine Nachricht erhält. Dieses item sendet er dann in
einer Nachricht an den Verbraucher.
Analog dazu wartet der Verbraucher darauf, ein item vom Produzenten zu erhalten,
um dieses dann aus der Nachricht zu extrahieren und dem Produzenten eine leere
Nachricht als Signal für das Anstoßen eines neuen Produktionsdurchlaufs
zu senden.