Módulo 2 - Lectura 3
Módulo 2 - Lectura 3
Módulo 2 - Lectura 3
Sincronización distribuida
1. Ordenamiento de mensajes
Un aspecto muy importante de la comunicación en grupo es el ordenamiento de los
mensajes. Se debe tener bien definida una semántica con respecto al orden de
entrega de los mensajes en un sistema distribuido.
Se puede garantizar la entrega inmediata de todos los mensajes en el orden en que
fueron enviados cuando se cumplen las siguientes condiciones:
Relojes
El concepto de tiempo es fundamental para nuestra forma de pensar. Deriva del
concepto más básico del orden en el que ocurren los eventos. Decimos que algo
sucedió a las 15:15 si ocurrió después de que nuestro reloj leyó las 15:15 y antes de
las 15:16. El concepto del ordenamiento temporal de los eventos está presente en
nuestro pensamiento acerca de los sistemas. Así, por ejemplo, en un sistema de
reserva de una aerolínea, especificamos que una solicitud de reserva debe
concederse si se realiza antes de que se llene el vuelo.
Relojes físicos
Cada sistema tiene su propio temporizador que controla su reloj. Estos temporizadores
se basan en la oscilación de un instrumento de cuarzo o en un circuito integrado
equivalente. Aunque son razonablemente precisos y estables, no son perfectos. Esto
significa que los relojes se alejarán de la hora real. Cada temporizador tiene diferentes
características: características que pueden cambiar con el tiempo, la temperatura,
etcétera. Esto implica que el tiempo de cada sistema se desviará del tiempo real a una
velocidad diferente y quizás en una dirección diferente (lenta o rápidamente).
¿Con qué frecuencia necesitamos volver a sincronizar los relojes? Coordinar los
relojes físicos entre varios sistemas es posible, pero nunca puede ser exacto. En
sistemas distribuidos, debemos estar dispuestos a aceptar cierta desviación del tiempo
“real” en cada reloj.
Un reloj típico en tiempo real dentro de una computadora tiene un error relativo de
aproximadamente 10−5. Esto significa que si el reloj está configurado para 100 tictac
por segundo, deberíamos esperar 360.000 +/- 4 tictac por hora.
Dado que diferentes relojes pueden desviarse en diferentes direcciones, el peor de los
casos es que dos relojes en un sistema se desvíen en direcciones opuestas. En este
caso, la diferencia entre estos relojes puede ser el doble del error relativo. Usando un
error relativo de ejemplo de 10−5, esto sugiere que los relojes pueden separarse hasta
8 tictac por hora. Entonces, por ejemplo, si queremos que todos los relojes en este
sistema estén dentro de 4 tictac, debemos sincronizarlos dos veces por hora.
A continuación, se presenta una fórmula general que expresa estas ideas:
maximum_synchronization_interval = maximum_acceptable_difference /
maximum_drift_rate / 2
Para poder estimar mejor la hora actual, el host necesita estimar cuánto tiempo ha
pasado desde que el servidor de hora respondió. Por lo general, esto se hace
asumiendo que el tiempo del cliente es razonablemente preciso en intervalos cortos y
que la latencia del enlace es aproximadamente simétrica (la solicitud demora tanto en
llegar al servidor como la respuesta tarda en regresar). Dados estos supuestos, el
cliente puede medir el tiempo de ida y vuelta (RTT, por su nomenclatura en inglés,
round-trip time o round trip delay time) de la solicitud utilizando su reloj local, dividir
este tiempo a la mitad y restar la hora local del resultado. El resultado es una buena
estimación del error en la hora local.
En otras palabras:
Si se sabe que el servidor tiene una latencia aproximada para responder a las
solicitudes una vez que las recibe, también se puede hacer un ajuste para esto:
avg_clock_error 0 = local_clock_error
avg_clock_error n = (weight * local_clock_error) + (1 - weight) * local_clock_error n-1
Si el reloj local es más lento que el reloj de referencia, el nuevo valor de tiempo puede
simplemente adoptarse; en general, los relojes pueden avanzar sin causar muchos
problemas. Pero si el reloj local es rápido, adoptar una hora anterior probablemente no
sea una buena idea. Si lo hace, podría revertir el orden aparente de algunos eventos
al dar una marca de tiempo más baja a un evento que un predecesor. En el caso de un
reloj local rápido, el reloj debe reducirse, no se debe ajustar la hora.
Relojes lógicos
Definición de sucede-antes:
Utilizamos esta relación para definir nuestro reloj. En lugar de un reloj que se mantiene
en tiempo real, es básicamente un simple contador que se usa para etiquetar eventos
de una manera que muestra la relación entre el suceso y el antes. Estas son las reglas
que se utilizan para actualizar el valor del reloj lógico en un host:
Al diseñar sistemas, asumimos que cualquier acción que realice un host puede verse
afectada por cualquier mensaje que haya recibido anteriormente. Se requiere
conocimiento específico de la aplicación para hacer lo contrario. Como resultado,
consideraríamos que la situación anterior es una posible violación de causalidad,
incluso si el mensaje de P2 a P1 resultó ser completamente independiente de los
mensajes que recibió.
Coloquialmente, no distinguimos entre violaciones potenciales de causalidad y
violaciones de causalidad que tienen consecuencias reales. En su lugar, las llamamos
violaciones de causalidad, incluso si los mensajes resultan ser independientes.
Al igual que con la hora lógica de Lamport, cada host mantiene su propia noción de la
hora local y la actualiza utilizando las marcas de tiempo colocadas por el remitente en
los mensajes. Pero, con el tiempo lógico vectorial, el tiempo contiene más información:
contiene un vector que representa el estado de cada host. En otras palabras, este
vector no solo contiene el recuento de eventos para el host, sino que también contiene
los últimos recuentos de eventos conocidos en cada uno de los demás hosts.
La única entrada en este vector que se garantiza que está actualizada es la entrada
que representa al remitente. Por esta razón, es posible que el receptor tenga una
comprensión más actualizada de la hora lógica en algunos de los hosts. Este sería el
caso si se enviara un mensaje desde otro host al remitente, pero el destinatario no lo
ha recibido.
Como resultado, cuando un host recibe un mensaje, fusiona su vector de tiempo y la
marca de tiempo enviada con el mensaje y selecciona el valor más alto para cada
elemento. Esto garantiza que el remitente tenga información que esté, al menos, tan
actualizada como el destinatario.
A continuación, se muestra un resumen de las reglas para los relojes vector lógicos:
¿Por qué? Para que la hora local haya avanzado de forma tal que esté adelantada a la
marca de hora del mensaje recién recibido, un mensaje anterior debe haber
adelantado la hora local. El remitente de ese mensaje anterior debe haber recibido el
mensaje recién llegado antes de enviarnos su mensaje anterior. Así ocurrió una
violación de causalidad (potencial).
Es cierto que esto no soluciona el problema, pero, al menos, tenemos una forma de
detectar y registrar el problema. Esto facilitará mucho el aislamiento y la depuración y
tomará medidas de mitigación para garantizar que la salida del sistema sea correcta.
Matriz de relojes lógicos: en realidad, existe otro tipo de reloj lógico, que es un paso
más amplio que un reloj de vector lógico, a saber: el reloj de matriz lógica. Al igual que
un reloj de vector, mantiene el tiempo lógico simple para cada host: un reloj de matriz
mantiene un vector de los relojes de vector para cada host.
Cada vez que se intercambia un mensaje, el host de envío nos dice no solo lo que
sabe sobre el estado global del tiempo, sino también lo que otros hosts le han dicho
que saben sobre el estado global del tiempo: chismes confiables.
Cada proceso deberá pedir todos sus recursos al mismo tiempo y no podrá seguir la
ejecución hasta haberlos recibido todos.
1. Si a un proceso que tiene recursos se le niegan los demás, ese proceso deberá
liberar sus recursos y, en caso necesario, pedirlos de nuevo junto con los
recursos adicionales.
2. Se impondrá un ordenamiento lineal de los tipos de recursos en todos los
procesos; es decir, si a un proceso le han sido asignados recursos de un tipo
específico, en lo sucesivo sólo podrá pedir aquellos recursos que siguen en el
ordenamiento.
Como se observa, Havender presenta tres estrategias y no cuatro, debido a que estas
están diseñadas para negar una de las condiciones necesarias (la primera de ellas),
es decir que los procesos exigen el uso exclusivo de los recursos que requieren.
Las técnicas más aplicables para el análisis de los bloqueos en sistemas distribuidos
son:
Detección.
Prevención.
3. Sincronización
procesos.