Barrera de la memoria


Una barrera de memoria , también conocida como membar , valla de memoria o instrucción de valla , es un tipo de instrucción de barrera que hace que una unidad central de procesamiento (CPU) o compilador imponga una restricción de orden en las operaciones de memoria emitidas antes y después de la instrucción de barrera. Por lo general, esto significa que se garantiza que las operaciones emitidas antes de la barrera se realizarán antes que las operaciones emitidas después de la barrera.

Las barreras de memoria son necesarias porque la mayoría de las CPU modernas emplean optimizaciones de rendimiento que pueden resultar en una ejecución fuera de orden . Este reordenamiento de las operaciones de memoria (cargas y almacenes) normalmente pasa desapercibido dentro de un solo hilo de ejecución , pero puede causar un comportamiento impredecible en programas concurrentes y controladores de dispositivos a menos que se controle cuidadosamente. La naturaleza exacta de una restricción de ordenamiento depende del hardware y está definida por el modelo de ordenamiento 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 un 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 bloqueo en sistemas multiprocesador y controladores de dispositivos que se comunican con el hardware de la computadora .

Cuando un programa se ejecuta en una máquina con una sola CPU, el hardware realiza la contabilidad necesaria para garantizar que el programa se ejecute como si todas las operaciones de memoria se hubieran realizado en el orden especificado por el programador (orden del programa), por lo que las barreras de memoria no son necesarias. Sin embargo, cuando la memoria se comparte con varios dispositivos, como otras CPU en un sistema multiprocesador o periféricos asignados en memoria , el acceso desordenado puede afectar el comportamiento del programa. Por ejemplo, una segunda CPU puede ver los cambios de memoria realizados por la primera CPU en una secuencia que difiere del orden del programa.

Un programa se ejecuta a través de un proceso que puede ser de varios subprocesos (es decir, un subproceso de software como pthread en lugar de un subproceso de hardware). Los diferentes procesos no comparten un espacio de memoria, por lo que esta discusión no se aplica a dos programas, cada uno ejecutándose en un proceso diferente (por lo tanto, un espacio de memoria diferente). Se aplica a dos o más subprocesos (de software) que se ejecutan en un solo proceso (es decir, un solo espacio de memoria en el que varios subprocesos de software comparten un solo espacio de memoria). Varios subprocesos de software, dentro de un solo proceso, pueden ejecutarse simultáneamente en un procesador de múltiples núcleos .

El siguiente programa de varios subprocesos, que se ejecuta en un procesador de varios núcleos, ofrece un ejemplo de cómo dicha ejecución desordenada puede afectar el comportamiento del programa: