title: Sincronización de relojes en un sistema distribuido
text: # Sincronización de relojes en un sistema distribuido
  
  La sincronización del reloj es un método para sincronizar los valores del reloj de los nodos en un sistema distribuido con el uso de un reloj de referencia externo o un valor de reloj interno. Durante la sincronización, muchos factores afectan a una red y estos deben tenerse en cuenta antes de corregir el valor real del reloj. La sincronización de relojes en un sistema distribuido consiste en garantizar que los procesos se ejecuten de forma cronológica y a la misma vez respetar el orden de los eventos dentro del sistema.
  
  El envió de mensajes entre los sistemas distribuidos es una parte fundamental para su funcionamiento. La sincronización de relojes ya sean físicos o lógicos aseguran que los procesos se realicen de manera secuencial y ordenada.
  
  ## Relojes
  
  Existen 2 tipos de relojes: los físicos y los lógicos. Los primeros están relacionados con el tiempo real mientras que en los segundos lo importante es el orden de los eventos.
  
  Cada computadora consta de un cristal de cuarzo que oscila a una frecuencia predecible. Hay un registro de contador que realiza un seguimiento de la oscilación y disminuye en uno por cada oscilación. Cuando llega a cero, se genera una interrupción y el contador se recarga desde el registro de retención. El valor del registro de retención se decide en función de la frecuencia de oscilación y el número de interrupciones puede ser controlado. El valor del registro de retención se elige para que sea de 60 tics (interrupciones de reloj) por segundo.
  
  Puede haber diferencias en la oscilación del cristal, lo que hace que el reloj funcione a diferentes velocidades, este efecto se conoce como sesgo de reloj. Esta diferencia en el periodo de oscilación puede ser pequeña, pero la diferencia se acumula a lo largo de muchas oscilaciones, por lo que el reloj de la computadora se desvía del reloj en tiempo real.
  
  ## Algoritmos Físicos
  
  ### Cristian
  
  Para relojes físicos con sincronización externa. Consiste en un servidor conectado a una fuente de UTC (Tiempo Universal Coordinado) y unos clientes que se sincronizan con dicho servidor.
  
  **Funcionamiento**
  
  * Un proceso p hace una petición de tiempo al servidor en un mensaje mr.
  * Al momento de enviar la petición guarda una marca tiempo Tr de ese momento.
  * El servidor responde con un mensaje mt en el que incluye su tiempo Tutc.
  * El proceso que recibe el mensaje mt guarda la marca de tiempo de llegada Tt.
  * El proceso debe hacer una estimación previa a actualizar su reloj, debido al tiempo de transmisión del mensaje por la red. $Tutc+{\frac {RTT}{2}}=Tcliente$, donde $RTT=(Tt-Tr)$ .
  * El proceso p actualiza su reloj con Tcliente.
  
  **Inconvenientes**
  
  * Presenta la posibilidad de fallo debido a la existencia de un único servidor. Cristian sugiere múltiples servidores de tiempo sincronizados que suministren el tiempo. El cliente envía a un mensaje de petición a todos los servidores y toma la primera respuesta recibida.
  * El algoritmo no contempla problemas de mal funcionamiento o fraude por parte del servidor.
  
  ## Tipos de sincronización
  
  Dentro de los relojes físicos encontramos 2 tipos de sincronización: la interna y la externa. En la sincronización interna cada nodo comparte su valor de tiempo de reloj físico con otros nodos y establece su nuevo valor de reloj en consecuencia. A diferencia de la sincronización interna, en la sincronización externa los relojes se sincronizan con una fuente de tiempo externa fiable.
  
  