-
HINTERGRUND
-
Gebiet der Erfindung
-
Diese
Erfindung betrifft die Datenverarbeitung und insbesondere komplexe
Datenflussberechnungen.
-
Beschreibung des Stands
der Technik
-
Komplexe
Datenverarbeitungsanwendungen können
von Komponenten durch Verbinden der Ausgänge und Eingänge verschiedener
Verarbeitungsstufen durch Kommunikationskanäle (beispielsweise TCP/IP) zusammengestellt
werden. Im Allgemeinen bieten diese Kommunikationskanäle eine
begrenzte Datenpufferkapazität.
Wenn der Pufferplatz eines Kanals erschöpft ist, "blockiert" der Kanal, so dass es nicht möglich ist, zusätzliche
Daten in den Kanal zu schreiben. In den meisten Fällen ist
die Blockade harmlos, beispielsweise wenn der Ausgang eines schnellen
Programms mit dem Eingang eines langsameren Programms verbunden ist.
Unter diesen Umständen
dient die begrenzte Pufferkapazität des Kommunikationskanals
dazu, die Berechnung so zu regeln, dass das schnellere Programm
dem langsameren Programm nicht zu weit vorauseilt.
-
Unter
bestimmten Umständen
kann das Blockieren von Kanälen
jedoch zu einem als "Blockade" bezeichneten Systemfehler
führen.
Die 1 und 2 sind Datenflussdiagramme,
in denen ein einfaches Beispiel einer Kanalblockade dargestellt
ist. Es sei angenommen, dass ein erstes "vorhergehendes" Programm 100 zwei Ausgänge 101, 102 erzeugt
und ein zweites "späteres" Programm 103 zwei
Eingänge 104, 105 benötigt. Weiter
sei angenommen, dass die Ausgänge
des vorhergehenden Programms 100 durch zwei Kommunikationskanäle 106, 107 mit
den Eingängen
des späteren
Programms 103 verbunden sind.
-
Im
Laufe der Berechnung kann der folgende Satz von Umständen auftreten,
wie in 2 dargestellt ist:
- • Das vorhergehende
Programm 100 möchte
Daten an seinen ersten Ausgang 101 schreiben.
- • Das
spätere
Programm 103 möchte
Daten von seinem zweiten Eingang 105 lesen.
- • Der
erste Kommunikationskanal 106 ist voll (sein Pufferplatz
ist vollständig
gebunden).
- • Der
zweite Kommunikationskanal 107 ist leer (er enthält keine
nicht gesendeten Daten).
-
Weder
das vorhergehende Programm 100 noch das spätere Programm 103 kann
weitere Fortschritte machen, so dass die Berechnung nie abgeschlossen
wird. Diese Situation ist allgemein als eine Blockade bekannt und
wird in Zusammenhang mit dieser Erörterung als eine "Pufferblockade" bezeichnet.
-
Weil
die Möglichkeit
einer Pufferblockade zu einem Anwendungsfehler führen kann, wäre ein Verfahren
zum Verhindern von Pufferblockaden bei Datenflussberechnungen sehr
nützlich.
Die vorliegende Erfindung bietet eine Lösung für dieses Problem.
-
US 5 568 614 A beschreibt
eine Datenhandhabungsanordnung für
ein Computersystem mit einer speziellen Anwendung auf Multimediasysteme.
-
US 4 298 954 A beschreibt
eine Pufferspeichervorrichtung, die zwei Puffer aufweist, welche
zwischen empfangenden und zuführenden
Datensignalen alternieren.
-
Lau
F.C.M. u.a. "Propagating
Buffer: A New Approach to Deadlock "Freedom in Store-and-Forward Networks", IEEE ONDISC, 1991,
S. 804–807,
XP002915492 bezeichnet das Problem des Garantierens der Blockadefreiheit
in Speicher-und-Weiterleitungs-Netzwerken,
welche für
Blockaden infolge begrenzten Pufferplatzes an den Knoten anfällig sind.
-
ZUSAMMENFASSUNG
-
Diese
Erfindung betrifft eine Technik zum Verhindern von Pufferblockaden
für Datenflussberechnungen
in einem System, das mindestens einen Kommunikationskanal mit einem
Puffer aufweist, wobei die Technik den folgenden Algorithmus implementiert:
- • Jeder "spätere" Prozess mit mehr
als einem Eingang I wird mit einem Pool zusätzlichen Pufferplatzes versehen.
Gemäß einer
bevorzugten Ausführungsform
wird jedem Eingang I eine "verzögerte Eingangswarteschlange" zugeordnet, welche
sich auf eine Folge von Datenblöcken
in dem zusätzlichen
Pufferplatz beziehen kann.
- • Die
Eingänge
jedes späteren
Prozesses werden in disjunkte Eingangssätze unterteilt, so dass zwei
Eingänge
im selben Eingangssatz sind, wenn und nur wenn diese Eingänge entweder
direkt oder indirekt von einem gemeinsamen "vorhergehenden" Prozess stammen, der durch den Kommunikationskanal
mit dem späteren
Prozess verbunden ist.
- • Falls
ein späterer
Prozess Daten von einem vorhergehenden Prozess über einen Eingang I lesen muss, für den keine
Daten verfügbar
sind UND falls an irgendeinem anderen Eingang J im selben Eingangssatz Daten
verfügbar
sind, DANN liest der spätere
Prozess kontinuierlich verfügbare
Daten von jedem Eingang J und speichert diese Daten in einem zusätzlichen
Puffer, der einem solchen Eingang J entspricht, bis die verfügbaren Daten
an allen anderen Eingängen
J erschöpft
sind ODER Daten an dem gewünschten
Eingang I verfügbar
werden. Gemäß der bevorzugten
Ausführungsform
geschieht dies durch Zuordnen eines Speicherblocks von dem zusätzlichen
Puffer, Füllen
dieses Speicherblocks mit Daten und Hinzufügen des Speicherblocks zur
verzögerten
Eingangswarteschlange. Falls der zusätzliche Puffer voll wird, bricht
der spätere
Prozess ab, statt eine Blockade zu riskieren.
- • Falls
der spätere
Prozess Daten von einem Eingang I lesen muss, bei dem sich Daten
in den zusätzlichen Puffern
befinden, werden Daten von den zusätzlichen Puffern statt von
dem entsprechenden Kommunikationskanal extrahiert.
-
Die
Einzelheiten von einer oder mehreren Ausführungsformen der Erfindung
sind in der anliegenden Zeichnung und der nachstehenden Beschreibung
dargelegt.
-
BESCHREIBUNG DER ZEICHNUNG
-
Es
zeigen:
-
die 1 und 2 Datenflussdiagramme,
in denen ein einfaches Beispiel der Kanalblockade nach dem Stand
der Technik dargestellt ist,
-
die 3, 4, 5 und 6 eine
Folge von Datenflussdiagrammen, in denen eine Ausführungsform
einer Technik zum Verhindern von Pufferblockaden gemäß der Erfindung
dargestellt ist,
-
7 ein
komplexerer Datenflussgraph, auf den die Erfindung angewendet werden
kann, und
-
die 8, 9 und 10 eine
Folge von Datenflussdiagrammen, in denen eine Ausführungsform einer
Technik zum Verhindern von Pufferblockaden für mehrere Daten erzeugende
Knoten gemäß der Erfindung
dargestellt ist.
-
Gleiche
Bezugszahlen und Bezeichnungen in den verschiedenen Darstellungen
geben gleiche Elemente an.
-
DETAILLIERTE BESCHREIBUNG
-
Die 3, 4, 5 und 6 sind
eine Folge von Datenflussdiagrammen, in denen eine Ausführungsform
einer Technik zum Verhindern von Pufferblockaden gemäß der Erfindung
dargestellt ist. Pufferblockaden des in 1 dargestellten
Typs können
durch Implementieren des folgenden Algorithmus verhindert werden:
- • Jedes "spätere" Programm 103 mit
mehr als einem Eingang 104, 105 ist mit einem
Pool zusätzlichen
Puffer platzes 108 versehen, wobei es sich typischerweise
um eine Kombination von Primärspeicher
(beispielsweise RAM) und Sekundärspeicher
(beispielsweise einer Platte) handelt (3). Gemäß der bevorzugten Ausführungsform
ist jedem Eingang 104, 105 eine "verzögerte Eingangswarteschlange". 109, 110 zugeordnet,
die sich auf eine Folge von Datenspeicherblöcken in dem zusätzlichen
Pufferplatz 108 beziehen kann. Gemäß der bevorzugten Ausführungsform
sind die verzögerten
Eingangswarteschlangen 109, 110 als SILO-(FIFO)-Warteschlangen konfiguriert.
- • Falls
ein späteres
Programm 103 Daten von einem "früheren" Programm 100 über einen
Eingang 105, für den
keine Daten verfügbar
sind, lesen muss, UND falls Daten an einem oder mehreren der anderen
Eingänge 104 für das spätere Programm 103 verfügbar sind,
DANN liest das spätere
Programm 103 kontinuierlich verfügbare Daten von jedem Eingang 104 und
speichert diese Daten in entsprechenden Speicherblöcken, die
von dem zusätzlichen
Pufferplatz 108 (4) zugeordnet
wurden, bis die verfügbaren
Daten an allen anderen Eingängen 104 erschöpft sind
ODER Daten an dem gewünschten
Eingang 105 (5) verfügbar werden. Gemäß der bevorzugten
Ausführungsform
umfasst die Pufferzuordnung das Zuordnen eines Speicherblocks von
dem zusätzlichen
Pufferplatz 108, das Füllen
dieses Speicherblocks mit Daten und das Hinzufügen eines Verweises auf den
Speicherblock zur verzögerten
Eingangswarteschlange 109. Falls der zusätzliche
Pufferplatz 108 voll wird und weitere Daten gepuffert werden
müssen,
bricht das spätere
Programm 103 ab, statt eine Blockade zu riskieren.
- • Falls
das spätere
Programm 103 Daten von einem Eingang 104 lesen
muss, in dessen verzögerter
Eingangswarteschlange 109 sich Daten befinden, werden Daten
aus Speicherblöcken,
auf die die verzögerte Eingangs warteschlange 109 verweist,
statt von dem entsprechenden Kommunikationskanal 106 (6) extrahiert.
Wenn die Daten von einem Speicherblock aufgebraucht worden sind,
wird der Speicherblock zum zusätzlichen
Pufferplatz 108 zurückgeführt.
-
Wenngleich
diese Lösung
für den
einfachen Fall von zwei Programmen 100, 103 erläutert wurde,
welche durch ein Paar von Kommunikationskanälen 106, 107 verbunden
sind, gilt sie auch für
alle azyklischen Datenflussgraphen, unabhängig von der Anzahl von Kommunikationskanäle und Programme
und unabhängig von
der Komplexität
der Konnektivität
des Graphen, wobei beispielsweise auf 7 verwiesen
sei, wobei es sich um einen komplexeren Datenflussgraphen handelt,
auf den die Erfindung angewendet werden kann.
-
Ein
praktisches Problem, das bei dem vorstehend dargelegten Verfahren
auftritt, besteht darin, dass es manchmal Daten unnötig puffert,
wenn es mit mehreren Daten erzeugenden Knoten verwendet wird. Es
sei beispielsweise angenommen, dass das Beispiel in 3 erweitert
wird, wie in 8 dargestellt ist, indem ein zusätzliches
vorhergehendes Programm 111 mit einem einzigen Ausgang 112 hinzugefügt wird,
indem ein neuer Eingang 114 zu dem späteren Programm 103 hinzugefügt wird
und indem der einzige Ausgang 112 mit einem neuen Kommunikationskanal 113 mit
dem neuen Eingang 114 verbunden wird und indem eine verzögerte Eingangswarteschlange 115 gemäß dem vorstehend
erörterten
Verfahren hinzugefügt
wird. Weiterhin sei angenommen, dass das neue Programm 111 Daten
mit einer viel niedrigeren Rate erzeugt als das alte Programm 100.
-
Infolge
der Tatsache, dass das vorhergehende Doppelkanalprogramm 100 Daten
viel schneller erzeugt als das vorhergehende Einzelkanalprogramm 111,
stellt das spätere
Programm 103 häufig
fest, dass Daten an einem der Eingangskanäle 106 oder 107 von
dem schnelleren vorhergehenden Programm 100 verfügbar sind,
jedoch nicht auf dem Kanal 113 von dem langsameren vorhergehenden
Programm 111. Gemäß der vorstehend erwähnten Prozedur
verbraucht das spätere
Programm 103 die verfügbaren
Eingangsdaten auf dem Kanal 106 oder 107 und speichert
diese Daten in einer der verzögerten
Eingangswarteschlangen 109 oder 110, wie in 9 dargestellt
ist.
-
Schließlich kann
der zusätzliche
Pufferplatz 108 erschöpft
werden, wie in 10 dargestellt ist, so dass
das spätere
Programm 103, unter der Annahme, dass eine Blockade bevorsteht,
gezwungen werden kann, die Ausführung
abzubrechen. Dies ist ein unvorteilhaftes Ergebnis davon, dass der
vorstehend beschriebene Algorithmus den zusätzlichen Pufferplatz 108 verwendet,
um die Geschwindigkeitsdifferenz zwischen den Daten erzeugenden
Programmen 110 und 111 zu kompensieren, statt
eine Blockade zu verhindern.
-
Die
Lösung
dieses Problems besteht in der Erkenntnis, dass eine Blockade nur
in Fällen
möglich
ist, in denen sich zwei oder mehr Eingänge einen gemeinsamen vorhergehenden
Prozess teilen, wobei diese Differenz dazu dient, eine zu einer
Blockade neigende Berechnung (1) von einer
blockadefreien Berechnung zu unterscheiden.
-
Das
bevorzugte Verfahren zum Überwinden
dieser Umstände
ist das folgende:
- • Unterteilen der Eingänge jedes
späteren
Programms in disjunkte Teilsätze
oder Unterteilungen, so dass zwei Eingänge genau dann in derselben
Unterteilung liegen, falls sie ihre Eingabe entweder direkt oder
indirekt von einem gemeinsamen Quellenprogramm erhalten, wobei diese
Unterteilung als ein "Eingangssatz" bezeichnet sei.
- • Modifizieren
der vorstehend beschriebenen Prozedur zum Speichern von Daten in
einer verzögerten
Eingangswarteschlange, so dass sie eine Prozedur mit "umgeleitetem Eingang" aufweist: Falls
ein Programm von einem Eingang I lesen möchte, für den keine Daten verfügbar sind,
und an einem anderen Eingang J in demselben Eingangssatz Daten verfügbar sind,
muss das Programm Daten von dem Eingang J lesen und das Ergeb nis
in einer verzögerten
Eingangswarteschlange für
den Eingang J speichern.
-
Im
Fall von 8 weist das spätere Programm 103 zwei
Eingangssätze
{104, 105} und {114} auf. Es sei angenommen,
dass das spätere
Programm 103 in eine Situation gerät, in der es vom Eingang 114 lesen möchte, Daten
jedoch nur am Eingang 104 oder 105 verfügbar sind,
wie in 9 dargestellt ist. Weil die Eingänge 104 und 105 nicht
in dem gleichen Eingangssatz sind wie der Eingang 114,
werden ihre Daten nicht zu den verzögerten Eingangswarteschlangen 109 oder 110 umgeleitet,
sondern das spätere
Programm 103 wartet, bis das vorhergehende Programm 111 Daten
auf dem Kanal 113 erzeugt, und das spätere Programm 103 liest
dann diese Daten und fährt
normal fort.
-
Andererseits
sei angenommen, dass das spätere
Programm 103 vom Eingang 105 lesen möchte und Daten
am Eingang 104, jedoch nicht am Eingang 105 verfügbar sind.
In diesem Fall wird die Prozedur mit umgeleitetem Eingang infolge
der Tatsache aufgerufen, dass die Eingänge 104 und 105 im
selben Eingangssatz liegen. Die am Eingang 104 verfügbaren Daten
werden für
einen späteren
Zugriff gepuffert. Die in 3 dargestellte
Konfiguration wird auch durch die Prozedur mit umgeleitetem Eingang
abgedeckt, weil beide Eingänge 104, 105 zu
einem Eingangssatz gehören.
-
Die
Eingangssätze
können
durch einen bevorzugten Algorithmus gefunden werden. Für diesen
Algorithmus können
beliebige der wohlbekannten Verfahren zum Darstellen von Sätzen bzw.
Mengen in der Art eines Bitvektors oder einer verknüpften Liste
sowie beliebige der wohlbekannten Verfahren zum Berechnen der Vereinigung
und des Schnitts solcher Sätze
bzw. Mengen verwendet werden.
- 1. Zuordnen eines
Satzes vorhergehender Programme zu jedem Kommunikationskanal und
zu jedem Programm. Jeder solche Satz ist zunächst leer. Falls C ein Kommunikationskanal
ist, steht C.upstream für
die Programmsätze,
die C vorhergehen. Falls P ein Programm ist, steht P.upstream für die Programmsätze, die P
vorhergehen.
- 2. Zuordnen einer Liste von Eingangssätzen zu jedem Programm. Falls
P ein Programm ist, steht P.inputsets für die P zugeordneten Eingangssätze.
- 3. Erzeugen einer topologisch sortierten Liste von Programmen,
so dass, falls ein Programm P2 die von einem zweiten Programm P1
erzeugte Eingabe verbraucht, P1 vor P2 in der Liste kommt. Falls
keine solche topologisch sortierte Liste erzeugt werden kann, wird
der Algorithmus verlassen, wodurch angegeben wird, dass nicht garantiert
werden kann, dass die Berechnung blockadefrei ist.
- 4. Durchlaufen dieser Programmliste vom ersten bis zum letzten
Programm, wobei die folgenden Operationen an jedem Programm P ausgeführt werden:
- a. Erzeugen einer leeren Liste L. Jeder Eintrag von L besteht
aus einem Satz von Eingaben und einem Satz vorhergehender Programme.
L[i].inputs steht für
den Eingangssatz des i-ten Eintrags in L. L[i].upstream steht für den vorhergehenden
Programmsatz des i-ten Eintrags in L.
- b. Für
jeden der Eingänge
I von P gilt:
- i. C sei der mit I verbundene Eingangskanal.
- ii. Für
jedes Element L[i] in L gilt:
- (1) Falls der Schnitt von L[i].upstream mit C.upstream nicht
leer ist, setze L[i].upstream = L[i].upstream ∪ C.upstream, addiere I zu L[i].inputs
und setze mit dem nächsten
Eingang I fort.
- (2) Falls durch den vorstehenden Schritt kein Element L[i] identifiziert
wird, addiere ein neues Element L[i], so dass L[i].upstream = C.upstream
ist und L[i].inputs = {I}.
- c. Für
jedes Element L[i] in L setze P.inputsets = P.inputsets + L[i].inputs.
- d. Für
jeden Kommunikationskanal C, der mit einem der Eingänge von
P verbunden ist, ist P.upstream = P.upstream ∪ C.upstream.
- e. Für
jeden Kommunikationskanal C, der mit einem der Ausgänge von
P verbunden ist, ist C.upstream = P.upstream ∪ {P}.
-
Als
ein Beispiel werde auf der Grundlage der in
8 dargestellten
Konfiguration mit der Initialisierung der vorhergehenden Prozesssätze für die drei
Programme
100,
103 und
111 und für die drei
Kommunikationskanäle
106,
107,
113 begonnen.
Es wird ein Satz von Eingangssätzen
für jedes
Programm erzeugt. Hieraus ergibt sich der folgende Zustand:
-
Die
Programme werden topologisch sortiert, wodurch als eine Möglichkeit
die folgende Liste (100, 111, 103) erzeugt
wird.
-
Zuerst
wird das vorhergehende Programm
100 verarbeitet. Es hat
keine Eingänge,
so dass 100.inputsets und 100.upstream leer bleiben. Die Ausgänge des
vorhergehenden Programms
100 werden mit den Kanälen
106 und
107 verbunden,
so dass 106.upstream und 107.upstream auf {
100} gesetzt
werden. Hieraus ergibt sich der folgende Zustand:
-
Als
nächstes
wird das vorhergehende Programm
111 verarbeitet (das nächste Programm
in der topologisch sortierten Liste). Das vorhergehende Programm
111 hat
keine Eingänge,
so dass 111.inputsets leer bleibt. Das vorhergehende Programm
111 weist
einen einzigen mit dem Kanal
113 verbundenen Ausgang auf, so
dass 113.upstream = {
111} ist. Hieraus ergibt sich der
folgende Zustand:
-
Schließlich wird
das spätere
Programm 103 verarbeitet. Es liest von drei Eingängen, nämlich 104, 105, 114.
Der Algorithmus erzeugt die folgenden Schritte:
- • L wird
so initialisiert, dass es leer ist. Es sei der erste Eingang I = 104 betrachtet,
der mit dem Kanal C = 106 verbunden ist. Weil L leer ist,
existiert kein Element L[i], so dass L[i].upstream C.upstream schneidet. Demgemäß wird ein
neuer Eintrag in L erzeugt, der aus C.upstream und {I} besteht,
woraus sich L = ({100}, {104}) ergibt.
- • Als
nächstes
sei der zweite Eingang I = 105 betrachtet, der mit dem
Kanal C = 107 verbunden ist. L[1].upstream = {100}
und C.upstream = {100}. Diese beiden Sätze überlappen (tatsächlich sind
sie zufällig identisch),
so dass C.upstream zu L[1].upstream addiert wird und I zu L[1].inputs
addiert wird, so dass sich L = ({100}, {104, 105})
ergibt.
- • Schließlich wird
der dritte Eingang I = 114 betrachtet, der mit dem Kanal
C = 113 verbunden ist. C.upstream = {111}, und
kein Element L[i].upstream schneidet C.upstream, so dass ein neuer
Eintrag in I erzeugt wird, der aus C.upstream und {I} besteht. Dies
führt zu
L = ({100}, {104, 105}), ({111},
{114}).
- • Sammeln
der Eingangssätze
von L: d.h. 103.inputsets = {{104, 105}, {114}}.
- • Schließlich sei
jeder mit dem Programm 103 verbundene Eingangskanal C betrachtet
und die Vereinigung ihrer vorhergehenden Sätze berechnet. Das Ergebnis
wird in P.upstream gespeichert, d.h. 103.upstream = {100, 111}.
-
Dies
führt zu
dem folgenden Endzustand:
-
Jeder
Algorithmus, der das gleiche Ergebnis berechnet, kann verwendet
werden. Weiterhin ist es einer Person möglich, die Berechnung zu inspizieren
und Eingangssätze
manuell zuzuweisen.
-
Es
wurde eine Anzahl von Ausführungsformen
der vorliegenden Erfindung beschrieben. Dennoch ist zu verstehen,
dass verschiedene Modifikationen vorgenommen werden können. Bei spielsweise
können
andere Pufferzuordnungsschemata für die zusätzlichen Puffer verwendet werden.
Demgemäß ist zu
verstehen, dass die Erfindung nicht durch die spezifische erläuterte Ausführungsform
sondern nur durch den Schutzumfang der anliegenden Ansprüche beschränkt ist.