Comparar e intercambiar, también conocido por las siglas CAS (del inglés Compare And Swap), es una operación atómica usada en el diseño de algoritmos concurrentes para permitir la sincronización de hilos de ejecución sin recurrir a bloqueos de los mismos.[1]

Descripción

editar

Básicamente consiste en comparar el valor de una variable con un valor esperado y, si el valor es el esperado, entonces intercambia el valor de la variable con el de otra variable. Todo esto realizado de una forma atómica. La atomicidad garantiza que el nuevo valor es calculado basado en información actualizada; si entretanto el valor ha sido actualizado por otro hilo de ejecución, la escritura fallará, El resultado de la operación tiene que indicar si se realizó la sustitución; esto puede ser realizado con una simple respuesta booleana (a esta variante se le llama 'comparar y establecer), o retornando el valor leído de la memoria (no el escrito).[2]

Más formalmente podemos definir el algoritmo de la siguiente forma:[2]

Parámetros de entrada:
  • Una localización de memoria V donde el valor tiene que ser reemplazado.
  • Un valor viejo A el cual fue leído por el hilo la última vez.
  • Un nuevo valor B el cual debería ser escrito sobre V
Supongamos que creo que V debería tener el valor A ya que tiene el valor B. Si V no tiene el valor B entonces no se debería hacer nada y se me debería dar una respuesta indicándome que estaba equivocado.

En resumen, cuando varios hilos de ejecución intentan actualizar la misma variable simultáneamente usando CAS, uno gana y actualiza el valor de la variable y el resto pierde. Pero los perdedores no son sancionados con la suspensión del hilo, ellos son libres de volver a intentar realizar la operación o simplemente no hacer nada.[2]

La técnica CAS es optimista ya que procede con la actualización a la espera de tener éxito, sin embargo puede haber fallo, que será detectado, si otro hilo ha actualizado la variable desde que él la examinó por última vez.[2]

Ejemplo

editar

Supongamos que V es una localización de memoria donde está almacenado el valor 10. Hay múltiples hilos que quieren incrementar este valor y usar el valor incrementado para otras operaciones. Supongamos los siguientes pasos:[2]

  1. Hilos 1 y 2 quieren realizar el incremento, leen el valor y deciden que quieren incrementarlo a 11.
  2. Hilo 1 entra primero en CAS y compara V con el último valor leído. Esto provocará que el valor de V sea sobreescrito y se convierta a 11
  3. Hilo 2 entra en CAS e intenta realizar la operación y esta falla devolviendo el valor 11
  4. Hilo 2 decide volver a leer y decide incrementar a 12
  5. Hilo 2 entra en CAS y actualiza el valor de la variable a 12.

Implementación hardware

editar

La técnica CAS está soportada por las CPU's modernas. El acceso a estas rutinas de CPU ponen a disposición del sistema una implementación eficiente al más bajo nivel del algoritmo. Esto puede ser aprovechado por lenguajes de alto nivel. Por ejemplo Java desde versión 5 tiene acceso a estas funciones vía clases del paquete java.util.concurrent.atomic.[3]

Referencias

editar
  1. Understanding Atomic Operations. jfdube. 30 de noviembre de 2011
  2. a b c d e Compare and Swap [CAS Algorithm]. Lokesh Gupta. 13 de junio de 2014
  3. Compare and Swap. Jakob Jenkov. 1 de octubre de 2014

📚 Artikel Terkait di Wikipedia

Algoritmo de Peterson

conocido como solución de Peterson,​ es un algoritmo de programación concurrente para exclusión mutua, que permite a dos o más procesos o hilos de ejecución

Planificación Round-robin

computacionales, un método para ejecutar diferentes procesos de manera concurrente, para la utilización equitativa de los recursos del equipo, es limitando

Algoritmo de Berkeley

Estos relojes permiten reconstruir el orden causal entre operaciones concurrentes sin depender de un reloj físico sincronizado. En el algoritmo de Berkeley

Premio Gödel

Shang-Hua (2004), «Smoothed analysis of algorithms: Why the simplex algorithm usually takes polynomial time», J. ACM 51 (3): 385-463, ISSN 0004-5411

Sergio Rajsbaum

en el campo de la informática teórica, específicamente la computación concurrente y distribuida. Es profesor del Instituto de Matemáticas de la Universidad

Red inalámbrica mallada

(Optimized Link State Routing protocol) TORA (Temporally-Ordered Routing Algorithm) HSLS (Hazy-Sighted Link State) Babel (a loop-free distance-vector routing

Algoritmo abusón

que varios procesos puedan descubrir la caída del coordinador de forma concurrente). P emite un mensaje de elección a todos los demás procesos con ID de

Número regular

danes) I (2) .. Temperton, Clive (1992), «A generalized prime factor FFT algorithm for any N = 2p3q5r», Revista SIAM sobre Computación Científica y Estadística