Pregunta

¿Qué se entiende por usar una cerca de memoria explícita?

¿Fue útil?

Solución

Para aumentar el rendimiento, las CPU modernas a menudo ejecutan 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 solo hilo de ejecución. Sin embargo, para múltiples subprocesos o entornos con memoria volátil (E / S mapeadas 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 esperado. Por ejemplo, un 'cercado completo' significa que todas las lecturas / escrituras antes de la cerca se comprometen antes que las posteriores a la cerca.

Tenga en cuenta que las vallas de memoria son un concepto de hardware. En los lenguajes de nivel superior estamos acostumbrados a lidiar con mutexes y semáforos; estos bien 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 separadas para detener el compilador que reordena sus instrucciones si eso puede causar un comportamiento no deseado (por ejemplo, el uso de la palabra clave volátil en C).

Otros consejos

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.

     

En ausencia de vallas de memoria o instrucciones de serialización, el procesador es libre de reordenar los accesos de 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 Documentación / memory-barreras.txt .

     

La mayoría de las veces, es mejor usar primitivas de bloqueo de su compilador o biblioteca estándar; estos están bien probados, deberían tener todas las barreras de memoria necesarias y probablemente estén bastante optimizados (optimizar las primitivas de bloqueo es complicado; 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ícito) para sincronizar el acceso a la memoria entre varios subprocesos.

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

Una buena introducción al problema es el " El ' El "bloqueo doblemente verificado está roto" Declaración " ;. Para muchos, fue la llamada de atención que habría 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 bloqueo y la implementación de patrones de sincronización personalizados y livianos, a menudo necesita solo la barrera, o incluso solo una barrera unidireccional.

Wikipedia lo sabe todo ...

  

Barrera de memoria, también conocida como membar   o valla de memoria, es una clase de   instrucciones que causan una central   unidad de procesamiento (CPU) para aplicar un   restricción de pedido en la memoria   operaciones emitidas antes y después del   instrucción de barrera.

     

Las CPU emplean optimizaciones de rendimiento   eso puede resultar en desorden   ejecución, incluida la carga de memoria y   operaciones de tienda. Operación de memoria   reordenar normalmente pasa desapercibido   dentro de un solo hilo de ejecución,   pero provoca un comportamiento impredecible en   programas concurrentes y controladores de dispositivos   a menos que sea cuidadosamente controlado. El exacto   la naturaleza de una restricción de pedido es   dependiente del hardware, y definido por el   modelo de memoria de la arquitectura. Algunos   arquitecturas proporcionan múltiples   barreras para hacer cumplir diferentes   restricciones de pedido.

     

Las barreras de memoria se usan típicamente   al implementar máquinas de bajo nivel   código que opera en la memoria compartida por   Múltiples dispositivos. Tal código incluye   primitivas de sincronización y   estructuras de datos sin bloqueo en   sistemas multiprocesador y dispositivo   controladores que se comunican con la computadora   hardware.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top