Heim >Backend-Entwicklung >C++ >Sind x86-Ladevorgänge und -Speicher atomar?

Sind x86-Ladevorgänge und -Speicher atomar?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-28 10:55:12321Durchsuche

Are x86 Loads and Stores Atomic?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn