Was ist Transaktionsgedächtnis?

Lesezeit: 6 Minuten

Ich bin verwirrt, weil es nach dem Lesen der Wiki-Seite so aussieht, als hätte man nur ein checkValidate- und Commit-System für Lade- und Speichervorgänge. Ist der Zweck, Synchronisationsprobleme zu lösen? Handelt es sich um eine Softwareprogrammierung, die auf aktueller Hardware aufbaut, oder um eine Hardwareimplementierung über eine ISA? Was ist der Unterschied zwischen den einzelnen (HW/SW)-Implementierungen?

Vielen Dank.

Transaktionsspeicher ist das Konzept der Verwendung von Transaktionen anstelle von Sperren, um Prozesse zu synchronisieren, die parallel ausgeführt werden und Speicher gemeinsam nutzen.

Auf einer sehr vereinfachten Ebene identifizieren Sie zum Synchronisieren mit Sperren Codeabschnitte (sogenannte kritische Abschnitte), die nicht gleichzeitig von verschiedenen Threads ausgeführt werden dürfen und Sperren um die kritischen Abschnitte erwerben und freigeben. Da jede Sperre jeweils nur von einem Thread gehalten werden kann, garantiert dies, dass, sobald ein Thread in einen kritischen Abschnitt eintritt, alle Operationen des Abschnitts abgeschlossen sind, bevor ein anderer Thread in einen kritischen Abschnitt eintritt, der durch dieselben Sperren geschützt ist.

Mit dem Transaktionsspeicher können Sie stattdessen Codeabschnitte als Transaktionen kennzeichnen. Das Transaktionsspeichersystem (das in Hardware, Software oder beidem implementiert sein kann) versucht dann, Ihnen die Garantie zu geben, dass jeder Lauf eines Programms, in dem mehrere Threads Transaktionen parallel ausführen, einem anderen Lauf des Programms entspricht, in dem die Transaktionen werden alle nacheinander ausgeführt, niemals gleichzeitig.

Das Transaktionsspeichersystem tut dies, indem es Transaktionen erlaubt, parallel ausgeführt zu werden, und ihren Zugriff darauf überwacht Transaktionsvariablen. Wenn das System einen Konflikt zwischen dem Zugriff zweier Transaktionen auf dieselbe Variable erkennt, wird eine von ihnen abgebrochen und zum Anfang der laufenden Transaktion “zurückgerollt”; es wird dann die Transaktion automatisch neu starten, und der Gesamtzustand des Systems wird so sein, als ob es den früheren Lauf nie gestartet hätte.


Ein Ziel des Transaktionsspeichers ist die einfache Programmierung und Sicherheit; Ein richtig implementiertes TM-System, das in der Lage ist, zu erzwingen, dass Transaktionen korrekt verwendet werden, gibt schwer Garantien dass das Programm keine Parallelitätsfehler (Deadlocks, Race Conditions usw.) , ohne genau identifizieren zu müssen, welche Sperren benötigt werden, erwerben Sie sie in der richtigen Reihenfolge, um Deadlocks zu verhindern usw. usw. “Transaktionen werden korrekt verwendet” impliziert, dass keine Daten zwischen Threads geteilt werden, ohne Transaktionsvariablen zu durchlaufen, kein Zugriff auf Transaktionen Daten außer in Transaktionen und keine “unrollbackable” Operationen innerhalb von Transaktionen); Bibliotheksbasierte Software-Transaktionsspeichersysteme für imperative Sprachen wie C, Java usw. sind im Allgemeinen nicht in der Lage, all dies durchzusetzen, was die Möglichkeit einiger Parallelitätsfehler wieder einführen kann.

Ein weiteres Ziel des Transaktionsspeichers ist die Erhöhung der Parallelität; wenn Sie eine ganze Reihe paralleler Operationen haben, die auf eine Datenstruktur zugreifen, alle könnte schreiben, aber nur wenige tun dies tatsächlich, dann erfordert die sperrenbasierte Synchronisierung normalerweise, dass alle Operationen seriell ausgeführt werden, um die Möglichkeit einer Datenbeschädigung zu vermeiden. Der Transaktionsspeicher würde es ermöglichen, dass fast alle Operationen parallel ausgeführt werden, wobei die Parallelität nur dann verloren geht, wenn tatsächlich ein Prozess ausgeführt wird tut in die Datenstruktur schreiben.

In der Praxis (als ich vor einigen Jahren mein Honours-Projekt untersuchte) hat sich der hardwarebasierte Transaktionsspeicher nicht wirklich durchgesetzt, und aktuelle Software-Transaktionsspeichersysteme haben erhebliche Overheads. Software-Transaktionsspeicher zielt also eher auf “angemessene Leistung, die mit den verfügbaren Prozessoren mäßig gut skaliert und ziemlich einfach zu codieren ist”, anstatt Ihnen absolute Maximalleistung zu bieten.

Es gibt jedoch viele Unterschiede zwischen verschiedenen Transaktionsspeichersystemen. Ich spreche hier auf einer ziemlich abstrakten und vereinfachten Ebene.

  • Ich glaube, du übertreibst hier. TM-Algorithmen sind ebenso subtil wie traditionelle Synchronisationstechniken. Und die daraus resultierenden Fehler können ebenso unergründlich sein. In jedem Fall benötigen Sie im Allgemeinen sowieso eine funktionierende traditionelle Variante als Fallback für Transaktionskollisionen, sodass es kein kostenloses Mittagessen gibt. STM hat sich aus diesen Gründen weitgehend nicht durchgesetzt. HTM in Haswell sieht vielversprechend aus, aber mehr aus Performance-Sicht als aus Programmierfreundlichkeit.

    – Andy Roß

    29. Juni 2012 um 4:46 Uhr


  • Wie meine Programmierprojekte sind weit Da ich mehr durch die verfügbare Programmierzeit als durch die Ausführungsgeschwindigkeit eingeschränkt bin, interessiere ich mich mehr für einfache Programmiertechnologien als für Leistungstechnologien. STM-Systeme, die die Sicherheitsgarantien bieten, von denen ich spreche, existieren jetzt tatsächlich und können jetzt von mir verwendet werden.

    – Ben

    1. Juli 2012 um 4:07 Uhr

  • @AndyRoss: Was meinst du mit “am Markt gescheitert”? Das war es nie wirklich in den Markt an erster Stelle. Es ist ziemlich weit verbreitet in einigen wenigen Sprachen (Clojure und Haskell haben es eingebaut), aber im Allgemeinen ist es nicht gescheitert, weil es noch nicht wirklich in großem Umfang versucht wurde. Wenn das „auf dem Markt gescheitert“ ist, dann würde ich gerne Ihre Argumente für HTM hören, denn das wird heute noch weniger verwendet. Ein auf C implementiertes STM-System wird ziemlich nutzlos sein, ja, aber das bedeutet nicht, dass “alle STM-Implementierungen in allen Sprachen jemals zum Scheitern verurteilt sind”.

    – jalf

    13. Juli 2012 um 16:57 Uhr


  • @AndyRoss: Was Ihren ersten Kommentar betrifft, müssen Sie möglicherweise näher darauf eingehen. STM-Algorithmen sind viel einfacher zu handhaben als herkömmliche Synchronisationstechniken. Ich kann sehen, wie HTM-basierte Programmierung etwas kniffliger werden könnte, aber für STM? Ich sehe es nicht. Ich verstehe auch nicht, warum Sie einen “traditionellen” Fallback benötigen würden. Jede einigermaßen gut gestaltete STM-Implementierung wird dies nicht benötigen. Ich vermute das Problem ist das Weil STM nicht noch verstanden, was wir darunter verstehen, unterscheidet sich ziemlich. Sie denken offensichtlich an einige der schrecklichen Low-Tech-C-Implementierungen, mit denen … es mühsam ist, damit zu arbeiten

    – jalf

    13. Juli 2012 um 17:05 Uhr

  • Aber STM kann gemacht werden viel besser, das scheint das zu sein, was Ben und ich im Sinn haben.

    – jalf

    13. Juli 2012 um 17:05 Uhr

Auf der Implementierungsebene ist der Transaktionsspeicher Teil der Cache-Schicht. Es ermöglicht der Software, einige Operationen im Speicher “auszuprobieren” und sie später nur dann “festzuschreiben”, wenn kein anderer Multiprozessor im System einen der gelesenen oder geschriebenen Speicher geändert hat. In sehr parallelen SMP-Umgebungen, in denen die meisten Zugriffe nicht kollidieren, kann dies schneller sein, als wenn alle Threads die gleichen (sehr umkämpften) Synchronisationsprimitiven sperren.

Dies erschwert jedoch die Aufgabe des Anwendungsprogrammierers, da die Software in der Lage sein muss, die Transaktion wiederherzustellen (“Rollback”), wenn die Übergabe fehlschlägt.

Von dem gcc-Wiki:

In general, implementations come in two forms: a Software Transactional Memory 
(STM) system uses locks or other standard atomic instructions to do its job. 
A Hardware Transactional Memory (HTM) system uses multi-word synchronization 
operations of the CPU to implement the requirements of the transaction directly 
(e.g., see the Rock processor). Because most HTM systems are likely to be best
 effort facilities (i.e., not all transactions can be executed using HTM), 
practical TM implementations that incorporate HTM also have a STM component 
and are thus termed Hybrid Transactional Memory systems. 

1282690cookie-checkWas ist Transaktionsgedächtnis?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy