Articulo de referencia

Sucedió antes

En ciencias de la computación , la relación de pasado anterior (denotada: → {\displaystyle \to \;} La relación causal entre dos eventos es tal que, si un evento ocurre antes que...

En ciencias de la computación , la relación de pasado anterior (denotada:{\displaystyle \to \;}La relación causal entre dos eventos es tal que, si un evento ocurre antes que otro, el resultado debe reflejarlo, incluso si en realidad se ejecutan en un orden diferente (generalmente para optimizar el flujo del programa). Esto implica ordenar eventos basándose en la posible relación causal entre pares de eventos en un sistema concurrente, especialmente en sistemas distribuidos asíncronos . Fue formulada por Leslie Lamport . [ 1 ]

La relación de precedencia se define formalmente como el orden parcial menos estricto sobre eventos tales que:

  • Si los eventosa{\displaystyle a\;}yb{\displaystyle b\;}ocurren en el mismo proceso,ab{\displaystyle a\to b\;}si ocurre el eventoa{\displaystyle a\;}precedió a la ocurrencia del eventob{\displaystyle b\;}.
  • Si ocurrea{\displaystyle a\;}es el envío de un mensaje y eventob{\displaystyle b\;}es la recepción del mensaje enviado en el eventoa{\displaystyle a\;},ab{\displaystyle a\to b\;}.

Si dos eventos ocurren en procesos aislados diferentes (que no intercambian mensajes directa o indirectamente a través de procesos de terceros), entonces se dice que los dos procesos son concurrentes, es decir, ninguno de los dos procesos es concurrente.ab{\displaystyle a\to b}niba{\displaystyle b\to a}es cierto. [ 2 ]

Si existen otras relaciones causales entre los eventos de un sistema determinado, como por ejemplo entre la creación de un proceso y su primer evento, estas relaciones también se añaden a la definición.

Por ejemplo, en algunos lenguajes de programación como Java, [ 3 ] C, C++ o Rust, existe un borde de precedencia si la memoria escrita por la instrucción A es visible para la instrucción B, es decir, si la instrucción A completa su escritura antes de que la instrucción B comience su lectura.

Como todos los órdenes parciales estrictos, la relación de "sucedió antes" es transitiva , irreflexiva (y, trivialmente, asimétrica ), es decir:

  • a,b,do{\displaystyle \forall a,b,c}, siab{\displaystyle a\to b\;}ybdo{\displaystyle b\to c\;}, entoncesado{\displaystyle a\to c\;}(transitividad). Esto significa que para cualesquiera tres eventosa,b,do{\displaystyle a,b,c}, sia{\displaystyle a}sucedió antesb{\displaystyle b}, yb{\displaystyle b}sucedió antesdo{\displaystyle c}, entoncesa{\displaystyle a}debió haber sucedido antesdo{\displaystyle c}.
  • a,aa{\displaystyle \forall a,a\nrightarrow a}(irreflexividad). Esto significa que ningún evento puede ocurrir antes que sí mismo.
  • a,b,{\displaystyle \forall a,b,}siab{\displaystyle a\to b}entoncesba{\displaystyle b\nrightarrow a}(asimetría). Esto significa que para cualesquiera dos eventosa,b{\displaystyle a,b}, sia{\displaystyle a}sucedió antesb{\displaystyle b}entoncesb{\displaystyle b}no puede haber sucedido antesa{\displaystyle a}.

Observemos que la propiedad de asimetría se deduce directamente de las propiedades anteriores: por contradicción, supongamos quea,b,{\displaystyle \forall a,b,}tenemosab{\displaystyle a\to b\;}yba{\displaystyle b\to a}. Entonces, por transitividad, tenemosaa,{\displaystyle a\to a,}lo cual contradice la irreflexividad.

Los procesos que componen un sistema distribuido desconocen la relación de precedencia a menos que utilicen un reloj lógico , como un reloj de Lamport o un reloj vectorial . Esto permite diseñar algoritmos de exclusión mutua y realizar tareas como la depuración o la optimización de sistemas distribuidos.

Fallas bizantinas y la imposibilidad de detección

En sistemas distribuidos, la relación de precedencia se puede rastrear con precisión en caso de fallos catastróficos mediante relojes vectoriales, sus variantes y otros mecanismos de seguimiento de causalidad. Sin embargo, en caso de fallos bizantinos , donde los procesos pueden comportarse de forma arbitraria o maliciosa, es fundamentalmente imposible detectar la relación de precedencia. [ 4 ] El razonamiento intuitivo para esto es que los procesos bizantinos pueden falsificar o manipular metadatos, lo que imposibilita determinar las verdaderas dependencias causales.

Véase también

Citas

  1. Lamport, Leslie (1978). "Tiempo, relojes y ordenamiento de eventos en un sistema distribuido" , Communications of the ACM , 21(7), 558-565.
  2. "Sistemas distribuidos, 3.ª edición (2017)" . DISTRIBUTED-SYSTEMS.NET . Consultado el 20 de marzo de 2021 .
  3. Goetz et al. 2006 , pp. 339–342, §16.1.3 El modelo de memoria de Java en 500 palabras o menos.
  4. Misra, Anshuman; Kshemkalyani, Ajay D. (2022). "Detección de causalidad en presencia de procesos bizantinos: No existe el Santo Grial". 2022 IEEE 21st International Symposium on Network Computing and Applications (NCA) . IEEE. pp. 73–80 . doi : 10.1109/NCA57778.2022.10013644 . 

Referencias

  • Goetz, Brian; Peierls, Tim; Bloch, Joshua; Bowbeer, Joseph; Holmes, David; Lea, Doug (2006). Java Concurrency in Practice . Addison Wesley. ISBN 0-321-34960-1.