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.
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.