it-swarm.com.de

Was ist ein Erinnerungszaun?

Was bedeutet die Verwendung eines expliziten Speicherbereichs?

103
yesraaj

Um die Leistung zu verbessern, führen moderne CPUs Befehle häufig außerhalb der angegebenen Reihenfolge aus, um das verfügbare Silizium optimal zu nutzen (einschließlich Lese-/Schreibzugriff auf den Arbeitsspeicher). Da die Hardware die Integrität der Anweisungen erzwingt, wird dies in einem einzelnen Ausführungsthread nie bemerkt. Bei mehreren Threads oder Umgebungen mit flüchtigem Speicher (z. B. speicherzugeordnete E/A) kann dies jedoch zu unvorhersehbarem Verhalten führen.

Ein Speicherzaun/eine Speicherbarriere ist eine Befehlsklasse, bei der Lese-/Schreibvorgänge im Speicher in der von Ihnen erwarteten Reihenfolge ausgeführt werden. Beispielsweise bedeutet ein "vollständiger Zaun", dass alle Lese-/Schreibvorgänge vor dem Zaun vor denen nach dem Zaun ausgeführt werden.

Beachten Sie, dass Speicherzäune ein Hardwarekonzept sind. In höheren Programmiersprachen sind wir es gewohnt, mit Mutexen und Semaphoren umzugehen. Möglicherweise werden diese mithilfe von Speicherzäunen auf niedriger Ebene implementiert, und die explizite Verwendung von Speicherbarrieren ist nicht erforderlich. Die Verwendung von Speicherbarrieren erfordert ein sorgfältiges Studium der Hardwarearchitektur und ist in Gerätetreibern häufiger anzutreffen als in Anwendungscode.

Die CPU-Neuordnung unterscheidet sich von Compiler-Optimierungen - obwohl die Artefakte ähnlich sein können. Sie müssen separate Maßnahmen ergreifen, um zu verhindern, dass der Compiler Ihre Anweisungen neu anordnet, wenn dies zu unerwünschtem Verhalten führen kann (z. B. Verwendung des flüchtigen Schlüsselworts in C).

99
Gwaredd

Kopieren von meine Antwort auf eine andere Frage, Was sind einige Tricks, die ein Prozessor ausführt, um den Code zu optimieren? :

Das wichtigste wäre die Neuordnung des Speicherzugriffs.

Ohne Speicherzäune oder Serialisierungsanweisungen kann der Prozessor die Speicherzugriffe neu anordnen. Einige Prozessorarchitekturen haben Einschränkungen hinsichtlich der Nachbestellbarkeit. Alpha ist bekanntermaßen das schwächste (d. H. Dasjenige, das am meisten umordnen kann).

Eine sehr gute Behandlung des Themas finden Sie in der Linux-Kernel-Quelldokumentation unter Documentation/memory-barriers.txt .

In den meisten Fällen empfiehlt es sich, Sperrprimitive aus Ihrem Compiler oder Ihrer Standardbibliothek zu verwenden. Diese sind gut getestet, sollten über alle erforderlichen Speicherbarrieren verfügen und sind wahrscheinlich ziemlich optimiert (die Optimierung von Sperrprimitiven ist schwierig; selbst die Experten können sie manchmal falsch verstehen).

15
CesarB

Nach meiner Erfahrung bezieht es sich auf eine Speicherbarriere , die eine Anweisung (explizit oder implizit) zum Synchronisieren des Speicherzugriffs zwischen mehreren Threads ist.

Das Problem tritt in der Kombination von modernen, aggressiven Compilern (sie haben eine erstaunliche Freiheit, Anweisungen neu zu ordnen, kennen aber normalerweise nichts von Ihren Threads) und modernen Multicore-CPUs auf.

Eine gute Einführung in das Problem ist die " Die Erklärung 'Double-Checked Locking is Broken' ". Für viele war es der Weckruf, dass es Drachen gibt.

Implizite vollständige Speicherbarrieren sind normalerweise in Routinen zur Plattform-Thread-Synchronisierung enthalten, die den Kern davon abdecken. Für das sperrenfreie Programmieren und Implementieren von benutzerdefinierten, einfachen Synchronisationsmustern benötigen Sie jedoch häufig nur die Barriere oder sogar nur eine Einweg-Barriere.

6
peterchen

Wikipedia kennt alle ...

Memory Barrier, auch Membar oder Memory Fence genannt, ist eine Befehlsklasse, die eine Zentraleinheit (CPU) veranlasst, eine Ordnungsbeschränkung für Speicheroperationen durchzusetzen, die vor und nach dem Barrier-Befehl ausgegeben werden.

CPUs verwenden Leistungsoptimierungen, die zu einer nicht ordnungsgemäßen Ausführung führen können, einschließlich Speicherlade- und Speicheroperationen. Die Neuordnung von Speicheroperationen bleibt normalerweise innerhalb eines einzelnen Ausführungsthreads unbemerkt, führt jedoch zu unvorhersehbarem Verhalten bei gleichzeitigen Programmen und Gerätetreibern, sofern dies nicht sorgfältig gesteuert wird. Die genaue Art einer Ordnungsbeschränkung ist hardwareabhängig und wird durch das Speichermodell der Architektur definiert. Einige Architekturen bieten mehrere Barrieren für die Durchsetzung unterschiedlicher Ordnungsbeschränkungen.

Speicherbarrieren werden in der Regel verwendet, wenn Computercode auf niedriger Ebene implementiert wird, der mit Speicher arbeitet, der von mehreren Geräten gemeinsam genutzt wird. Zu diesem Code gehören Synchronisationsprimitive und sperrenfreie Datenstrukturen auf Multiprozessorsystemen sowie Gerätetreiber, die mit Computerhardware kommunizieren.

1
Omar Kooheji