En un sistema distribuído existen muchos relojes porque cada máquina tiene su propio reloj. Cada uno de estos relojes marca el tiempo a una velocidad un poco diferente de los otros, por lo que se van descuadrando con respecto a sus compañeros y de aquí surge la necesidad de sincronizarlos.
Los algoritmos que se ejecutan en sistemas distribuídos deben ser a su vez algoritmos distribuídos los cuales debe cumplir ciertas características:
Los algoritmos que se ejecutan en sistemas distribuídos deben ser a su vez algoritmos distribuídos los cuales debe cumplir ciertas características:
- La información relevante debe estar distribuída en varias máquinas, de tal manera que ninguna de ellas sea necesaria. Esto significa que no deben existir porcesos administradores únicos o servidores únicos para alguna labor. No debe existir un administrador de procesos o de recursos no sólo porque es un punto de falla sino porque limita el crecimiento del sistema, es un problema de escalabilidad.
- Cada proceso toma decisiones con la información que tiene disponible localmente, para que sea eficiente porque la red es lenta comparada con la velocidad interna de la máquina.
- Se debe evitar un punto de falla en el sistema, es decir, no habrá centralización, así que el sistema debe ser tolerante a la falla de una o varias de sus máquinas.
- No existe un reloj común o alguna otra fuente precisa de tiempo global, esto acepta la realidad de que todos los relojes marcan horas diferentes y aún así, los algoritmos deben funcionar.
Un sistema distribuído debería ser más confiable que uno centralizado, así que el fallo de algunas máquinas no debe inutilizar al sistema distribuído, como sucede con el centralizado cuando falla el servidor central.
El punto 4 es el que se va a discutir aquí. En un sistema centralizado el reloj de la máquina central es la que pone la hora para todo el sistema, cuando un proceso necesita la hora, se la pregunta al único reloj central y no tiene ambigüedades o incertidumbres acerca del tiempo. En el sistema distribuído existen muchos relojes que caminan a veolicidades ligeramente diferentes, es de esperarse entonces que cada reloj marque una hora diferente. Esto origina problemas nuevos. Por ejemplo, cuando hay una relación de causalidad entre dos eventos, se supone que el evento que toma el rol de "causa" debe ocurrir en un tiempo anterior que el evento que toma el rol de "efecto", pues las causas anteceden a lo efectos según la lógica o el sentido común. Pero si los relojes están descuadrados, no se puede garantizar que se cumpla lo que la lógica indica.
Hay aplicaciones que trabajan con base en el tiempo. En UNIX existe la orden make la cual se utiliza para compilar una aplicación que consta de muchos programas fuentes. Make compila cada programa fuente (un .c) generando un programa objeto (un .o) y al final enlaza todos los objetos con las librerías para generar el programa ejecutable (el .exe). Pero make es inteligente, verifica si la fecha y hora de modificación del programa fuente es posterior a la fecha y hora de creación del programa objeto; si esto se cumple, compila el programa fuente, de lo contrario, no lo hace, ahorrando un tiempo considerable. El problema es que si estamos en un sistema distribuído, los relojes de las máquinas donde se editan los programas fuente y de la máquina donde se compila, pueden estar muy descuadrados, por lo que make podría no compilar un programa fuente que se acaba de modificar, generando traumatismos para el programador que no entiende los errores que le salen.
Entonces, una vez que entendemos los problemas que se pueden originar por la falta de sincronización, nos hacemos esta pregunta:
Es posible sincronizar todos los relojes de un sistema?
El punto 4 es el que se va a discutir aquí. En un sistema centralizado el reloj de la máquina central es la que pone la hora para todo el sistema, cuando un proceso necesita la hora, se la pregunta al único reloj central y no tiene ambigüedades o incertidumbres acerca del tiempo. En el sistema distribuído existen muchos relojes que caminan a veolicidades ligeramente diferentes, es de esperarse entonces que cada reloj marque una hora diferente. Esto origina problemas nuevos. Por ejemplo, cuando hay una relación de causalidad entre dos eventos, se supone que el evento que toma el rol de "causa" debe ocurrir en un tiempo anterior que el evento que toma el rol de "efecto", pues las causas anteceden a lo efectos según la lógica o el sentido común. Pero si los relojes están descuadrados, no se puede garantizar que se cumpla lo que la lógica indica.
Hay aplicaciones que trabajan con base en el tiempo. En UNIX existe la orden make la cual se utiliza para compilar una aplicación que consta de muchos programas fuentes. Make compila cada programa fuente (un .c) generando un programa objeto (un .o) y al final enlaza todos los objetos con las librerías para generar el programa ejecutable (el .exe). Pero make es inteligente, verifica si la fecha y hora de modificación del programa fuente es posterior a la fecha y hora de creación del programa objeto; si esto se cumple, compila el programa fuente, de lo contrario, no lo hace, ahorrando un tiempo considerable. El problema es que si estamos en un sistema distribuído, los relojes de las máquinas donde se editan los programas fuente y de la máquina donde se compila, pueden estar muy descuadrados, por lo que make podría no compilar un programa fuente que se acaba de modificar, generando traumatismos para el programador que no entiende los errores que le salen.
Entonces, una vez que entendemos los problemas que se pueden originar por la falta de sincronización, nos hacemos esta pregunta:
Es posible sincronizar todos los relojes de un sistema?

No hay comentarios:
Publicar un comentario