concurrency - ¿Qué es una valla de memoria?
memory-fences (4)
¿Qué se entiende por usar una valla de memoria explícita?
Copiando mi respuesta a otra pregunta, ¿Cuáles son algunos trucos que un procesador hace para optimizar el código? :
El más importante sería el reordenamiento de acceso a la memoria.
Sin vallas 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-barriers.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, deben tener todas las barreras de memoria necesarias y probablemente estén bastante optimizados (la optimización de las primitivas de bloqueo es complicada, incluso los expertos pueden equivocarse a veces).
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 hilos.
El problema ocurre en la combinación de compiladores agresivos modernos (tienen libertad increíble para reordenar las instrucciones, pero generalmente no saben nada de sus hilos) y CPU multinúcleo modernas.
Una buena introducción al problema es " La ''Declaración bloqueada doblemente bloqueada'' . Para muchos, fue la llamada de atención que haya dragones.
Las barreras implícitas de memoria completa generalmente se incluyen en las rutinas de sincronización de subprocesos de plataforma, que cubren el núcleo de la misma. Sin embargo, para la programación sin bloqueos y la implementación de patrones de sincronización personalizados y ligeros, a menudo solo necesita la barrera, o incluso una barrera de un solo sentido.
Para obtener mejoras en el rendimiento, las CPU modernas a menudo ejecutan las instrucciones fuera de servicio para aprovechar al máximo el silicio disponible (incluidas las lecturas / escrituras de memoria). Debido a que el hardware impone la integridad de las instrucciones, nunca se nota esto en un único hilo de ejecución. Sin embargo, para múltiples hilos o entornos con memoria volátil (E / S mapeada en memoria, por ejemplo), esto puede conducir a un comportamiento impredecible.
Una valla / barrera de memoria es una clase de instrucciones que significa que las lecturas / escrituras de memoria ocurren en el orden que usted espera. 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 mutexes y semáforos, estos pueden ser implementados usando 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 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 por separado para evitar que el compilador vuelva a ordenar sus instrucciones si eso puede causar un comportamiento no deseado (por ejemplo, el uso de la palabra clave volátil en C).
La barrera de memoria, también conocida como membar o valla de memoria, es una clase de instrucciones que hacen que una unidad de procesamiento central (CPU) imponga una restricción de ordenamiento en las operaciones de memoria emitidas antes y después de la instrucción de barrera.
Las CPU emplean optimizaciones de rendimiento que pueden dar como resultado una ejecución fuera de orden, incluidas la carga de la memoria y las operaciones de la tienda. El reordenamiento de la operación de la memoria normalmente pasa desapercibido dentro de un único hilo de ejecución, pero causa un comportamiento impredecible en los programas concurrentes y en los controladores de los dispositivos a menos que se controle cuidadosamente. La naturaleza exacta de una restricción de pedido depende del hardware y está definida por el modelo de memoria de la arquitectura. Algunas arquitecturas proporcionan múltiples barreras para aplicar diferentes restricciones de ordenamiento.
Las barreras de memoria se utilizan generalmente cuando se implementa código de máquina de bajo nivel que opera en la memoria compartida por varios dispositivos. Dicho código incluye primitivas de sincronización y estructuras de datos sin bloqueos en sistemas multiprocesador, y controladores de dispositivo que se comunican con el hardware de la computadora.