# 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.

### Algoritmo Berkeley

El algoritmo de Berkeley es un método para sincronizar relojes en sistemas distribuidos, donde no existe una fuente central de tiempo exacto. El servidor de tiempo es activo y se encarga de consultar periódicamente la hora en cada máquina de la red. Luego, calcula un promedio y ajusta los relojes de todas las máquinas para que coincidan, ya sea acelerándolos o retrasándolos (no implica retroceder su tiempo, sino dejarlos pausados por determinado tiempo). Este enfoque es útil cuando ninguna máquina tiene acceso a una fuente de tiempo precisa, como un receptor de señal horaria. El objetivo principal es que todas las máquinas estén sincronizadas entre sí, aunque no necesariamente con la hora real.

#### Funcionamiento

* El servidor de tiempo (demonio de tiempo) inicia el proceso: Periódicamente, el demonio de tiempo consulta a cada máquina en el sistema para conocer la hora que tienen en sus relojes.
* Las máquinas responden con sus tiempos: Cada máquina informa al servidor cuánto se adelanta o retrasa su reloj en comparación con el del servidor de tiempo.
* Cálculo del tiempo promedio: El servidor de tiempo utiliza las respuestas de todas las máquinas para calcular un tiempo promedio, considerando las diferencias.
* Ajuste de relojes: El servidor de tiempo comunica a cada máquina cómo deben ajustar sus relojes, ya sea adelantándolos o retrasándolos, para que todas las máquinas tengan el mismo tiempo.
* Sincronización interna: No es necesario que el tiempo sincronizado coincida con la hora real, siempre que las máquinas solo interactúen entre ellas y no con sistemas externos.

## 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.