-
Die vorliegende Erfindung betrifft die Koordination paralleler Zugriffe auf einen Speicher in einem Distributed Ledger mit dem Ziel, Transaktionen, die diesen Distributed Ledger nutzen, insgesamt schneller abarbeiten zu können.
-
Stand der Technik
-
Ein Distributed Ledger ist ein dezentraler Datenspeicher, der über eine Vielzahl computerimplementierter Knoten in einem Netzwerk verteilt ist und repliziert wird. Die Knoten bilden nach einem vorgegebenen Prozedere einen gemeinsamen Konsens bezüglich Transaktionen, mit denen auf der Basis von Inhalten des Datenspeichers Arbeitsergebnisse gebildet werden, und über die Hinterlegung dieser Arbeitsergebnisse in dem Speicher. Durch den Konsensmechanismus können die Speicherinhalte insbesondere vor nachträglicher Verfälschung geschützt werden. Daher eignet sich ein Distributed Ledger beispielsweise zur manipulationssicheren Speicherung einer Buchführung über das Eigentum an Einheiten einer Kryptowährung, wie etwa Bitcoin oder Ether, oder anderer beweiserheblicher Daten.
-
Damit eine insgesamt anstehende Menge an Transaktionen möglichst schnell ausgeführt wird, ist es gewünscht, dass möglichst viele Transaktionen parallel ausgeführt werden. Ein begrenzender Faktor hierfür ist, dass Speicherbereiche, mit denen eine Transaktion gerade arbeitet, nicht durch andere Transaktionen verändert werden dürfen. Ansonsten werden die Berechnungsergebnisse falsch und nicht reproduzierbar.
-
In einem anschaulichen Beispiel soll eine erste Transaktionen einen Wert um 5 inkrementieren, und eine zweite Transaktion soll den gleichen Wert um 10 inkrementieren. Werden ausgehend von einem Wert 20 beide Transaktionen gleichzeitig ausgeführt, liefert die erste Transaktion als Ergebnis 25 (20+5), die zweite Transaktion liefert als Ergebnis 30 (20+10), und der zeitlich später erhaltene Wert ist maßgeblich. Das Ergebnis hängt also von der möglicherweise zufälligen Reihenfolge ab, in der die beiden Transaktionen auf der Hardware jeweils fertig werden. Beide möglichen Ergebnisse sind falsch; richtig wäre 35 (20+5+10).
-
Offenbarung der Erfindung
-
Im Rahmen der Erfindung wurde ein Verfahren zum Betreiben eines Netzwerks mit einer Vielzahl computerimplementierter Knoten entwickelt. Das Netzwerk ist dazu ausgebildet, einen über das Netzwerk verteilten und/oder replizierten Speicher sowie die Ausführung von Transaktionen mit Inhalten dieses Speichers zu implementieren.
-
Unter einer „Transaktion“ wird insbesondere ein abgrenzbarer Vorgang verstanden, der mit der Eingabe mindestens eines Inhalts aus dem Speicher beginnt, anschließend eine Verarbeitung dieses Inhalts (sowie optional weiterer Informationen aus beliebigen Quellen) zu einem Ergebnis beinhaltet und mit der Ausgabe dieses Ergebnisses zwecks Hinterlegung in dem Speicher endet. Dabei wird unter „abgrenzbar“ insbesondere beispielsweise verstanden, dass eine aus welchen Gründen auch immer unvollständig ausgeführte Transaktion „zurückgerollt“ werden kann, d.h., dass die Auswirkungen der unvollständig ausgeführten Transaktion auf den Speicher rückstandsfrei wieder beseitigt werden können.
-
Bei dem Verfahren wird für mindestens einen Teilbereich einer ersten Transaktion, der mit einem Lesezugriff auf mindestens eine Speicherstelle des Speichers beginnt und/oder mit einem Schreibzugriff auf mindestens eine Speicherstelle des Speichers endet, eine Menge parallel ausführbarer Instruktionen und/oder Transaktionen ermittelt. Diese parallel ausführbaren Instruktionen und/oder Transaktionen zeichnen sich dadurch aus, dass sie ebenfalls auf die mindestens eine Speicherstelle zugreifen und dennoch ohne gegenseitige Beeinflussung gleichzeitig mit dem besagten Teilbereich der ersten Transaktion ausgeführt werden können. Mindestens eine der parallel ausführbaren Instruktionen und/oder Transaktionen wird parallel mit dem Teilbereich der ersten Instruktion ausgeführt, bzw. diese Ausführung wird geplant.
-
Es wurde erkannt, dass die parallele Ausführung von Instruktionen und/oder Transaktionen, die auf ein und dieselbe Speicherstelle zugreifen, zwar zweifellos zu einer gegenseitigen Beeinflussung der jeweiligen Abläufe und der erzielten Ergebnisse führen kann, eine solche Beeinflussung jedoch nicht immer zwingend eintritt. Kombinationen von Instruktionen und/oder Transaktionen, die sich beim gemeinsamen Zugriff auf ein und dieselbe Speicherstelle nicht gegenseitig beeinflussen, lassen sich zum Einen in automatisierter Weise identifizieren. Zum Anderen kann auch der Programmierer der ersten Transaktion diese erste Transaktion von vornherein gezielt dahingehend auslegen, dass parallele anderweitige Zugriffe auf die von dieser ersten Transaktion genutzten Speicherstellen nicht zu einer gegenseitigen Beeinflussung führen. Der Programmierer kann insbesondere in der ersten Transaktion diejenigen Speicherstellen, die während der Ausführung der ersten Transaktion noch anderweitig nutzbar sind, explizit deklarieren und so die Planung einer parallelen Ausführung von möglichst vielen Transaktionen und Instruktionen unterstützen.
-
Unabhängig davon, auf welchem Wege die gemeinsam mit dem Teilbereich der ersten Transaktion parallel ausführbaren Instruktionen und/oder Transaktionen identifiziert werden, eröffnet jede solche Identifizierung eine zusätzliche Möglichkeit, eine solche parallele Ausführung zu planen bzw. auch tatsächlich vorzunehmen. Wenn also insgesamt ein vorgegebenes Pensum an Transaktionen zur Ausführung ansteht, kann dieses Pensum insgesamt schneller abgearbeitet werden.
-
Dieser Effekt wird umso größer, je komplexer jede einzelne auszuführende Transaktion ist und je länger ihre Ausführung dauert. In den Anfangstagen der Distributed Ledger-Technologie, beispielsweise in der Bitcoin-Blockchain, konnte zu jedem Zeitpunkt immer nur eine einzige Transaktion zur Ausführung geplant werden, die für die Dauer ihrer Ausführung exklusiven Zugriff auf den Speicher hatte. Für die vergleichsweise einfachen Transaktionen zur Dokumentation der Eigentumsverhältnisse an Bitcoins war dies ausreichend. Beginnend mit dem Ethereum-Netzwerk wurde jedoch die Funktionalität von Distributed Ledger-Netzwerken um die automatisierte Ausführung von „smart contracts“ erweitert, die beispielsweise das Eintreten vorher festgelegter vertraglicher Bedingungen prüfen und daraufhin automatisch Aktionen einleiten. So kann etwa ein „smart contract“ für das gemeinsame Ansparen eines Geldbetrages mittels Crowdfunding überprüfen, ob die Zielsumme erreicht ist oder aber die Frist hierfür fruchtlos verstrichen ist. Im ersteren Fall kann dann beispielsweise der Erwerb des gemeinsam zu finanzierenden Gegenstandes angestoßen werden; im letzteren Fall können alle Beteiligten automatisch ihr Geld zurückerhalten. Je mächtiger nun aber die Funktionalität ist, die im Rahmen von „smart contracts“ bereitgestellt wird, desto länger brauchen diese Funktionen zur Ausführung und desto schwieriger ist diese Ausführungsdauer planbar. Entsprechend viel Zeit kann durch die parallele Ausführung mehrerer Transaktionen eingespart werden.
-
In einer besonders vorteilhaften Ausgestaltung beinhaltet die Instruktion des Teilbereichs der ersten Transaktion für den Lesezugriff, bzw. für den Schreibzugriff, eine Angabe, die die parallel ausführbaren Instruktionen und/oder Transaktionen charakterisiert. Zu diesem Zweck kann beispielsweise der für die Programmierung von Transaktionen zur Verfügung stehende Befehlssatz um zusätzliche Instruktionen für den Lesezugriff, bzw. für den Schreibzugriff, erweitert werden, die neben dem Lesezugriff bzw. dem Schreibzugriff auf eine Speicherstelle selbst auch eine Angabe dahingehend beinhalten, welche Arten von parallelen Zugriffen auf die gleiche Speicherstelle das Ergebnis der in dem besagten Teilbereich der ersten Transaktion durchgeführten Verarbeitung nicht ändern. Damit verhält sich die erste Transaktion in der Weise „sozial“ und ressourceneffizient, dass sie eine Exklusivität des Zugriffs auf bestimmte Speicherstellen, die nicht erforderlich ist, auch nicht beansprucht.
-
Für den Programmierer der ersten Transaktion bedeutet es einen zusätzlichen Arbeitsaufwand, seinen Programmcode daraufhin zu prüfen, welche parallelen Zugriffe auf die im Rahmen der ersten Transaktion genutzten Speicherstellen zugelassen werden können. Dies gilt erst recht, wenn der Programmcode anschließend gezielt dahingehend verbessert wird, dass eine ursprünglich benötigte Exklusivität des Speicherzugriffs nicht mehr erforderlich ist. Im Betrieb des Netzwerks können entsprechende Anreize für den Programmierer gesetzt werden, diesen zusätzlichen Arbeitsaufwand zu investieren.
-
Beispielsweise können Transaktionen, in denen parallel ausführbare Instruktionen und/oder Transaktionen deklariert sind und insoweit auf Exklusivität verzichtet wird, bei der Planung, in welcher Reihenfolge anstehende Transaktionen ausgeführt werden, bevorzugt werden. So kann etwa bei der Verteilung von Transaktionen auf Blöcke, die einer Blockchain sukzessive hinzugefügt werden, jeder n-te Block zunächst nur mit Transaktionen, die auf die Exklusivität verzichtet haben, beladen und erst dann, wenn sich keine weiteren derartigen Transaktionen mehr unterbringen lassen, mit anderen Transaktionen aufgefüllt werden. Alternativ oder auch in Kombination hierzu können derartige Transaktionen bei einer Kontingentierung bzw. Bepreisung von Ressourcen einen Bonus bzw. Rabatt erhalten nach der Melodie „nur 2 Ether zahlen aber dafür die normalerweise 3 Ether kostende Priorität bei der Verteilung von Transaktionen auf Blöcke bekommen im Austausch gegen den Verzicht auf die Exklusivität“. Weiterhin kann beispielsweise die Ausführung von zu einer zweiten Transaktion gehörenden Instruktionen als parallel ausführbare Instruktionen neben einer ersten Transaktion, die auf die Exklusivität verzichtet hat, davon abhängig gemacht werden, dass auch die zweite Transaktion in gleicher Weise auf die Exklusivität verzichtet.
-
In einer weiteren besonders vorteilhaften Ausgestaltung werden eine oder mehrere Instruktionen in der ersten Transaktion durch ein Substitut ersetzt, welches das gleiche Ergebnis liefert, jedoch einen Teilbereich der ersten Transaktion bildet, zu dem es mindestens eine parallel ausführbare Instruktion und/oder Transaktion gibt. Der Programmcode der ersten Transaktion wird also automatisch dahingehend optimiert, dass es mehr Möglichkeiten gibt, parallel noch andere Instruktionen und/oder Transaktionen auszuführen. Diese Optimierung kann beispielsweise beim Kompilieren der ersten Transaktion aus Quelltext vorgenommen werden, etwa wenn der Code für einen auf der Ethereum-Blockchain auszuführenden „smart contract“ aus Quelltext in der Programmiersprache Solidity in einen auf der„Ethereum Virtual Machine‟ (EVM) ausführbaren Bytecode übersetzt wird. Die Optimierung kann aber auch beispielsweise bei der Ausführung des Programmcodes vorgenommen werden. Beispielsweise kann ein Knoten, der die Ausführung von Bytecode auf der EVM implementiert, die Optimierung direkt in dem Bytecode vornehmen und so schneller mit der Ausführung des Programmcodes fertig sein. Für eine solche Optimierung durch Knoten kann es wiederum im Betrieb des Netzwerks Anreize geben. Beispielsweise können Knoten, die in dieser Weise schneller mit der Ausführung fertig sind, einen größeren Anteil der für die Transaktionen bezahlten Gebühren zugewiesen bekommen.
-
In einer besonders vorteilhaften Ausgestaltung beginnt der Teilbereich der ersten Transaktion mit einem Lesezugriff. Die Menge der parallel mit dem Teilbereich ausführbaren Instruktionen und/oder Transaktionen beinhaltet mindestens einen Lesezugriff. Der Lesezugriff, mit dem der Teilbereich beginnt, ist dann ein Lesezugriff, der weiteres gleichzeitiges Lesen nicht blockiert („non-read-blocking read“). Andere Instruktionen und/oder Transaktionen können dann die mit dem Lesezugriff ausgelesenen Daten ebenfalls lesen unter der Bedingung, dass sie diese Daten nicht durch einen Schreibzugriff verändern.
-
Das gleichzeitige Lesen durch andere Instruktionen und/oder Transaktionen kann beispielsweise zugelassen werden, wenn der Teilbereich der ersten Transaktion Berechnungen ausführt, in deren Verlauf mehrfach auf einen Wert an einer Speicherstelle zugegriffen wird, und das Ergebnis der Berechnungen an einer anderen Speicherstelle im Speicher ablegt.
-
In einer weiteren besonders vorteilhaften Ausgestaltung beginnt der Teilbereich der ersten Transaktion mit einem Lesezugriff. Der Programmcode des Teilbereichs ist nun so beschaffen, dass das Ergebnis der weiteren Verarbeitung der gelesenen Daten innerhalb des Teilbereichs nicht beeinträchtigt wird, wenn die gelesenen Daten sich während der Ausführung des Teilbereichs an der Speicherstelle, von der sie gelesen wurden, ändern. Die Menge der parallel mit dem Teilbereich ausführbaren Instruktionen und/oder Transaktionen beinhaltet dann einen Lesezugriff und einen Schreibzugriff. Der Lesezugriff, mit dem der Teilbereich beginnt, ist dann ein kommutativer Lesezugriff. Andere Instruktionen und/oder Transaktionen dürfen die gelesenen Daten während der Ausführung des ersten Teilbereichs ändern.
-
Beispielsweise können sowohl das gleichzeitige Lesen als auch das gleichzeitige Schreiben zugelassen werden, wenn ein zu Beginn des Teilbereichs der ersten Transaktion gelesener Wert während der Ausführung dieses Teilbereichs nicht noch einmal gelesen wird. Um dies zu gewährleisten, kann der Wert beispielsweise nach dem Lesen im Kontext des Teilbereichs gepuffert werden um den Preis, dass hierfür entsprechend Arbeitsspeicher benötigt wird.
-
Dass das Ergebnis der weiteren Verarbeitung der gelesenen Daten innerhalb des Teilbereichs „nicht beeinträchtigt wird“, kann insbesondere beispielsweise bedeuten, dass sich dieses Ergebnis bei einer zwischenzeitlichen Änderung der gelesenen Daten nicht ändert. Es gibt aber auch Anwendungsfälle, in denen ein im Verlauf der Ausführung des Teilbereichs mehrfach gelesener Wert sogar zwischen diesen Lesezugriffen durch andere Transaktionen und/oder Instruktionen verändert werden darf. So kann beispielsweise die erste Transaktion länger andauernde Berechnungen umfassen, in deren Verlauf mehrfach auf sensorisch erfasste physikalische Messdaten zugegriffen wird. Wenn diese physikalischen Messdaten nun parallel zur Ausführung dieser ersten Transaktion durch weitere Transaktionen und/oder Instruktionen aktualisiert werden, ändert sich das im Rahmen der ersten Transaktion letztendlich ermittelte Ergebnis. Jedoch ist dies eine Veränderung zum Besseren, weil die jeweils aktuellsten Werte der physikalischen Messdaten genutzt werden, sobald diese verfügbar sind. Somit ist das Ergebnis nicht „beeinträchtigt“ im negativen Sinne.
-
In einer weiteren besonders vorteilhaften Ausgestaltung endet der Teilbereich der ersten Transaktion mit einem Schreibzugriff. Die Menge der parallel ausführbaren Instruktionen und/oder Transaktionen beinhaltet mindestens einen Schreibzugriff, der mit dem Schreibzugriff des Teilbereichs vertauschbar ist, ohne dass sich das mit beiden Schreibzugriffen insgesamt erzielte Endergebnis an der Speicherstelle ändert. Der Schreibzugriff des Teilbereichs ist dann ein kommutativer Schreibzugriff. Das bedeutet, dass keine der vorgesehenen Änderungen der betroffenen Speicherstelle auf die jeweils andere warten muss.
-
Ein Beispiel für einen kommutativen Schreibzugriff ist eine Addition oder Multiplikation eines an einer Speicherstelle gespeicherten Werts mit einem vorgegebenen Wert. So ist es etwa unerheblich, ob zu dem gespeicherten Wert erst 5 und 10 oder erst 10 und dann 5 addiert werden. Wenn die beiden Änderungen nicht aufeinander warten müssen, pflanzt sich eine eventuelle Verzögerung einer der Änderungen nicht unmittelbar zu einer Verzögerung der gesamten Choreographie der Transaktionen fort.
-
Dabei kann die parallele Ausführbarkeit mindestens einer Instruktion bzw. Transaktion mit dem Teilbereich der ersten Transaktion insbesondere beispielsweise zusätzlich an einen zeitlichen Zusammenhang mit der Ausführung des Teilbereichs der ersten Transaktion, und/oder mit der Ausführung einer weiteren Transaktion, gebunden sein. Hiermit kann insbesondere sichergestellt werden, dass nur solche Schreibzugriffe miteinander vertauscht werden, die zur gleichen kommutativen Gruppe oder zu miteinander kompatiblen kommutativen Gruppen gehören.
-
Wenn beispielsweise zu einem gespeicherten Wert 2 erst 5 und dann 10 addiert werden und das Ergebnis 17 anschließend mit 3 multipliziert wird, dann dürfen zwar die beiden Additionen miteinander vertauscht werden, aber es darf nicht eine Addition mit der Multiplikation vertauscht werden. Das Vertauschen von Schreibzugriffen ist also nur innerhalb der Zeitspanne zulässig, in der noch Additionen durchgeführt werden.
-
Der zeitliche Zusammenhang kann weiterhin beispielsweise beinhalten, dass die Ausführung der parallel ausführbaren Instruktion und/oder Transaktion vor dem nächsten Lesezugriff oder Schreibzugriff auf eine durch den Teilbereich der ersten Transaktion und die parallel ausführbare Instruktion und/oder Transaktion geänderte Speicherstelle abgeschlossen ist. Die parallel durchgeführten und möglicherweise miteinander vertauschten Änderungen müssen also durchgeführt sein, bevor der auf den ersten Teilbereich folgende Rest der ersten Transaktion, und/oder eine auf die erste Transaktion folgende weitere Transaktion, das nächste Mal Zugriff auf die Speicherstelle benötigt. Die Einhaltung einer derartigen zeitlichen Bedingung lässt sich mit verschiedenen Maßnahmen gewährleisten.
-
Beispielsweise kann die Ausführung einer weiteren Transaktion verzögert werden, um eine zumindest teilweise parallele Ausführung der parallel ausführbaren Instruktion und/oder Transaktion mit dem Teilbereich der ersten Transaktion zu ermöglichen. Diese Verzögerung kostet augenscheinlich zunächst einmal Zeit, kann aber dadurch überkompensiert werden, dass die parallel ausführbare Transaktion nicht erst nach der ersten Transaktion durchgeführt werden muss.
-
Sei beispielsweise die erste Transaktion eine komplexe Berechnung, die 100 ms benötigt. Der Teilbereich, zu dem eine andere Transaktion parallel ausgeführt werden kann, beginnt nach 20 ms. Wenn diese andere Transaktion genau zu diesem Zeitpunkt einsetzt und 90 ms benötigt, ist sie erst zu einem Zeitpunkt abgeschlossen, zu dem die erste Transaktion schon seit 10 ms abgeschlossen sein und eine auf die erste Transaktion folgende zweite Transaktion begonnen haben sollte. Wenn nun diese zweite Transaktion von einem Wert im Speicher abhängt, der einerseits durch den Teilbereich der ersten Transaktion und andererseits durch die parallel dazu ausgeführte Transaktion in einer an sich kommutativen Weise geändert wird, dann könnte eine solche Änderung noch kommen, während die zweite Transaktion schon läuft. Die zweite Transaktion würde dann also mit einem falschen Wert weiterrechnen. Dies kann vermieden werden, indem der Start der zweiten Transaktion um 10 ms verzögert wird. Dies ist immer noch viel schneller als auf die parallele Ausführung der anderen Transaktion zu verzichten und nach dem Ende der ersten Transaktion 90 ms auf deren Ergebnis zu warten.
-
Dabei besteht prinzipiell die Möglichkeit, dass die Ausführung der zweiten Transaktion beliebig lange aufgeschoben wird zugunsten einer Ausführung immer neuer parallel ausführbarer Transaktionen und/oder Instruktionen. Ein derartiger Eingriff in den Programmablauf lässt sich möglicherweise bewusst herbeiführen mit dem Ziel, aus dem Aufschieben der zweiten Transaktion einen wie auch immer gearteten Vorteil zu ziehen. Wenn beispielsweise mit der ersten Transaktion eine Leistung erbracht und mit der zweiten Transaktion das Entgelt für diese Leistung von einem in Kryptowährung geführten Konto eingezogen werden soll, dann kann das Aufschieben der zweiten Transaktion genutzt werden, um in dieser Zeit das Konto leerzuräumen. Der Einzug des Entgelts scheitert dann daran, dass kein Geld mehr vorhanden ist.
-
Um einen derartigen Eingriff zu unterbinden, wird in einer weiteren besonders vorteilhaften Ausgestaltung die Ausführung der verzögerten weiteren Transaktion mit zunehmender Verzögerung höher priorisiert. Wenn die solchermaßen erhöhte Priorität ein vorgegebenes Kriterium erfüllt, wird die Ausführung der verzögerten weiteren Transaktion der Ausführung neuer parallel ausführbarer Instruktionen und/oder Transaktionen vorgezogen. Beispielsweise kann die Priorität der verzögerten weiteren Transaktion exponentiell mit der Verzögerung anwachsen.
-
Die Randbedingung, dass parallel ausführbare Instruktionen und/oder Transaktionen bis zum nächsten Lesezugriff oder Schreibzugriff auf die gemeinsam geänderte Speicherstelle abgeschlossen sein sollen, kann alternativ oder auch in Kombination zur Verzögerung weiterer Transaktionen herangezogen werden, um gezielt passende parallel ausführbare Instruktionen und/oder Transaktionen auszuwählen. In dem obigen Beispiel, in dem zwischen dem Beginn des Teilbereichs der ersten Transaktion nach 20 ms und dem Ende der ersten Transaktion nach 100 ms ein Zeitraum von 80 ms zur Verfügung steht, kann parallel zu dem ersten Teilbereich etwa eine Abfolge aus zwei voneinander abhängigen Transaktionen ausgeführt werden, von denen die erste 50 ms und die zweite 30 ms dauert. Hingegen wäre die Ausführung einer parallel ausführbaren Instruktion von 70 ms Dauer nicht optimal, weil 10 ms „verschenkt“ würden.
-
Die Zeitdauer, die für die Ausführung einer parallel ausführbaren Transaktion benötigt wird, kann beispielsweise anhand einer Analyse der in dieser Transaktion enthaltenen Instruktionen ermittelt werden. Wenn die parallel ausführbare Transaktion beispielsweise eine bedingungslose Aneinanderreihung von Instruktionen umfasst, deren Ausführungsdauern jeweils bekannt sind, können diese Zeiten einfach addiert werden.
-
Die Ausführungsdauer eines beliebigen Computerprogramms, das in einer Turing-vollständigen Sprache geschrieben ist, ist nicht zuverlässig vorherzusagen. Dieses Problem ist in der Informatik als „halting problem“ bekannt. Bei der Ausführung von Transaktionen in Blockchain-Netzwerken kann jedoch Planungssicherheit geschaffen werden, indem der Transaktion ein festes Ressourcenbudget zugewiesen wird, das beispielsweise in Rechenaufwand oder Kryptowährung angegeben werden kann.
-
So hat beispielsweise im Kontext von „smart contracts“ auf der Ethereum-Blockchain jede einzelne der Instruktionen, aus denen Transaktionen zusammengesetzt sind, einen ihrem Rechenzeitbedarf entsprechenden Preis in „gas“. Wenn eine Transaktion ausgeführt wird, wird ihr ein festes Budget von „gas“ zugeteilt, das ihr Absender maximal zu bezahlen bereit ist. Wenn die Transaktion erfolgreich beendet wird und noch „gas“ übrig ist, erhält der Absender der Transaktion dieses zurück. Kommt die Transaktion jedoch nicht mit dem „gas“ aus, wird sie abgebrochen und zurückgerollt, d.h. ungeschehen gemacht. Das verbrauchte „gas“ ist dann aus Sicht des Absenders der Transaktion verloren.
-
Dieser Mechanismus stellt sicher, dass zu jeder Transaktion angegeben werden kann, wie lange die Transaktion maximal läuft, und zwar auch dann, wenn der Ressourcenhunger der Transaktion von den Eingaben abhängt, die sie erhält. Diese maximale Ausführungsdauer kann genutzt werden, um die Ausführung einer Transaktion als parallel ausführbare Transaktion neben einer ersten Transaktion zu planen.
-
Daher wird in einer weiteren besonders vorteilhaften Ausgestaltung eine Zeitdauer, die für die Ausführung der parallel ausführbaren Transaktion benötigt wird, anhand eines dieser Transaktion zugewiesenen Ressourcenbudgets, nach dessen Verbrauch die Transaktion abgebrochen und zurückgerollt wird, ermittelt.
-
Insoweit die verfügbaren Hardwareressourcen ausreichen und es inhaltlich zu keiner gegenseitigen Beeinflussung kommt, können prinzipiell beliebig viele parallel ausführbare Transaktionen gleichzeitig ausgeführt werden. Praktisch steigt jedoch mit zunehmender Anzahl dieser Transaktionen die Wahrscheinlichkeit, dass sich die Ausführung einer dieser parallel ausführbaren Transaktionen ungeplant verspätet und am Ende der von der parallelen Ausführung erhoffte Zeitvorteil dahin ist, weil auf die erste Transaktion folgende weitere Transaktionen noch auf das Endergebnis der parallelen Ausführung warten. Dies ist in etwa vergleichbar damit, dass in einer Busreisegruppe, die sich an einer Sehenswürdigkeit trennt und für die Weiterfahrt zu einem festen Zeitpunkt wieder am Bus verabredet, ab einer gewissen Gruppengröße eigentlich immer mindestens ein Teilnehmer viel zu spät am Treffpunkt ist und die ganze Gruppe warten muss.
-
Daher wird in einer weiteren besonders vorteilhaften Ausgestaltung die Anzahl der gleichzeitig mit dem Teilbereich der ersten Transaktion ausgeführten parallel ausführbaren Instruktionen und/oder Transaktionen auf einen vorgegebenen Wert begrenzt.
-
Die Bedingung für den zeitlichen Zusammenhang kommutativer Schreibzugriffe kann vorteilhaft während der Ausführung des Teilbereichs der ersten Transaktion aktualisiert werden. Auf diese Weise können möglichst viele Gelegenheiten für die parallele Ausführung zusätzlicher Instruktionen und/oder Transaktionen genutzt werden, ohne dass, wie zuvor erläutert, durch einen verspäteten Abschluss dieser zusätzlichen Instruktionen und/oder Transaktionen Verzögerungen eintreten.
-
Beispielsweise kann eine erste Transaktion, die einen iterativen Prozess beinhaltet, während einer ersten Phase, in der ein Ende noch nicht abzusehen ist, jeweils prognostizieren, dass sie noch mindestens für einen bestimmten Zeitraum (etwa 1 s) laufen wird. Dieser Zeitraum kann dann jeweils für die Ausführung parallel ausführbarer Instruktionen und/oder Transaktionen verplant werden. Wenn sich ein Konvergieren des iterativen Prozesses abzeichnet, kann die prognostizierte Restlaufzeit der ersten Transaktion deutlich verkürzt werden (etwa auf 100 ms), so dass dann nur noch deutlich kürzere parallel ausführbare Transaktionen und/oder Instruktionen eingeplant werden.
-
Insbesondere bei Transaktionen, die mit neuronalen Netzwerken oder anderen Machine Learning-Modulen arbeiten, kann das Ende an einem inhaltlichen Abbruchkriterium beispielsweise für das Erreichen eines Ziels mit einer vorgegebenen Genauigkeit hängen. Ein solches Abbruchkriterium lässt a priori keine hinreichend genaue Prognose der letztendlichen Ausführungsdauer zu, da der mit zusätzlichen Iterationen erzielte Fortschritt stark nichtlinear verlaufen kann.
-
Länger laufende Transaktionen können auch beispielsweise Zwischenergebnisse abspeichern, mit denen parallel ausführbare Instruktionen und/oder Transaktionen arbeiten können.
-
In einer weiteren besonders vorteilhaften Ausgestaltung werden die parallel ausführbaren Instruktionen und/oder Transaktionen anhand mindestens einer weiteren Randbedingung für den Inhalt der durch den Teilbereich der ersten Transaktion und die parallel ausführbare Instruktion und/oder Transaktion geänderten Speicherstelle charakterisiert. Diese Randbedingungen können beispielsweise den Typ, die Zugriffsart auf die gemeinsam mit der ersten Transaktion genutzten Speicherstellen, und/oder das Ressourcenbudget, der gesuchten parallel ausführbaren Instruktionen und/oder Transaktionen weiter einschränken. Alternativ oder in Kombination hierzu können die Randbedingungen den Kreis der parallel ausführbaren Instruktionen und/oder Transaktionen aber auch erweitern. Beispielsweise können die Randbedingungen Garantien umfassen, die Transaktionen und/oder Instruktionen über die von ihnen erzeugten Zustände von Speicherstellen geben. Auf diese Weise kann beispielsweise sichergestellt werden, dass gemeinsame Änderungen einer Variablen durch eine erste Transaktion und durch eine hierzu parallel ausgeführte Transaktion und/oder Instruktion die Variable niemals ihren zulässigen Wertebereich verlässt und es nicht beispielsweise zu einem Integer-Überlauf kommt.
-
Die Verfahren können insbesondere ganz oder teilweise computerimplementiert sein. Daher bezieht sich die Erfindung auch auf ein Computerprogramm mit maschinenlesbaren Anweisungen, die, wenn sie auf einem oder mehreren Computern ausgeführt werden, den oder die Computer dazu veranlassen, eines der beschriebenen Verfahren auszuführen. In diesem Sinne sind auch Steuergeräte für Fahrzeuge und Embedded-Systeme für technische Geräte, die ebenfalls in der Lage sind, maschinenlesbare Anweisungen auszuführen, als Computer anzusehen.
-
Ebenso bezieht sich die Erfindung auch auf einen maschinenlesbaren Datenträger und/oder auf ein Downloadprodukt mit dem Computerprogramm. Ein Downloadprodukt ist ein über ein Datennetzwerk übertragbares, d.h. von einem Benutzer des Datennetzwerks downloadbares, digitales Produkt, das beispielsweise in einem Online-Shop zum sofortigen Download feilgeboten werden kann.
-
Weiterhin kann ein Computer mit dem Computerprogramm, mit dem maschinenlesbaren Datenträger bzw. mit dem Downloadprodukt ausgerüstet sein.
-
Weitere, die Erfindung verbessernde Maßnahmen werden nachstehend gemeinsam mit der Beschreibung der bevorzugten Ausführungsbeispiele der Erfindung anhand von Figuren näher dargestellt.
-
Figurenliste
-
Es zeigt:
- 1 Ausführungsbeispiel des Verfahrens 100 zum Betreiben des Netzwerks 1;
- 2 Beispielhaftes Netzwerk 1 mit Knoten 2 und verteiltem Speicher 3;
- 3 Auswahl einer parallel ausführbaren Transaktion 43 mit passender Ausführungsdauer δ zur Erfüllung des zeitlichen Zusammenhangs 120;
- 4 Verzögerung einer Folgetransaktion 4' um eine Zeitspanne Δ zur Erfüllung des zeitlichen Zusammenhangs 120 trotz Ausführungsdauer δ.
-
1 zeigt ein Ausführungsbeispiel des Verfahrens 100 zum Betreiben eines Netzwerks 1 mit einer Vielzahl computerimplementierter Knoten 2. Das Netzwerk 1 ist in 2 näher dargestellt und dazu ausgebildet, einen über das Netzwerk 1 verteilten und/oder replizierten Speicher 3 sowie die Ausführung von Transaktionen 4 mit Inhalten dieses Speichers 3 zu implementieren. Der Speicher 3 ist in Speicherstellen 31 unterteilt.
-
In Schritt 110 wird für mindestens einen Teilbereich 41 einer ersten Transaktion 4 eine Menge parallel ausführbarer Instruktionen 42 und/oder Transaktionen 43 ermittelt, die parallel zu dem Teilbereich 41 ausgeführt werden und dabei ebenso wie der Teilbereich 41 auf eine Speicherstelle 31 zugreifen können, ohne dass es hierbei zu einer gegenseitigen Beeinflussung kommt. Diese Information kann in Schritt 140a genutzt werden, um die parallel mit dem Teilbereich 41 ausführbaren Instruktionen 42 bzw. Transaktionen 43 tatsächlich auszuführen, und/oder sie kann in Schritt 140b genutzt werden, um ebendiese Ausführung zu planen.
-
Innerhalb des Kastens 110 ist beispielhaft im Detail dargestellt, wie ausgehend von einer konkreten ersten Transaktion 4 die parallel ausführbaren Instruktionen 42 bzw. Transaktionen 43 ermittelt werden können.
-
Gemäß Block 111 kann eine Instruktion 41' des Teilbereichs 41 für einen Lesezugriff oder Schreibzugriff auf mindestens eine Speicherstelle 31 des Speichers 3 eine Angabe 42*, 43* beinhalten, die die parallel ausführbaren Instruktion 42 bzw. Transaktionen 43 charakterisiert. Hierzu kann beispielsweise der für die Programmierung der ersten Transaktion 4 verwendete Befehlssatz dahingehend erweitert sein, dass er Instruktionen für Lese- bzw. Schreibzugriffe auf Speicherstellen 31 enthält, die explizit parallele Zugriffe durch andere Instruktionen 42 bzw. Transaktionen 43 zulassen.
-
Gemäß Block 112 kann der Teilbereich 41, zu dem es parallel ausführbare Instruktionen 42 bzw. Transaktionen 43 gibt, durch eine Optimierung (etwa zum Zeitpunkt der Kompilierung oder zur Laufzeit) von Programmcode einer ersten Transaktion 4 gebildet werden, die ursprünglich exklusiven Zugriff auf die genutzten Speicherstellen 31 benötigte.
-
Gemäß Block 113 kann der Teilbereich 41 der ersten Transaktion 4 mit einem Lesezugriff beginnen. Gemäß Block 114 kann dies ein Lesezugriff sein, der paralleles Lesen auch durch andere Instruktionen 42 bzw. Transaktionen 43 zulässt.
-
Gemäß Block 115 kann der Teilbereich 41 der ersten Transaktion 4 ebenfalls mit einem Lesezugriff beginnen. Gemäß Block 116 ist nun aber die weitere Verarbeitung der gelesenen Daten innerhalb des Teilbereichs 41 resistent gegen nachträgliche Änderungen dieser Daten nach dem ersten Lesen, beispielsweise, weil nur einmal auf diese Daten zugegriffen wird oder weil die Daten im Kontext des Teilbereichs 41 zwischengespeichert werden. Daher sind gemäß Block 117 während der Ausführung des Teilbereichs 41 nun auch Schreibzugriffe auf die von dem Teilbereich genutzte Speicherstelle 41 als parallel ausführbare Instruktionen 42 bzw. Transaktionen 43 erlaubt.
-
Gemäß Block 118 kann der Teilbereich 41 mit einem Schreibzugriff enden. Dieser Schreibzugriff kann gemäß Block 119 mit Schreibzugriffen einer parallel ausführbaren Instruktion 42 bzw. Transaktion 43 vertauschbar sein, ohne dass sich das insgesamt erzielte Endergebnis an der Speicherstelle 31 ändert. Dies bewirkt, dass die Instruktion 42, bzw. die Transaktion 43, tatsächlich parallel zu dem Teilbereich 41 ausgeführt werden kann.
-
Wie zuvor erläutert, kann diese Vertauschbarkeit zeitlich begrenzt und die parallele Ausführung insoweit an einen zeitlichen Zusammenhang 120 mit der Ausführung des Teilbereichs 41 der ersten Transaktion 4, und/oder mit der Ausführung einer weiteren Transaktion 4', gebunden sein. Innerhalb des Kastens 120 sind schematisch einige Möglichkeiten aufgezeigt, worin der geforderte zeitliche Zusammenhang 120 bestehen kann und wie mit dieser Randbedingung umgegangen werden kann. Konkrete Beispiele für daraus resultierende Choreographien von Transaktionen sind in den 3 und 4 skizziert.
-
Gemäß Block 121 kann der zeitliche Zusammenhang 120 beinhalten, dass die Ausführung der parallel ausführbaren Instruktion 42 bzw. Transaktion 43 vor dem nächsten Lesezugriff oder Schreibzugriff auf die von dem Teilbereich 41 einerseits und der Instruktion 42 bzw. Transaktion 43 andererseits doppelt genutzte Speicherstelle 31 abgeschlossen ist. Mit anderen Worten, sobald eine wie auch immer geartete Weiterverarbeitung des Inhalts der Speicherstelle 31 erwarten darf, dass sich dieser Inhalt nicht mehr ändert, dann darf sich dieser Inhalt auch nicht mehr ändern.
-
Gemäß Block 122 kann die für die Ausführung der parallel ausführbaren Transaktion 43 benötigte Zeitdauer δ anhand eines der Transaktion 43 zugewiesenen Ressourcenbudgets, etwa „gas“ bei einer Ethereum-Transaktion, ermittelt werden.
-
Gemäß Block 123 kann die für die Ausführung der parallel ausführbaren Transaktion 43 benötigte Zeitdauer δ anhand einer Analyse der in dieser Transaktion 43 enthaltenen Instruktionen ermittelt werden.
-
Gemäß Block 124 kann die Anzahl der gleichzeitig mit ein und demselben Teilbereich 41 ausführbaren Instruktionen 42 und/oder Transaktionen 43 begrenzt werden, um die Wahrscheinlichkeit zu vermindern, dass es zu ungeplanten Verspätungen kommt.
-
Dies ist insbesondere vorteilhaft im Zusammenhang mit Block 125, gemäß dem die Ausführung einer weiteren Transaktion 4' verzögert wird, um eine Instruktion 42 bzw. Transaktion 43, die eigentlich im Hinblick auf den zeitlichen Zusammenhang 120 zu spät fertig würde, dennoch ausführen zu können.
-
Innerhalb des Kastens 125 ist näher dargestellt, wie in diesem Fall verhindert werden kann, dass - möglicherweise mit bösen Absichten - die Ausführung der weiteren Transaktion 4' beliebig weit aufgeschoben werden kann.
-
Gemäß Block 126 kann die Ausführung der weiteren Transaktion 4' mit zunehmender Verzögerung Δ höher priorisiert werden. Es kann dann gemäß Block 127 fortwährend überprüft werden, ob die solchermaßen erhöhte Priorität ein vorgegebenes Kriterium erfüllt. Ist dies der Fall (Wahrheitswert 1), wird die weitere Transaktion 4' ausgeführt, statt noch mehr parallel ausführbare Instruktionen 42 bzw. Transaktionen 43 auszuführen.
-
Gemäß Block 129 kann die Bedingung für den zeitlichen Zusammenhang 120 während der Ausführung des Teilbereichs 41 der ersten Transaktion (4) aktualisiert werden. Wenn der Teilbereich 41 beispielsweise eine längere iterative Berechnung ausführt, kann er auf diese Weise signalisieren, dass sich ein Konvergieren der Berechnung abzeichnet und parallel ausführbare Instruktionen 42 bzw. Transaktionen 43 bald zum Ende kommen sollten.
-
Gemäß Block 130 können die parallel ausführbaren Instruktionen 42 bzw. Transaktionen 43 auch anhand von Randbedingungen bezüglich des Inhalts der gemeinsam genutzten Speicherstellen 31 charakterisiert werden. Beispielsweise können Transaktionen und Instruktionen sich gegenseitig Garantien bezüglich der von ihnen jeweils beabsichtigten Änderungen an den Inhalten der Speicherstellen 31 geben.
-
2 zeigt ein stark vereinfachtes Beispiel eines Netzwerks 1 mit einer Vielzahl von Knoten 2. Der in Speicherstellen 31 unterteilte Speicher 3 ist über alle Knoten 2 repliziert und synchronisiert. Einige der Knoten 2 haben darüber hinaus auch noch Verarbeitungseinheiten 8, die auf die Ausführung spezieller Arten von Transaktionen spezialisiert sind. Die Speicherstellen 31 können beispielsweise mikroskopische Speicherzellen des Speichers 3 sein.
-
3 zeigt eine beispielhafte Choreographie aus einer ersten Transaktion 4, einer parallel zu einem Teilbereich 41 der ersten Transaktion 4 ausführbaren Transaktion 43 und einer Folgetransaktion 4'.
-
Der Teilbereich 41 beginnt einem Lesezugriff R auf die Speicherstelle 31 und endet mit einem Schreibzugriff W auf die gleiche Speicherstelle 31. Aus den jeweiligen Instruktionen 41' gehen Angaben 42*, 43* über die Art der jeweils zugelassenen parallelen Zugriffe auf die Speicherstelle 31 hervor. Konkret lässt hier der Lesezugriff R sowohl weitere parallele Lesezugriffe R als auch weitere parallele Schreibzugriffe W zu. Weiterhin ist der im Rahmen des Teilbereichs 41 ausgeführte Schreibzugriff W auch kommutativ. Die parallele Ausführung der Transaktion 43, die zu Beginn einen Lesezugriff R und zum Ende einen Schreibzugriff W auf die Speicherstelle 31 unternimmt, ist also prinzipiell zulässig.
-
Dabei gilt jedoch die Randbedingung 120, dass die parallel ausführbare Transaktion 43 abgeschlossen sein muss, bevor die Folgetransaktion 4' die Speicherstelle 31 mit einem Lesezugriff R ausliest. In dem in 3 gezeigten Beispiel passt die Ausführungsdauer δ der parallel ausführbaren Transaktion 43 genau zu dieser Randbedingung 120, so dass die Folgetransaktion 4' unmittelbar nach der ersten Transaktion 4 ausgeführt werden kann.
-
4 zeigt eine Abwandlung des in 3 skizzierten Beispiels. Im Unterschied zu 3 ist hier die Ausführungsdauer δ der parallel ausführbaren Transaktion 43 deutlich länger, so dass eine Verzögerung der Folgetransaktion 4' um die Zeitspanne Δ erforderlich wird, um die Transaktion 43 unterzubringen und die Randbedingung 120 zu erfüllen. Da die Zeitspanne Δ aber wesentlich kürzer ist als die Ausführungsdauer δ der parallel ausführbaren Transaktion 43, ist die gesamte in 4 sichtbare Choreographie deutlich schneller abgearbeitet als wenn die Transaktion 43 im seriellen Betrieb zwischen den Transaktionen 4 und 4' ausgeführt werden müsste.