Wenn du Prozesse beschreiben willst, in denen Dinge gleichzeitig passieren – mehrere Maschinen, parallele Threads, konkurrierende Aufträge – stößt ein einfaches Flussdiagramm schnell an seine Grenzen. Genau hier setzen Petri-Netze an. Sie wurden 1962 von Carl Adam Petri eingeführt und sind bis heute eines der mächtigsten Werkzeuge, um nebenläufige Systeme formal und trotzdem anschaulich zu modellieren.
Die vier Grundbausteine eines Petri-Netzes
Ein Petri-Netz ist ein gerichteter, zweigeteilter Graph (bipartit) mit genau vier Elementen:
- Stellen (Places): Dargestellt als Kreise. Sie repräsentieren Zustände, Bedingungen oder Ressourcen – etwa "Werkstück wartet" oder "Puffer frei".
- Transitionen (Transitions): Dargestellt als Rechtecke oder Balken. Sie stehen für Ereignisse oder Aktionen, die einen Zustandswechsel auslösen – etwa "Bearbeitung starten".
- Kanten (Arcs): Gerichtete Pfeile, die immer eine Stelle mit einer Transition verbinden (nie zwei Stellen oder zwei Transitionen direkt).
- Marken (Tokens): Schwarze Punkte in den Stellen. Sie repräsentieren konkrete Objekte oder die Erfüllung einer Bedingung. Die Verteilung aller Marken nennt man die Markierung – sie ist der aktuelle Zustand des gesamten Netzes.
Genau diese Trennung von Stellen und Transitionen macht den Unterschied zum gewöhnlichen Flussdiagramm: Zustand und Ereignis sind sauber voneinander getrennt. Mit dem Petri-Netz-Editor kannst du genau diese Bausteine grafisch anlegen, Marken setzen und das Netz Schritt für Schritt simulieren.
Die Schaltregel: Wann feuert eine Transition?
Das Herzstück jedes Petri-Netzes ist die Schaltregel (firing rule). Sie entscheidet, wie sich das Netz dynamisch verhält:
- Eine Transition ist aktiviert (enabled), wenn auf jeder ihrer Eingangsstellen mindestens so viele Marken liegen, wie das Gewicht der eingehenden Kante verlangt (Standardgewicht ist 1).
- Beim Schalten (firing) werden auf den Eingangsstellen Marken entfernt und auf den Ausgangsstellen Marken hinzugefügt – jeweils entsprechend den Kantengewichten.
- Sind mehrere Transitionen gleichzeitig aktiviert, schaltet im einfachen Modell nur eine pro Schritt. Welche, ist nicht festgelegt – das modelliert echten Nichtdeterminismus.
Wichtig: Die Anzahl der Marken bleibt beim Schalten nicht zwangsläufig konstant. Eine Transition kann zwei Marken verbrauchen und drei erzeugen. Dadurch lassen sich auch Produktion, Verbrauch und Speicherung sauber abbilden.
Warum Petri-Netze Nebenläufigkeit so gut abbilden
Der große Vorteil gegenüber einem klassischen Zustandsautomaten: Ein Petri-Netz muss nicht jeden globalen Zustand explizit auflisten. Zwei unabhängige Vorgänge laufen einfach als zwei getrennte Marken-Flüsse parallel. Das vermeidet die berüchtigte Zustandsexplosion, bei der die Zahl der Kombinationen exponentiell wächst.
Typische Muster, die du modellieren kannst:
- Nebenläufigkeit: Eine Transition erzeugt Marken auf zwei Stellen, die danach unabhängig weiterlaufen.
- Synchronisation: Eine Transition braucht Marken aus mehreren Stellen gleichzeitig – sie wartet, bis alle Zweige fertig sind.
- Konflikt: Zwei Transitionen teilen sich eine Eingangsstelle. Schaltet die eine, ist die andere blockiert.
- Gegenseitiger Ausschluss (Mutex): Eine einzelne Marke auf einer "Schlüssel"-Stelle stellt sicher, dass nur ein kritischer Bereich aktiv ist.
Wichtige Eigenschaften: Erreichbarkeit, Lebendigkeit, Beschränktheit
Sobald ein Netz steht, lassen sich formale Aussagen treffen:
- Erreichbarkeit: Ist eine bestimmte Markierung von der Anfangsmarkierung aus durch eine Folge von Schaltschritten erreichbar? Der zugehörige Erreichbarkeitsgraph listet alle möglichen Zustände auf.
- Beschränktheit (Boundedness): Kann sich auf einer Stelle eine unbegrenzte Zahl an Marken anstauen? Ein 1-beschränktes Netz heißt sicher – wichtig etwa bei Pufferbegrenzungen.
- Lebendigkeit (Liveness): Kann jede Transition prinzipiell immer wieder schalten, oder läuft sich das System tot? Hier verstecken sich oft Deadlocks.
Gerade die Deadlock-Analyse ist ein praktischer Grund, Petri-Netze einzusetzen: Ein gefürchteter Stillstand, in dem keine Transition mehr aktiviert ist, fällt im Modell sofort auf – lange bevor er in echter Software oder Anlagentechnik teuer wird.
Wo Petri-Netze in der Praxis eingesetzt werden
Petri-Netze sind nicht nur akademische Theorie. Du findest sie in vielen Bereichen wieder:
- Geschäftsprozesse: Workflow-Management und Business Process Modeling – BPMN baut konzeptionell auf ähnlichen Ideen auf.
- Fertigung und Logistik: Materialfluss, Maschinenbelegung und Lagerverwaltung.
- Nebenläufige Software: Synchronisation von Threads, Semaphoren und Protokollen.
- Verteilte Systeme: Kommunikationsprotokolle und Konsistenzbedingungen.
Der schnellste Weg, ein Gefühl für die Dynamik zu bekommen, ist Ausprobieren: Bau ein kleines Netz im Petri-Netz-Editor, setze ein paar Marken und schalte aktivierbare Transitionen schrittweise durch. Wer eher mit Automaten arbeitet, sollte sich parallel den Regex-Automat ansehen – auch dort geht es um Zustände und Übergänge, nur deterministischer. Weitere Modellierungswerkzeuge findest du in unserer Sammlung unter kotsch.tech/webtools.
Häufige Fehler beim Modellieren
Drei Stolperfallen begegnen Einsteigern besonders oft:
- Direkte Stelle-Stelle-Kanten: Nicht erlaubt. Zwischen zwei Stellen muss immer eine Transition liegen.
- Vergessene Synchronisation: Wer Parallelität startet, aber nie wieder zusammenführt, bekommt Marken, die sich anstauen oder verloren gehen.
- Zu grobe Stellen: Wenn eine Stelle zu viele Bedeutungen trägt, wird das Netz mehrdeutig. Lieber feiner aufteilen.
Mit etwas Übung wird das Petri-Netz zu einem präzisen, gleichzeitig intuitiven Werkzeug, mit dem du komplexe nebenläufige Abläufe sichtbar und überprüfbar machst – ein echter Mehrwert gegenüber dem klassischen Flussdiagramm.