¿Qué es una valla de memoria?


Respuestas:


115

Para obtener ganancias de rendimiento, las CPU modernas a menudo ejecutan instrucciones fuera de orden para aprovechar al máximo el silicio disponible (incluidas las lecturas / escrituras de memoria). Debido a que el hardware refuerza la integridad de las instrucciones, nunca se da cuenta de esto en un solo hilo de ejecución. Sin embargo, para varios subprocesos o entornos con memoria volátil (por ejemplo, E / S mapeadas en memoria), esto puede conducir a un comportamiento impredecible.

Una valla / barrera de memoria es una clase de instrucciones que significan que las lecturas / escrituras de memoria ocurren en el orden esperado. Por ejemplo, una 'valla completa' significa que todas las lecturas / escrituras antes de la valla se realizan antes que las posteriores a la valla.

Tenga en cuenta que las vallas de memoria son un concepto de hardware. En los lenguajes de nivel superior, estamos acostumbrados a tratar con mutex y semáforos; estos pueden implementarse utilizando cercas de memoria en el nivel bajo y no es necesario el uso explícito de barreras de memoria. El uso de barreras de memoria requiere un estudio cuidadoso de la arquitectura del hardware y se encuentra más comúnmente en los controladores de dispositivos que en el código de la aplicación.

El reordenamiento de la CPU es diferente de las optimizaciones del compilador, aunque los artefactos pueden ser similares. Debe tomar medidas independientes para evitar que el compilador reordene sus instrucciones si eso puede causar un comportamiento no deseado (por ejemplo, el uso de la palabra clave volátil en C).


26
No creo que lo volátil sea suficiente para detener el reordenamiento del compilador; AFAIK, solo se asegura de que el compilador no pueda almacenar en caché el valor de la variable. El kernel de Linux usa una extensión gcc ( asm __volatile __ (""::: "memory")) para crear una barrera de optimización completa del compilador.
CesarB

5
cierto, volátil no es consciente de los subprocesos, pero puede usarlo para detener el compilador aplicando ciertas optimizaciones; esto no está relacionado con las vallas;)
Gwaredd

3
(.NET CLR) las lecturas volátiles son vallas de adquisición, las escrituras son vallas de liberación. Las operaciones entrelazadas están llenas al igual que el método MemoryBarrier.
Luke Puplett

3
Se puede encontrar una lectura interesante sobre la palabra clave volátil en .net aquí albahari.com/threading/part4.aspx#_NonBlockingSynch El sitio contiene mucha información útil sobre subprocesos en c #
Bas Smit

developerWorks tiene un buen [artículo] [1] sobre el modelo de almacenamiento de memoria PowerPC. [1]: ibm.com/developerworks/systems/articles/powerpc.html
Iouri Goussev

17

Copiando mi respuesta a otra pregunta, ¿Cuáles son algunos trucos que hace un procesador para optimizar el código? :

El más importante sería el reordenamiento del acceso a la memoria.

Sin barreras de memoria o instrucciones de serialización, el procesador puede reordenar los accesos a la memoria. Algunas arquitecturas de procesador tienen restricciones sobre cuánto pueden reordenar; Alpha es conocido por ser el más débil (es decir, el que puede reordenar más).

Se puede encontrar un muy buen tratamiento del tema en la documentación fuente del kernel de Linux, en Documentation / memory-chains.txt .

La mayoría de las veces, es mejor utilizar primitivas de bloqueo de su compilador o biblioteca estándar; estos están bien probados, deberían tener todas las barreras de memoria necesarias en su lugar y probablemente estén bastante optimizados (optimizar las primitivas de bloqueo es complicado; incluso los expertos pueden equivocarse a veces).


¿Cómo influye en el flujo del reordenamiento? Cuando dijiste Alpha is known for being the weakest, ¿por qué weakest? ¿No es mejor que reordene más, por lo que será una ejecución mucho más rápida? (No soy un usuario alfa, pero estoy preguntando sobre el efecto de very reorderingvs restricted reordering). Entonces, ¿cuáles son las desventajas del reordenamiento de lotes?
Pastor

8

En mi experiencia, se refiere a una barrera de memoria , que es una instrucción (explícita o implícita) para sincronizar el acceso a la memoria entre múltiples subprocesos.

El problema se produce en la combinación de compiladores agresivos modernos (tienen una libertad asombrosa para reordenar las instrucciones, pero generalmente no saben nada de sus subprocesos) y CPU multinúcleo modernas.

Una buena introducción al problema es la " Declaración 'El bloqueo doble verificado está roto' ". Para muchos, fue la llamada de atención para que haya dragones.

Las barreras implícitas de memoria completa generalmente se incluyen en las rutinas de sincronización de subprocesos de la plataforma, que cubren su núcleo. Sin embargo, para la programación sin bloqueos y la implementación de patrones de sincronización livianos y personalizados, a menudo solo necesita la barrera, o incluso una barrera unidireccional.


2

Wikipedia lo sabe todo ...

La barrera de memoria, también conocida como membar o valla de memoria, es una clase de instrucciones que hacen que una unidad central de procesamiento (CPU) imponga una restricción de orden en las operaciones de memoria emitidas antes y después de la instrucción de barrera.

Las CPU emplean optimizaciones de rendimiento que pueden provocar una ejecución desordenada, incluida la carga de memoria y las operaciones de almacenamiento. El reordenamiento de la operación de memoria normalmente pasa desapercibido dentro de un solo hilo de ejecución, pero causa un comportamiento impredecible en programas concurrentes y controladores de dispositivos a menos que se controle cuidadosamente. La naturaleza exacta de una restricción de orden depende del hardware y está definida por el modelo de memoria de la arquitectura. Algunas arquitecturas proporcionan múltiples barreras para hacer cumplir diferentes restricciones de ordenamiento.

Las barreras de memoria se utilizan normalmente al implementar código de máquina de bajo nivel que opera en memoria compartida por múltiples dispositivos. Dicho código incluye primitivas de sincronización y estructuras de datos sin bloqueo en sistemas multiprocesador y controladores de dispositivos que se comunican con el hardware de la computadora.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.