Pipeline (software)

Im Softwareentwicklung, a Pipeline besteht aus einer Kette von Verarbeitungselementen (Prozesse, Themen, Coroutinen, Funktionen, usw.), so angeordnet, dass die Ausgabe jedes Elements die Eingabe des nächsten ist; Der Name ist analog zu einem physischen Pipeline. In der Regel etwas an Pufferung wird zwischen aufeinanderfolgenden Elementen bereitgestellt. Die Informationen, die in diesen Pipelines fließen, sind oft a Strom von Aufzeichnungen, Bytes, oder Bitsund die Elemente einer Pipeline können genannt werden Filter; Dies wird auch als die genannt Rohre und Filter Designmuster. Das Verbinden von Elementen mit einer Pipeline ist analog zu Funktionszusammensetzung.

Grenzweise ist eine Pipeline linear und ein Richtung, obwohl der Begriff manchmal auf allgemeinere Strömungen angewendet wird. Zum Beispiel kann eine in erster Linie eine One-Richtung-Pipeline eine Kommunikation in die andere Richtung haben, die als a bekannt ist Rückkehrkanal oder Rückkanal, wie in Der Lexer -Hackoder eine Pipeline kann vollständig bidirektional sein. Fließt mit einem einseitigen Baum und Regie acyclische Graphen Topologien verhalten sich ähnlich wie (lineare) Pipelines - der Mangel an Zyklen macht sie einfach - und kann daher lose als "Pipelines" bezeichnet werden.

Implementierung

Pipelines werden häufig in a implementiert Multitasking OSDurch das Starten aller Elemente gleichzeitig wie Prozesse und automatisch die Datenleseanforderungen nach jedem Prozess mit den Daten, die vom vorgelagerten Prozess verfasst wurden, kann dies als a genannt werden Multiprozimierte Pipeline. Auf diese Weise die Zentralprozessor wird natürlich unter den Prozessen von der verändert sein Planer um seine Leerlaufzeit zu minimieren. In anderen gängigen Modellen werden Elemente als leichte Fäden oder als Coroutinen implementiert, um den OS -Overhead zu verringern, das häufig an Prozessen beteiligt ist. Abhängig vom Betriebssystem können Threads direkt vom Betriebssystem oder von einem Thread -Manager geplant werden. Coroutinen werden immer von einem Coroutine -Manager in irgendeiner Form geplant.

Normalerweise blockieren Lesen und Schreibanfragen die Operationen, was bedeutet, dass die Ausführung des Quellprozesses beim Schreiben suspendiert wird, bis alle Daten an den Zielprozess geschrieben werden können, und ebenso die Ausführung des Zielprozesses beim Lesen, wird suspendiert, bis mindestens einige der angeforderten Daten aus dem Quellprozess erhalten werden können. Dies kann nicht zu a führen Sackgasse, wo beide Prozesse auf unbestimmte Zeit aufeinander warten würden, um zu reagieren, da mindestens einer der beiden Prozesse bald danach seine Anfrage vom Betriebssystem bedient und weiter läuft.

Für die Leistung verwenden die meisten Betriebssysteme, die Rohre implementieren Puffer, die es dem Quellprozess ermöglichen, mehr Daten bereitzustellen als der Zielprozess ist derzeit in der Lage oder bereit zu empfangen. Unter den meisten Einheiten und Unix-ähnlichen Betriebssystemen ist auch ein spezieller Befehl verfügbar, der einen Rohrpuffer mit einer potenziell viel größeren und konfigurierbaren Größe implementiert, die normalerweise als "Puffer" bezeichnet wird. Dieser Befehl kann nützlich sein, wenn der Zielprozess erheblich langsamer ist als der Quellvorgang, aber es ist trotzdem gewünscht, dass der Quellvorgang seine Aufgabe so schnell wie möglich erledigen kann. Z. B. wenn der Quellprozess aus einem Befehl besteht CD und der Zielprozess besteht aus einem Befehl, der die komprimiert Wellenform Audiodaten in ein Format wie MP3. In diesem Fall würde die Pufferung der gesamten Spur in einem Rohrpuffer das CD -Laufwerk schneller nach unten drehen und dem Benutzer die CD aus dem Laufwerk entfernen, bevor der Codierungsprozess abgeschlossen ist.

Ein solcher Pufferbefehl kann mithilfe von Mitarbeitern implementiert werden Systemaufrufe zum Lesen und Schreiben von Daten. Verschwenderisch beschäftigt zu warten kann durch die Verwendung von Einrichtungen wie z. B. vermieden werden Umfrage oder auswählen oder Multithreading.

Einige bemerkenswerte Beispiele für Pipeline -Softwaresysteme sind:

  • Raftlib - C/C ++ Apache 2.0 Lizenz

VM/CMS und Z/OS

CMS -Pipelines ist ein Port der Pipeline -Idee zu VM/CMS und Z/OS Systeme. Es unterstützt viel komplexere Pipeline -Strukturen als Unix -Shells, wobei Schritte mehrere Eingangsströme erfolgen und mehrere Ausgangsströme erzeugen. (Diese Funktionalität wird vom UNIX -Kernel unterstützt, aber nur wenige Programme verwenden sie, da dies für komplizierte Syntax- und Blockierungsmodi sorgt, obwohl einige Shells sie über willkürliche Unterstützung unterstützen Dateideskriptor Abtretung).

Herkömmliche Anwendungsprogramme auf IBM Mainframe -Betriebssystemen verfügen über keine Standardeingangs- und Ausgangsströme, um eine Umleitung oder Rohrleitungen zu ermöglichen. Anstelle von Laichprozessen mit externen Programmen verfügt CMS Pipelines über einen leichten Dispatcher, der gleichzeitig Instanzen integrierter Programme für die Ausführung der Pipeline ausführt. Mehr als 200 integrierte Programme, die typische UNIX-Dienstprogramme und Schnittstellen zu Geräten und Betriebssystemdiensten implementieren. Zusätzlich zu den integrierten Programmen definiert CMS-Pipelines ein Framework, mit dem benutzerbezogene Rexx Programme mit Eingabe- und Ausgangsströmen, die in der Pipeline verwendet werden können.

Daten zu IBM -Mainframes liegen normalerweise in a Rekordorientierte Dateisystem und verbundene E/A -Geräte arbeiten eher im Datensatzmodus als im Stream -Modus. Infolgedessen werden Daten in CMS -Pipelines im Datensatzmodus behandelt. Für Textdateien enthält ein Datensatz eine Textzeile. Im Allgemeinen puffert CMS-Pipelines die Daten nicht, sondern übergibt Datensätze von Daten von einem Programm zum nächsten. Dies gewährleistet einen deterministischen Datenfluss durch ein Netzwerk miteinander verbundener Pipelines.

Objektpipelines

Neben Byte-Stream-basierten Pipelines gibt es auch Objektpipelines. In einer Objektpipeline geben die Verarbeitung von Elementen Objekte anstelle von Text aus. Windows PowerShell Enthält eine interne Objektpipeline, die überträgt .NETZ Objekte zwischen Funktionen innerhalb der PowerShell -Laufzeit. Kanäle, gefunden in der Limbo -Programmiersprache sind andere Beispiele für diese Metapher.

Pipelines in GUIs

Grafische Umgebungen wie z. RISC OS und Rox Desktop Verwenden Sie auch Pipelines. Anstatt einen Speichern zu bieten Dialogbox enthält a Dateimanager So lassen Sie den Benutzer angeben, wo a Programm Sollte Daten schreiben, liefern RISC OS und ROX ein speichernes Dialogfeld mit einem Symbol (und ein Feld, um den Namen anzugeben). Das Ziel wird von angegeben durch Ziehen und fallen das Symbol. Der Benutzer kann das Symbol überall dort fallen lassen, wo eine bereits gespeicherte Datei fallen gelassen werden kann, einschließlich auf Symbole anderer Programme. Wenn das Symbol auf das Symbol eines Programms fallen gelassen wird, wird es geladen und der Inhalt, der sonst gespeichert worden wäre, werden im Standardeingangsstrom des neuen Programms übergeben.

Zum Beispiel ein Benutzer, der die durchsucht weltweites Netz Könnte auf ein .GZ-komprimiertes Bild stoßen, das sie bearbeiten und wiederladen möchten. Mit GUI-Pipelines könnten sie den Link zu ihrem de-archiving-Programm ziehen und das Symbol ziehen, das den extrahierten Inhalt auf ihren darstellt BildbearbeiterBearbeiten Sie es, öffnen Sie den Speichern als Dialog und ziehen Sie sein Symbol auf die Hochladensoftware.

Konzeptionell könnte diese Methode mit einem herkömmlichen Dialogfeld für Speichern angewendet werden. Dies erfordert jedoch, dass die Programme des Benutzers einen offensichtlichen und leicht zugänglichen Speicherort im Dateisystem haben, auf das navigiert werden kann. In der Praxis ist dies oft nicht der Fall, daher sind GUI -Pipelines selten.

Andere Überlegungen

Der Name "Pipeline" stammt aus einer groben Analogie mit physischer Installation, da eine Pipeline normalerweise[1] Ermöglicht es, Informationen nur in eine Richtung zu fließen, wie Wasser fließt häufig in einem Rohr.

Pfeifen und Filter kann als eine Form von angesehen werden Funktionelle ProgrammierungVerwenden von Byte -Streams als Datenobjekte; Insbesondere können sie als eine bestimmte Form von gesehen werden monad zum I/o.[2]

Das Konzept der Pipeline ist auch von zentraler Bedeutung für die Kokon Web Entwicklung Rahmen oder zu jedem Xproc (Die W3C -Standards) Implementierungen, in denen ein Quellstrom vor der endgültigen Anzeige geändert werden kann.

Dieses Muster fördert die Verwendung von Textströmen als Eingabe und Ausgabe von Programmen. Diese Abhängigkeit von Text muss beim Erstellen berücksichtigt werden Grafik Shells zu Textprogrammen.

Siehe auch

Anmerkungen

  1. ^ Es gibt Ausnahmen wie "zerbrochene Rohrssignale".
  2. ^ "Monadische I/O- und Unix -Shell -Programmierung".

Externe Links