Prozesssynchronisation
# Prozesssynchronisation

In der Programmierung versteht man unter Prozesssynchronisation (oder kurz einfach Synchronisation) die Koordinierung des zeitlichen Ablaufs mehrerer nebenläufiger Prozesse bzw. Threads. Dabei ist es unerheblich, ob es sich um Threads in einem Programm, um Programme auf einem Computer oder um Prozesse in einem Verteilten System handelt, die über ein Netzwerk kommunizieren.

Der Zweck der Koordinierung ist zumeist einer der folgenden:

* Gemeinsamer Zugriff auf Daten. Dabei muss verhindert werden, dass durch gleichzeitigen Zugriff Inkonsistenzen in den Daten entstehen. Dies wird durch Mutex-Verfahren zum gegenseitigen Ausschluss realisiert.
* Gemeinsame Nutzung beschränkter Betriebsmittel wie zum Beispiel von Peripheriegeräten. Hierbei können ebenfalls Mutex-Verfahren eingesetzt werden, häufig werden aber komplexere Methoden des Schedulings benötigt.
* Übergabe von Daten bzw. Nachrichten von einem Prozess an einen Anderen, also Interprozesskommunikation.
* Steuerung von Unterprozessen durch Signale, insbesondere das Abbrechen von Prozessen oder das Warten darauf, dass sie terminieren.

Die Synchronisation der Prozesse besteht nun darin, dass im Allgemeinen ein Prozess auf ein Ereignis warten muss, das von einem anderen ausgelöst wird. Es ist Aufgabe des Schedulers, die sich daraus ergebenden kausalen Abhängigkeiten so umzusetzen, dass ein Prozess immer nur dann Rechenzeit bekommt, wenn alle dafür notwendigen Bedingungen erfüllt sind. Konkret wird dies meist durch die klassischen Kontrollmechanismen wie Locks, Semaphore und Monitore gelöst.

Die Abhängigkeiten zwischen den Prozessen lassen sich formal zum Beispiel durch ein Petri-Netz modellieren. Ein typisches Problem ist in diesem Zusammenhang, dass sich Prozesse verklemmen können, wenn sich zirkuläre Abhängigkeiten bilden – das wird zum Beispiel bei dem Problem der speisenden Philosophen deutlich. Ein anderes prototypisches Problem ist die Steuerung eines Producer/Consumer-Systems.

