Heim >Backend-Entwicklung >C++ >Sind x86-Ladevorgänge und -Speicher atomar?
Atomarität von Lasten und Speichern auf x86
Trotz des Eindrucks, dass Speicheroperationen in std::atomic ausschließlich auf Bussperren beruhen, sind atomare Operationen werden tatsächlich im Cache ausgeführt.
Cache Kohärenz
Cache-Kohärenz stellt sicher, dass alle Kerne eine konsistente Sicht auf den Speicher haben. Cache-Zeilen werden in atomaren Blöcken zwischen Kernen und Speicher übertragen. Dadurch können atomare Vorgänge innerhalb des Caches ausgeführt werden, ohne auf externe Bussperren angewiesen zu sein.
Ausgerichtete Vorgänge
Ausgerichtete Lade- und Speichervorgänge mit bis zu 64 Bit sind garantiert atomar auf x86-Prozessoren. Dies liegt daran, dass ausgerichtete Zugriffe über Datenpfade übertragen werden können, die breit genug sind, um den gesamten Vorgang abzudecken.
Unausgerichtete Vorgänge
Nicht ausgerichtete Lasten und Speicher können nichtatomar werden , da für den Abschluss möglicherweise mehrere Zugriffe erforderlich sind. Beispielsweise muss ein Lade- oder Speichervorgang, der eine Cache-Zeilengrenze überschreitet, in zwei separaten Zugriffen durchgeführt werden, sodass er nicht atomar ist.
Atomere Lese-, Änderungs- und Schreibvorgänge
Atomere Lese-, Änderungs- und Schreibvorgänge wie lock add [mem] und eax sind komplexer zu implementieren als einfache Lade- oder Speichervorgänge. Diese Vorgänge erfordern, dass der Kern die betroffene Cache-Zeile in einem geänderten Zustand hält und jegliche externe Änderungen verhindert, bis der Vorgang abgeschlossen ist. Nicht ausgerichtete Lese-, Änderungs- und Schreibvorgänge erfordern möglicherweise die Aktivierung des LOCK#-Signals, um den Bus zu sperren und zu verhindern, dass andere Kerne auf den betroffenen Speicher zugreifen.
Compiler-Optimierung
Compiler können Optimieren Sie seq_cst-Ladevorgänge, indem Sie die mfence-Anweisung weglassen, da die x86-Speicherreihenfolge eine Neuordnung von LoadLoad und LoadStore verhindert. Für seq_cst-Speicher sind jedoch weiterhin Zäune erforderlich, um eine Neuordnung von StoreLoad zu verhindern.
Zusammenfassend lässt sich sagen, dass die Atomizität auf x86-Prozessoren durch eine Kombination aus Cache-Kohärenz, ausgerichteten Vorgängen und Bussperren für nicht ausgerichtete Lese-, Änderungs- und Schreibvorgänge erreicht wird . Dadurch können atomare Vorgänge effizient und ohne Beeinträchtigung der Gesamtsystemleistung durchgeführt werden.
Das obige ist der detaillierte Inhalt vonSind x86-Ladevorgänge und -Speicher atomar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!