Operación atómica

Operación atómica ( griego άτομος  - indivisible) - una operación  que se realiza por completo o no se realiza en absoluto; una operación que no puede ser parcialmente realizada y parcialmente no realizada.

Este artículo describe las operaciones atómicas más simples (lectura, escritura, etc.), aunque el término puede referirse a operaciones de nivel superior, como, por ejemplo, una serie de consultas al DBMS dentro de una sola transacción .

Las operaciones atómicas se utilizan en computadoras multiprocesador y en sistemas operativos multitarea para brindar acceso a múltiples procesos y/o múltiples subprocesos del mismo proceso a los recursos compartidos entre ellos. Una operación atómica es realizada por un solo hilo .

Clasificación

La atomicidad de las operaciones puede ser proporcionada por hardware (hardware) y software (código de programa). En el primer caso, se utilizan instrucciones de máquina especiales , cuya atomicidad está garantizada por el hardware. En el segundo caso, se utilizan herramientas especiales de software de sincronización , con la ayuda de las cuales se bloquea el recurso compartido ; después del bloqueo, se realiza la operación que debe hacerse atómicamente. Un bloqueo es una operación atómica que otorga un recurso a un subproceso o le dice al subproceso que el recurso ya está en uso por otro subproceso o proceso (ocupado).

Instrucciones de montaje y atomicidad

Instrucciones de máquina, cuya ejecución siempre puede considerarse atómica:

Instrucciones de máquina que no son atómicas:

Instrucciones atómicas para procesadores x86

Instrucciones atómicas para procesadores de arquitectura x86 :

Además, muchas instrucciones de máquina de lectura, modificación y escritura se ejecutan atómicamente cuando tienen el prefijo LOCK [4] ( código de operación 0xF0), como las siguientes:

El prefijo LOCK bloquea el acceso a la memoria mientras dura la instrucción. Un bloqueo puede extenderse sobre un área de memoria más ancha que la longitud del operando, como la longitud de una línea de caché .

Instrucciones atómicas en procesadores RISC

Una característica de las arquitecturas de procesador RISC es la ausencia de instrucciones de lectura, modificación y escritura . Los procesadores RISC DEC Alpha , PowerPC , MIPS y ARM (ARMv6 y anteriores) admiten acceso exclusivo a la memoria sin bloqueo. Las operaciones atómicas se implementan utilizando un par de instrucciones exclusivas de lectura y escritura LL y SC de la siguiente manera:

La primera instrucción (LL) carga los datos de la ubicación de memoria en un registro y marca la ubicación como una ubicación de acceso exclusivo. A continuación, se realizan los cambios de datos necesarios en el registro. La escritura de datos del registro a la memoria (SC) se realiza solo si el valor de la celda de memoria no ha cambiado. Si el valor ha cambiado, se deben repetir las tres operaciones (LL, cambio de datos y SC).

Instrucciones atómicas y compiladores

Los compiladores de lenguajes de alto nivel , por regla general, no utilizan instrucciones atómicas al generar código porque, en primer lugar, las operaciones atómicas requieren muchos más recursos que las ordinarias y, en segundo lugar, el compilador no tiene información sobre cuándo debe accederse a los datos. llevarse a cabo atómicamente (porque incluso el modificador volátil para una variable en C/C++ no significa una necesidad real de usar operaciones atómicas). Si es necesario, el programador puede usar instrucciones atómicas de una de las siguientes maneras:

  1. insertar instrucciones atómicas en el código utilizando el ensamblador proporcionado por el compilador , por ejemplo, el ensamblado en línea GCC del compilador gcc ;
  2. usar funciones proporcionadas por el compilador que llamen instrucciones atómicas, como funciones de las familias __builtin_ o __sync_ del compilador gcc ;
  3. usar funciones proporcionadas por bibliotecas que llaman a instrucciones atómicas, por ejemplo, funciones de la biblioteca Glib ;
  4. utilizar lenguajes de programación que admitan atomicidad, como los lenguajes estándar C11 y C++14 que admiten los tipos _Atómico y atómico y las funciones de la familia atomic_ [5] .

Véase también

Notas

  1. CMPXCHG - Comparar e intercambiar . Archivado el 2 de noviembre de 2012 en Wayback Machine .
  2. CMPXCHG8B - Comparar e intercambiar 8 bytes . Archivado el 30 de noviembre de 2012 en Wayback Machine .
  3. http://faydoc.tripod.com/cpu/xchg.htm Archivado el 20 de noviembre de 2012 en Wayback Machine "Si se hace referencia a un operando de memoria, el protocolo de bloqueo del procesador se implementa automáticamente durante la operación de intercambio, independientemente de la presencia o ausencia del prefijo LOCK o del valor de la IOPL".
  4. Operaciones atómicas. Historia del asunto . Consultado el 12 de noviembre de 2012. Archivado desde el original el 17 de noviembre de 2012.
  5. Biblioteca de operaciones atómicas - cppreference.com . Consultado el 12 de noviembre de 2012. Archivado desde el original el 13 de agosto de 2015.

Enlaces