Implementieren eines 64-Bit-Atomzählers mit 32-Bit-Atomics
In eingebetteten Systemen wird ein 64-Bit-Atomzähler mit nur 32 erstellt -Bit-Atomwerte sind häufig erforderlich. Ein gängiger Ansatz besteht darin, einen Generationszähler zu nutzen, wobei das niedrigstwertige Bit als Lesesperre dient. Es stellt sich jedoch die Frage, ob es andere mögliche Methoden gibt und ob die vorgeschlagene Implementierung optimal ist.
Alternative Ansätze
Die empfohlene Implementierung ist ein praktikabler Ansatz, aber es gibt sie Zu berücksichtigende alternative Methoden:
-
SeqLock-Muster: Diese Technik verwendet eine monoton steigende Zahl Generationszählung mit abwechselnd ungeraden und geraden Werten. Die Lesegeräte drehen sich, bis die Generationszahl stabil ist und das Lesesperrbit (niederwertigstes Bit) nicht gesetzt ist. Diese Methode bietet eine verbesserte Leistung in Szenarien mit mehreren Lesern, aber nur einem einzigen Autor.
-
Direkte 64-Bit-Atomar-Operationen: Auch wenn dies weniger verbreitet ist, unterstützen einige Systeme möglicherweise 64-Bit-Atomar-Operationen nativ. In solchen Fällen kann die direkte Verwendung atomarer Operationen für beide Hälften des 64-Bit-Zählers die Notwendigkeit von Sperren oder Sequenzzählern überflüssig machen.
Designüberlegungen
Bezüglich der bereitgestellten Implementierung gibt es einige Bereiche, die optimiert werden können:
-
Atomic Read-Modify-Write (RMW) für die Generationsanzahl: Anstatt atomare RMW-Operationen für die Generationsanzahl zu verwenden, ist es möglich, reine Lade- und Speichervorgänge mit Release-Reihenfolge zu verwenden. Diese Änderung reduziert den mit RMW-Vorgängen verbundenen Overhead.
-
Atomeres Inkrement für Nutzlast: Es ist nicht erforderlich, atomares RMW für die Erhöhung der Nutzlast zu verwenden; reine Ladungen, Inkremente und Speicherungen genügen. Diese Änderung reduziert den Aufwand für die Wartung des Zählers weiter.
Zusätzliche Überlegungen
-
Anweisungen zum ARM-Ladepaar: Einige ARM-Architekturen unterstützen effiziente Ladepaaranweisungen (z. B. ldrd oder ldp), die gleichzeitig beide 32-Bit-Hälften von a laden können 64-Bit-Wert. Die Nutzung dieser Anweisungen kann die Leistung verbessern.
-
Compiler-Optimierungen: Compiler generieren möglicherweise nicht immer optimalen Code für atomare Operationen auf großen Strukturen wie uint64_t. Die Vermeidung des atomaren Zugriffs auf solche Strukturen und die Verwendung flüchtiger Schlüsselwort- und Speicherbarrieren kann zu effizienterem Code führen.
Fazit
Die vorgeschlagene Technik zum Erstellen eines 64-Bit-Atomzählers unter Verwendung von 32-Bit-Atomzählern ist insbesondere in Szenarien mit einem einzelnen Schreiber und mehreren Lesern geeignet. In bestimmten Situationen können jedoch andere Optionen wie das SeqLock-Muster oder direkte atomare 64-Bit-Operationen besser geeignet sein. Durch die Berücksichtigung der skizzierten Designüberlegungen und die Erkundung zusätzlicher Optimierungen können Programmierer die Effizienz ihrer Implementierungen weiter verbessern.
Das obige ist der detaillierte Inhalt vonWie implementiert man effizient einen 64-Bit-Atomzähler mit nur 32-Bit-Atomzählern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!