Was ist Transaktionsspeicher?

7

Ich bin verwirrt, weil es beim Lesen der Wiki-Seite so aussieht, als hätte man einfach ein checkValidate- und Commit-System für Ladungen und Speicher. Ist der Zweck, Synchronisationsprobleme zu lösen? Ist es eine Softwareprogrammierung, die auf aktueller Hardware aufbaut, oder ist es eine Hardwareimplementierung über eine ISA? Was ist der Unterschied zwischen jeder Implementierung (HW / SW)?

Danke.

    
JDS 29.06.2012, 03:23
quelle

3 Antworten

23

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 zur Synchronisierung mit Sperren Abschnitte des Codes (genannt kritische Abschnitte ), die nicht gleichzeitig von verschiedenen Threads ausgeführt werden dürfen und Sperren um die kritischen Abschnitte herum erfassen und freigeben. Da jede Sperre nur von jeweils einem Thread gehalten werden kann, ist gewährleistet, dass nach dem Eintreten eines Threads in einen kritischen Abschnitt alle Operationen des Abschnitts abgeschlossen sind, bevor ein anderer Thread in einen kritischen Bereich gelangt, der durch die gleiche (n) Sperre (n) geschützt ist.

Mit dem Transaktionsspeicher können Sie Codeabschnitte als Transaktionen festlegen. Das transaktionale Speichersystem (das in Hardware, Software oder beidem implementiert werden 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 nacheinander ausgeführt, niemals gleichzeitig.

Das transaktionale Speichersystem ermöglicht dies, indem Transaktionen parallel ausgeführt werden und ihr Zugriff auf Transaktionsvariablen überwacht wird. Wenn das System einen Konflikt zwischen dem Zugriff zweier Transaktionen auf dieselbe Variable feststellt, wird einer von ihnen den Vorgang abbrechen und an den Anfang der ausgeführten Transaktion "zurückrollen". Die Transaktion wird dann automatisch neu gestartet und der Gesamtzustand des Systems wird so aussehen, als hätte es den vorherigen Lauf nie gestartet.

Ein Ziel des Transaktionsspeichers ist die einfache Programmierung und Sicherheit; Ein korrekt implementiertes TM-System, das die korrekte Verwendung von Transaktionen erzwingt, gibt harte Garantien , dass es im Programm keine Parallelitätsfehler (Deadlocks, Race Conditions usw.) gibt und nur vom Programmierer festgelegt werden muss die Transaktionen (und manchmal Transaktionsvariablen, wenn das System nicht nur den gesamten Speicher implizit als Transaktionsvariablen betrachtet), ohne genau zu identifizieren, welche Sperren benötigt werden, erfassen Sie sie in der richtigen Reihenfolge, um Deadlocks usw. zu vermeiden. "Transacitons werden korrekt verwendet" impliziert, dass es keine gemeinsame Nutzung von Daten zwischen Threads ohne Transaktionsvariablen, keinen Zugriff auf Transaktionsdaten außer Transaktionen und keine "nicht rückrechenbaren" Operationen in Transaktionen gibt; Bibliotheksbasierte Softwaretransaktionsspeichersysteme für imperative Sprachen wie C, Java usw. sind im Allgemeinen nicht in der Lage, all dies zu erzwingen, was die Möglichkeit einiger der Parallelitätsfehler wieder einführen kann.

Ein weiteres Ziel des Transaktionsgedächtnisses ist die zunehmende Parallelität; Wenn Sie eine ganze Reihe von parallelen Operationen haben, die auf eine Datenstruktur zugreifen, die alle in schreiben können, aber nur wenige davon, erfordert die lockbasierte Synchronisation typischerweise, dass alle Operationen seriell ausgeführt werden um die Gefahr von Datenkorruption zu vermeiden. Der Transaktionsspeicher würde es ermöglichen, dass fast alle Operationen parallel ablaufen und nur dann die Parallelität verloren geht, wenn ein Prozess tatsächlich in die Datenstruktur schreibt.

In der Praxis (seit ich vor ein paar Jahren mein Honours-Projekt recherchiert habe) hat sich der hardwarebasierte Transaktionsspeicher nicht wirklich durchgesetzt, und aktuelle Softwaretransaktionsspeichersysteme haben erhebliche Gemeinkosten. Daher ist das Software-Transaktions-Gedächtnis eher auf "eine angemessene Leistung ausgerichtet, die sich moderat gut mit den verfügbaren Prozessoren skalieren lässt und ziemlich einfach zu programmieren ist", anstatt Ihnen absolute maximale Leistung zu geben.

Es gibt jedoch eine große Variabilität zwischen verschiedenen Transaktionsspeichersystemen; Ich spreche hier auf einer ziemlich abstrakten und vereinfachten Ebene.

    
Ben 29.06.2012 04:36
quelle
3

Auf der Implementierungsebene ist Transaktionsspeicher Teil der Cache-Schicht. Es erlaubt der Software, einige Operationen im Speicher zu "versuchen" und sie dann später zu "committen", wenn keine anderen Multiprozessoren im System irgendeinen Speicher geändert haben, der gelesen oder geschrieben wurde. In sehr parallelen SMP-Umgebungen, in denen die meisten Zugriffe nicht kollidieren, kann dies schneller sein als wenn alle Threads die gleichen (stark beanspruchten) Synchronisationsprimitiven sperren.

Dies macht jedoch die Aufgabe des Anwendungsprogrammierers schwieriger, da die Software in der Lage sein muss, die Transaktion wiederherzustellen ("Rollback"), wenn die Übertragung fehlschlägt.

    
Andy Ross 29.06.2012 03:32
quelle
3

Aus dem gcc Wiki:

%Vor%     
starbolin 29.06.2012 03:57
quelle

Tags und Links