Zusammenfassung

  • Eine Click-Verbindung beschreibt einen möglichen Übergabeweg für Pakete. Sie ist weder Laufzeitspur noch Beleg dafür, welche Seite die Übergabe auslöste.
  • Beim Push beginnt die Kontrolle an der Quelle und läuft vorwärts. Beim Pull beginnt die Anfrage am Ziel und läuft rückwärts, während das gelieferte Paket weiter in Pfeilrichtung wandert. Eine explizite Queue verbindet beide Takte.
  • Der Graph macht Zuständigkeiten lesbar, ersetzt aber keine Belege für Porttypen, Initialisierung, Queue-Zustand, Scheduler-Auswahl, Geräteabschluss oder Empfang.

Was der Pfeil offenließ

Click setzt einen Router aus feinen Elementen zusammen. Ein Element liest ein Gerät, ein anderes prüft einen Header, sucht eine Route, klassifiziert, zählt, puffert oder sendet. Verbindungen bilden einen gerichteten Graphen.

Der TOCS-Beitrag von Eddie Kohler, Robert Morris, Benjie Chen, John Jannotti und M. Frans Kaashoek bezeichnet Kanten als mögliche Wege der Paketübergabe. „Möglich“ begrenzt die Aussage. Eine konfigurierte Kante beweist keinen tatsächlichen Durchlauf. Und A vor B bedeutet nicht zwingend, dass A jeden Aufruf startet.

Die Portsemantik beantwortet die ausgelassene Frage. Der Graph bestimmt die Paketmöglichkeit, Push oder Pull die Initiative. Wer beides vermischt, erklärt eine vom Ausgangsgerät verursachte Pause als Mangel am Eingang oder verwechselt eine zulässige Verzweigung mit einer ausgeführten Wahl.

Push beginnt mit einem unerbetenen Ereignis

Ein Empfangsgerät bekommt ein Paket, ohne vorher vom nachfolgenden Graphen gefragt worden zu sein. Sein Element ruft die nächste Push-Schnittstelle auf. Kontrolle und Paket bewegen sich gemeinsam nach vorn, bis ein Element verarbeitet, verwirft oder speichert.

Die Quelle besitzt den Startzeitpunkt, nicht alle späteren Entscheidungen. Ein Classifier kann umleiten, eine Prüfung ablehnen und eine volle Queue verwerfen. Ein Empfangszähler ist kein Sendebeleg.

Eine belastbare Rekonstruktion verbindet Geräteereignis, aktive Konfiguration, aufrufendes Element, gewählten Zweig und die Resultate wichtiger Grenzen. Getrennte Summenzähler können diese Kausalität nicht nachträglich erfinden.

Pull beginnt mit freier Kapazität

Am Ausgang entsteht Bedarf, wenn das Gerät senden kann. Das Zielelement startet einen Pull. Die Anfrage läuft gegen die Pfeilrichtung, bis ein vorgeschaltetes Element ein Paket oder einen leeren Zustand zurückgibt.

Kohlers Dissertation zeigt die Asymmetrie: Beim Push beginnt der Kontrollfluss am Empfang und läuft vorwärts; beim Pull beginnt er am Sender und läuft rückwärts; das Paket bewegt sich immer vorwärts. Eine Kante kann somit zwei entgegengesetzte Aufrufgeschichten tragen.

Das ermöglicht zusammensetzbare Scheduler. Ein Element mit mehreren Pull-Eingängen und einem Pull-Ausgang erhält die nachgelagerte Anfrage, wählt einen Eingang und fragt dort an. Seine Lage zeigt den Entscheidungspunkt. Die Linien beweisen nicht, welcher Eingang bei einem Ereignis gewann, ob ein anderer leer war oder wie lange eine Quelle wartete.

Die Queue besitzt den Abstand zwischen zwei Takten

Der einfache Pfad platziert eine Queue zwischen Empfangs-Push und Sende-Pull. Pakete werden in ihren Eingang geschoben und FIFO gehalten. Ist das Ausgabegerät bereit, zieht es am Ausgang der Queue und erhält das vorderste Paket.

Das Element macht eine Abhängigkeit sichtbar: Ankunft und Bedienung folgen verschiedenen Uhren. Der Zwischenraum braucht einen Besitzer. Click gibt ihm Namen, Ports, Grenze und beobachtbaren Zustand.

Ein erfolgreicher Enqueue bleibt ein enger Beleg. Er bestätigt Annahme in dieser Speicher-Queue unter dieser Konfiguration. Er garantiert weder Crash-Persistenz noch maximale Verzögerung, spätere Auswahl, physische Übertragung oder entfernten Empfang. Dequeue belegt nur das Verlassen dieser Queue.

Auch FIFO garantiert keine systemweite Fairness. Mehrere Queues können einem Scheduler zufließen; Verlust kann vorher auftreten; Benachrichtigung, Batching und Gerätebereitschaft verändern Pull-Zeitpunkte. Sichtbarkeit schafft klare Fragen, keine universellen Antworten.

Ein gemeinsamer Portvertrag ohne dauernden Schiedsrichter

Laufende Click-Ports verhalten sich als Push, Pull oder agnostisch. Push verbindet sich mit Push, Pull mit Pull. Eine direkte Push-Pull-Verbindung ist illegal. Ein agnostischer Port passt sich dem kompatiblen Nachbarn an.

Diese schmale Regel ist eine minimale gemeinsame Spezifikation. Unabhängige Entwickler können Elemente schreiben und kombinieren, ohne jede Komposition genehmigen zu lassen. Sie müssen sich nur darüber einigen, wer den nächsten Transfer beginnen darf. Einen Widerspruch kann die Initialisierung deterministisch ablehnen.

Die Datei selbst ist noch keine Adoption. Die SMP-Click-Arbeit beschreibt Parse, Router-Erzeugung, Initialisierungsversuch und erst nach Erfolg Installation und Start. Ein Commit, Diagramm oder erfolgreicher Parserlauf ist nicht der aktive Datenpfad.

Optimierung macht Herkunftsnachweise notwendig

Feine Komponenten bringen Flexibilität und Aufrufkosten. Kohler, Morris und Chen wandten compilerähnliche Optimierungen auf ganze Konfigurationen an. Werkzeuge spezialisierten Classifier, entfernten toten Code und virtuelle Aufrufe, prüften Alignment oder kombinierten Definitionen.

Eine logische Kante muss deshalb im ausführbaren Ergebnis nicht als eigener Aufruf erscheinen. Die Prüfung braucht eine Herkunftskette: Quellkonfiguration, Transformationen, erzeugtes Ergebnis, Build und installierte Instanz. Der Graph erklärt Verantwortung; die Kette beweist Umsetzung.

Ohne sie wird der ursprüngliche Plan zur falschen Laufzeitspur. Oder das optimierte Programm erscheint als unerklärliche Blackbox, obwohl es aus einer lesbaren Beschreibung entstand. Running-Code-Primacy verlangt nicht die Wahl zwischen Dokument und Binärdatei, sondern den nachweisbaren Übergang.

Zusammenarbeit statt Ein-Personen-Pfeil

Kohlers offizielle Harvard-Seite nennt Click als Projekt. Im Journalartikel steht ihr Name zuerst, und die MIT-Dissertation entwickelt Architektur und Sprachwerkzeuge. Die Quellen zeigen ebenso die Gruppe: Morris, Chen, Jannotti und Kaashoek teilen den Hauptbeitrag; Massimiliano Poletto arbeitet am Sprachbericht mit; später folgen viele Softwarebeiträge.

Eine Einzelheldengeschichte würde auf menschlicher Ebene denselben Fehler wiederholen. Ein Pfeil enthält nicht alle Aufrufe, ein Name nicht alle Arbeit. Kohlers Rolle wird genauer als Beitrag zu einer Methode sichtbar: kleine Zuständigkeiten kombinieren, Initiative deklarieren und die laufende Instanz den Endbeleg liefern lassen.

Quellen