Pipeline (Software) - Pipeline (software)

In Software - Engineering , eine Rohrleitung besteht aus einer Kette von Verarbeitungselementen ( Prozesse , Threads , Koroutinen , Funktionen , usw. ), so angeordnet, dass das Ausgangssignal jeden Elements ist der Eingang der nächsten; Der Name entspricht einer physischen Pipeline . Normalerweise wird zwischen aufeinanderfolgenden Elementen eine gewisse Pufferung bereitgestellt. Die Informationen, die in diesen Pipelines fließen, sind häufig ein Strom von Datensätzen , Bytes oder Bits , und die Elemente einer Pipeline können als Filter bezeichnet werden . Dies wird auch als Entwurfsmuster für Rohre und Filter bezeichnet . Das Verbinden von Elementen mit einer Pipeline entspricht der Funktionszusammensetzung .

Im engeren Sinne ist eine Pipeline linear und einseitig, obwohl der Begriff manchmal auf allgemeinere Flüsse angewendet wird. Beispielsweise kann eine hauptsächlich in eine Richtung gerichtete Pipeline eine Kommunikation in der anderen Richtung aufweisen, die als Rückkanal oder Rückkanal bekannt ist, wie beim Lexer-Hack , oder eine Pipeline kann vollständig bidirektional sein. Flüsse mit einseitigem Baum und gerichteten azyklischen Graphentopologien verhalten sich ähnlich wie (lineare) Pipelines - das Fehlen von Zyklen macht sie einfach - und können daher lose als "Pipelines" bezeichnet werden.

Implementierung

Pipelines werden häufig in einem Multitasking- Betriebssystem implementiert , indem alle Elemente gleichzeitig mit Prozessen gestartet werden und die Datenleseanforderungen jedes Prozesses automatisch mit den vom Upstream-Prozess geschriebenen Daten bearbeitet werden. Dies kann als multiprozessierte Pipeline bezeichnet werden. Auf diese Weise wird die CPU vom Scheduler natürlich zwischen den Prozessen umgeschaltet , um ihre Leerlaufzeit zu minimieren. In anderen gängigen Modellen werden Elemente als Lightweight-Threads oder als Coroutinen implementiert, um den Betriebssystemaufwand zu reduzieren, der häufig mit Prozessen verbunden ist. Je nach 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 Lese- und Schreibanforderungen Operationen, was bedeutet, dass die Ausführung des Quellprozesses beim Schreiben ausgesetzt wird, bis alle Daten in den Zielprozess geschrieben werden konnten, und ebenso die Ausführung des Zielprozesses beim Lesen. wird ausgesetzt, bis mindestens ein Teil der angeforderten Daten aus dem Quellprozess abgerufen werden konnte. Dies kann nicht zu einem Deadlock führen , bei dem beide Prozesse auf unbestimmte Zeit auf ihre Antwort warten würden, da mindestens einer der beiden Prozesse seine Anforderung bald darauf vom Betriebssystem bedienen und weiter ausführen wird.

Aus Gründen der Leistung verwenden die meisten Betriebssysteme, die Pipes implementieren, Pipe- Puffer , mit denen der Quellprozess mehr Daten bereitstellen kann, als der Zielprozess derzeit empfangen kann oder will. Unter den meisten Unices und Unix-ähnlichen Betriebssystemen ist auch ein spezieller Befehl verfügbar, der einen Pipe-Puffer mit möglicherweise viel größerer und konfigurierbarer Größe implementiert, der normalerweise als "Puffer" bezeichnet wird. Dieser Befehl kann nützlich sein, wenn der Zielprozess erheblich langsamer als der Quellprozess ist. Es ist jedoch dennoch erwünscht, dass der Quellprozess seine Aufgabe so schnell wie möglich ausführen kann. Wenn der Quellprozess beispielsweise aus einem Befehl besteht, der eine Audiospur von einer CD liest, und der Zielprozess aus einem Befehl besteht, der die Wellenform- Audiodaten in ein Format wie MP3 komprimiert . In diesem Fall würde das Puffern des gesamten Titels in einem Pipe-Puffer ein schnelleres Herunterfahren des CD-Laufwerks ermöglichen und es dem Benutzer ermöglichen, die CD aus dem Laufwerk zu entfernen, bevor der Codierungsprozess abgeschlossen ist.

Ein solcher Pufferbefehl kann unter Verwendung von Systemaufrufen zum Lesen und Schreiben von Daten implementiert werden . Verschwenderisches Warten kann durch die Verwendung von Funktionen wie Poll oder Select oder Multithreading vermieden werden .

Einige bemerkenswerte Beispiele für Pipeline-Softwaresysteme sind:

VM / CMS und z / OS

CMS Pipelines ist ein Port der Pipeline-Idee zu VM / CMS- und z / OS- Systemen. Es unterstützt viel komplexere Pipeline-Strukturen als Unix-Shells, wobei Schritte mehrere Eingabestreams ausführen und mehrere Ausgabestreams erzeugen. (Diese Funktionalität wird vom Unix-Kernel unterstützt, aber nur wenige Programme verwenden sie, da sie komplizierte Syntax- und Blockierungsmodi ermöglicht, obwohl einige Shells sie über eine beliebige Dateideskriptorzuweisung unterstützen .)

Herkömmliche Anwendungsprogramme auf IBM Mainframe-Betriebssystemen verfügen über keine Standardeingabe- und -ausgabestreams, die eine Umleitung oder Weiterleitung ermöglichen. Anstatt Prozesse mit externen Programmen zu erzeugen, verfügt CMS Pipelines über einen kompakten Dispatcher, mit dem Instanzen integrierter Programme gleichzeitig ausgeführt werden können, um die Pipeline auszuführen. Mehr als 200 integrierte Programme, die typische UNIX-Dienstprogramme implementieren und eine Schnittstelle zu Geräten und Betriebssystemdiensten herstellen. Zusätzlich zu den integrierten Programmen definiert CMS Pipelines ein Framework, um benutzerdefinierte REXX- Programme mit Eingabe- und Ausgabestreams zu ermöglichen, die in der Pipeline verwendet werden können.

Daten auf IBM Mainframes befinden sich normalerweise in einem aufzeichnungsorientierten Dateisystem, und angeschlossene E / A-Geräte arbeiten im Aufzeichnungsmodus und nicht im Stream-Modus. Infolgedessen werden Daten in CMS-Pipelines im Aufzeichnungsmodus verarbeitet. Bei Textdateien enthält ein Datensatz eine Textzeile. Im Allgemeinen puffert CMS Pipelines die Daten nicht, sondern übergibt Datensätze in einem Sperrschritt von einem Programm zum nächsten. Dies stellt einen deterministischen Datenfluss durch ein Netzwerk miteinander verbundener Pipelines sicher.

Objektpipelines

Neben Byte-Stream-basierten Pipelines gibt es auch Objekt-Pipelines. In einer Objektpipeline geben Verarbeitungselemente Objekte anstelle von Text aus. Windows PowerShell enthält eine interne Objektpipeline, die .NET- Objekte zwischen Funktionen innerhalb der PowerShell-Laufzeit überträgt . Kanäle in der Programmiersprache Limbo sind weitere Beispiele für diese Metapher.

Pipelines in GUIs

Grafische Umgebungen wie RISC OS und ROX Desktop verwenden ebenfalls Pipelines. Anstatt ein Dialogfeld zum Speichern mit einem Dateimanager bereitzustellen , in dem der Benutzer angeben kann, wo ein Programm Daten schreiben soll, stellen RISC OS und ROX ein Dialogfeld zum Speichern bereit, das ein Symbol (und ein Feld zur Angabe des Namens) enthält. Das Ziel wird durch Ziehen und Ablegen des Symbols festgelegt. Der Benutzer kann das Symbol überall dort ablegen, wo eine bereits gespeicherte Datei abgelegt werden kann, einschließlich auf Symbolen anderer Programme. Wenn das Symbol auf das Symbol eines Programms abgelegt wird, wird es geladen und der Inhalt, der sonst gespeichert worden wäre, wird in den Standardeingabestream des neuen Programms übergeben.

Beispielsweise kann ein Benutzer, der im Internet surft, auf ein komprimiertes .gz-Bild stoßen, das er bearbeiten und erneut hochladen möchte. Mithilfe von GUI-Pipelines können sie den Link zu ihrem Entarchivierungsprogramm ziehen, das Symbol für den extrahierten Inhalt in ihren Bildeditor ziehen , es bearbeiten, das Dialogfeld Speichern unter öffnen und das Symbol in ihre Upload-Software ziehen.

Konzeptionell könnte diese Methode mit einem herkömmlichen Dialogfeld zum Speichern verwendet werden. Dies würde jedoch erfordern, dass die Programme des Benutzers einen offensichtlichen und leicht zugänglichen Speicherort im Dateisystem haben, zu dem navigiert werden kann. In der Praxis ist dies häufig nicht der Fall, sodass GUI-Pipelines selten sind.

Andere Überlegungen

Der Name "Pipeline" stammt aus einer groben Analogie zu physischen Rohrleitungen, bei der eine Pipeline normalerweise zulässt, dass Informationen nur in eine Richtung fließen, so wie Wasser häufig in einem Rohr fließt.

Pipes und Filter können als eine Form der funktionalen Programmierung betrachtet werden , bei der Byte-Streams als Datenobjekte verwendet werden. Insbesondere können sie als eine bestimmte Form der Monade für E / A angesehen werden .

Das Konzept der Pipeline ist auch von zentraler Bedeutung für den Cocoon - Web - Entwicklung Rahmen oder einen XProc (W3C Standards) Implementierungen, in denen es eine Quelle Strom ermöglicht , bevor eventuelle Anzeige geändert werden.

Dieses Muster fördert die Verwendung von Textströmen als Eingabe und Ausgabe von Programmen. Diese Abhängigkeit von Text muss bei der Erstellung von Grafik- Shells für Textprogramme berücksichtigt werden.

Siehe auch

Anmerkungen

  1. ^ Es gibt Ausnahmen, wie z. B. "Rohrbruch" -Signale.
  2. ^ "Monadic I / O- und UNIX-Shell-Programmierung" .

Externe Links