¿Cómo se implementan las operaciones atómicas a nivel de hardware?


Entiendo que en el nivel del lenguaje ensamblador las arquitecturas de conjunto de instrucciones proporcionan operaciones de comparación e intercambio y similares. Sin embargo, no entiendo cómo el chip es capaz de proporcionar estas garantías.

Como lo imagino, la ejecución de la instrucción debe

  1. Obtener un valor de la memoria
  2. Compare el valor
  3. Dependiendo de la comparación, posiblemente almacene otro valor en la memoria

Lo que impide que otro núcleo acceda a la memoria dirección después de la primera recuperado pero antes de que se establece el nuevo valor? ¿El controlador de memoria maneja esto?

Edit: Si la implementación de x86 es secreta, me encantaría saber cómo la implementa cualquier familia de procesadores.

Author: Alexander Duchene, 2013-02-07

4 answers

Aquí hay un artículo más en software.intel.com en eso arroja poca luz sobre los bloqueos a nivel de usuario:

Los bloqueos de nivel de usuario implican la utilización de las instrucciones atómicas de procesador para actualizar atómicamente un espacio de memoria. Las instrucciones atómicas implica utilizar un prefijo de bloqueo en la instrucción y tener el operando de destino asignado a una dirección de memoria. Los siguientes las instrucciones pueden ejecutarse atómicamente con un prefijo de bloqueo en Intel actual procesadores: ADD, ADC Y, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD y XCHG. [...] En la mayoría de las instrucciones se debe usar explícitamente un prefijo de bloqueo, excepto para la instrucción xchg donde el prefijo de bloqueo está implícito si la instrucción implica una memoria dirección.

En los días de los procesadores Intel 486, el prefijo de bloqueo utilizado para afirmar una bloqueo en el autobús junto con un gran éxito en el rendimiento. Empezando con la arquitectura Intel Pentium Pro, el bloqueo de bus se transforma en un bloqueo de caché. Un bloqueo todavía se afirma en el autobús en la mayoría de los casos arquitecturas modernas si el bloqueo reside en memoria no recuperable o si el bloqueo se extiende más allá del límite de una línea de caché que divide las líneas de caché. Ambos escenarios son poco probables, por lo que la mayoría de los prefijos de bloqueo serán transformado en un bloqueo de caché que es mucho menos costoso.

Entonces, ¿qué impide que otro núcleo acceda a la dirección de memoria? El protocolo de coherencia de caché ya gestiona el acceso derechos para las líneas de caché. Por lo tanto, si un núcleo tiene derechos de acceso exclusivos (temporales) a una línea de caché, ningún otro núcleo puede acceder a esa línea de caché. Para acceder a esa línea de caché el otro núcleo tiene que obtener derechos de acceso primero, y el protocolo para obtener esos derechos involucra al propietario actual. En efecto, el protocolo de coherencia de caché impide que otros núcleos accedan a la línea de caché en silencio.

Si el acceso bloqueado no está vinculado a una sola línea de caché, las cosas se complican más. Hay de todo tipo de casos de esquina desagradables, como accesos bloqueados sobre los límites de la página, etc. Intel no dice detalles y probablemente usan todo tipo de trucos para hacer cerraduras más rápidas.

 24
Author: Mackie Messer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 21:10:56

Un ejemplo de implementación de esto es LL/SC donde un procesador realmente tendrá instrucciones adicionales que se utilizan para completar las operaciones atómicas. En el lado de la memoria está la coherencia del caché. Uno de los protocolos de coherencia de caché más populares es el Protocolo MESI . .

 4
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 21:10:40

El controlador de memoria solo está a cargo de asegurarse de que la memoria y la caché en diferentes procesadores se mantengan consistentes - si escribe en memoria en CPU1, CPU2 no será capaz de leer algo más de su caché. No es su responsabilidad asegurarse de que ambos estén tratando de manipular los mismos datos. Hay algunas instrucciones de bajo nivel que se utilizan para el bloqueo y las operaciones atómicas. Estos se utilizan a nivel del sistema operativo para manipular pequeños trozos de memoria para crear cosas como mutexes y semáforos, estos son literalmente uno o dos bytes de memoria que necesitan tener operaciones atómicas sincronizadas realizadas en ellos. Las aplicaciones se construyen sobre esto para realizar operaciones en estructuras de datos y recursos más grandes.

 0
Author: Sean McSomething,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 18:33:17

El protocolo de coherencia de caché por sí solo no es suficiente para implementar operaciones atómicas. Digamos que quieres implementar un incremento atómico. A continuación se presentan los pasos involucrados

  1. Cargar el valor de la caché en un registro
  2. Incrementa el valor cargado en el registro
  3. Almacene el valor actualizado en la caché

Así que para implementar las 3 instrucciones anteriores de una manera atómica, primero debemos obtener acceso exclusivo a la cacheline que contiene el valor requerido. Una vez que obtengamos acceso exclusivo, no debemos renunciar al acceso exclusivo en esta línea de caché hasta que se complete la operación de "tienda". Esto significa que la CPU que ejecuta las instrucciones atómicas no debe responder a ningún mensaje de protocolo de coherencia de caché para esta línea de caché mientras tanto. Mientras que el diablo está en los detalles de cómo se implementa esto, al menos nos da un modelo mental

A continuación se muestra lo que linus torvalds mencionó sobre atómica instrucciones

Las instrucciones atómicas omiten el almacene el búfer o al menos ellos actúan como si lo hicieran-probablemente en realidad utilice el almacenador intermediario, pero lo limpian y la canalización de la instrucción antes de la carga y esperar a que drene después, y tener un bloqueo en el cacheline que toman como parte de la carga, y liberan como parte de la tienda-todo para asegurarse de que la cacheline no desaparece en el medio y que nadie más pueda ver el contenido del buffer de la tienda mientras esto va en.

 0
Author: rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-08 22:44:20