vectoriales relojes lamport ejemplo cristian berkeley algoritmo time synchronization clocks

time - lamport - Sincronización(de relojes) entre dos computadoras remotas



algoritmo de lamport (9)

No use NTP. NTP es solo para obtener fecha / hora.

Funciona para sincronizar eventos entre aplicaciones que no se comunican. Una aplicación de alarma y tu cuerpo, por ejemplo.

Para las aplicaciones que tienen comunicación directa, comparten un recurso, usan relojes lamport o relojes vectoriales, como dijo Diomidis. Los relojes Lamport funcionan muy bien para lograr un orden parcial entre los eventos, los relojes Vector son geniales cuando necesita identificar eventos concurrentes.

Estoy buscando escribir una simple habilidad de sincronización en mi aplicación y una de las preocupaciones que surgió es la sincronización del tiempo entre dos computadoras remotas, cada una con su propio reloj (en particular, con respecto a las fechas de modificación de los archivos / objetos).

Estoy seguro de que se han realizado muchas investigaciones sobre este tema y no quiero ser demasiado teórico, pero me pregunto si existen algunas mejores prácticas aceptadas para minimizar las discrepancias temporales entre los relojes remotos.

Por ejemplo, un comienzo es usar siempre la hora universal (UTC) ya que evita los problemas de la zona horaria, pero no hay garantía de que dos computadoras tengan exactamente la misma hora del sistema. Afortunadamente, el trabajo que estoy haciendo no es muy fino, por lo que no es una preocupación terriblemente importante, pero todavía tengo curiosidad.

Una solución sería usar siempre el mismo reloj en ambos extremos, como un servidor de tiempo global, en lugar del reloj del sistema local. Es de suponer que esto (combinado con bloqueos de recursos compartidos) podría garantizar una superposición accidental del tiempo sincronizado, pero no es muy práctico.

Un pensamiento que me vino a la mente sería sincronizar cada nodo (cada cliente) con un desplazamiento calculado en algún punto anterior, tal vez calculando el desplazamiento del reloj del sistema con un servidor de tiempo global. Esto solo tendría que hacerse ocasionalmente ya que el desplazamiento en sí mismo probablemente no cambiaría mucho en un corto período de tiempo.

Actualización: Permítanme agregar que no estoy interesado en sincronizar realmente los relojes del sistema de dos computadoras; supongo que el sistema operativo manejará esto en la mayoría de los casos. Esta es solo una cuestión de cómo asegurar que dos instancias de una aplicación utilicen tiempos sincronizados, aunque en este día y época supongo que los relojes del sistema casi con seguridad se sincronizarían dentro de algún delta muy pequeño de todos modos.


Puede probar PTP, el Precision Time Protocol (PTP) es un protocolo utilizado para sincronizar relojes en una red informática. En una red de área local, logra precisión de reloj en el rango de sub-microsegundos, por lo que es adecuado para sistemas de medición y control. http://en.wikipedia.org/wiki/Precision_Time_Protocol



En lugar de escribir código para sincronizar los relojes, ¿no sería posible ejecutar un cliente ntp en ambas máquinas?

Alternativamente, si lo anterior no es posible y su aplicación se está ejecutando con privilegios suficientes para establecer la hora, me sentiría tentado a implementar un cliente NTP mínimo directamente en la aplicación e intentaré sincronizarlo con un servidor público. Simplemente no codifique el servidor privado de alguien en ...


Sincronícelos con el protocolo de tiempo de red NTP .

¿En qué plataforma estás?

Con NTP puede sincronizar la hora de sus computadoras con relojes atómicos y usar la hora oficial del mundo.


cualquier máquina en red debe usar NTP. todos los sistemas modernos incluyen una manera fácil de configurar esto. el único problema debería ser elegir un servidor específico, si necesita un poco de precisión adicional; pero ya está en el rango de milisegundos, así que no me importa y generalmente solo apunto a pool.ntp.org


Este es un problema que actualmente tengo que resolver con respecto a los usuarios finales poco sofisticados que pueden hacer muchas cosas para alterar las sugerencias sensatas hechas por los colaboradores anteriores. Un usuario final poco sofisticado puede hacer al menos estas cosas, y más:

1) No tiene suficiente conocimiento de computación para poder configurar la sincronización de tiempo ntp

2) Configure el reloj de su computadora con un reloj de la casa o reloj del teléfono móvil que sea incorrecto

3) En Windows XP se desactiva accidentalmente la sincronización de tiempo ntp y no se sabe cómo habilitarlo de nuevo, o la fecha de su computadora se ha configurado incorrectamente, en cuyo caso Windows ntp no funciona

4) ¡La batería de la bios de la computadora se ha agotado, por lo que la PC siempre se inicia en 1970!

5) El usuario toma su computadora portátil en el extranjero y temporalmente establece el reloj de la computadora portátil a la hora local, pero no cambia la zona horaria, por lo que ahora la PC devolverá el tiempo utc incorrecto.

Por lo tanto, su programa tendrá que administrar el tiempo y, por supuesto, desea hacerlo con un gasto mínimo.

Supongamos que dos usuarios finales que ejecutan sus programas necesitan que los programas hagan algo en el mismo momento absoluto en el futuro.

Propongo este esquema, que toma algunas ideas de la forma en que funcionan los trabajos de cron. Me alegra que cualquiera pueda sugerir mejoras a la idea.

1) Cuando se inicia la aplicación, sincroniza su propio tiempo interno de utt a ntp a través de una llamada a un servidor de terceros o a su propio servidor de tiempo (que puede mantener a tiempo con ntp).

2) Después de eso, agrega el tiempo transcurrido desde el reloj del sistema para mantener el tiempo. Si los requisitos son estrictos, es posible que deba repetir la sincronización ntp a intervalos.

3) La aplicación luego mira una lista de trabajos futuros que necesita hacer a tiempo. Necesita saber el primer trabajo.

4) Luego crea un hilo que pone a dormir durante el tiempo anterior al primer trabajo, menos un margen de seguridad, que dependiendo de sus requisitos podría ser de 10 minutos de antelación, una o dos horas de antelación, etc.

5) Cuando el hilo se despierta, vuelve a verificar el tiempo absoluto con otra llamada repetida, y luego confía en el reloj del sistema para agregar el tiempo transcurrido hasta que llega el momento en que se debe realizar el primer trabajo.

6) Tan pronto como se desencadena el trabajo (ejecútelo en otro hilo), el hilo de control de tiempo calcula el siguiente tiempo de tarea y se pone a dormir nuevamente durante el tiempo.

Mejoras a la idea:

1) Un usuario puede cerrar su aplicación antes del trabajo debido, por lo que es posible que necesite un proceso o servicio en segundo plano, que utiliza el mismo esquema de sincronización anterior, para supervisar de forma independiente sus listas de trabajos, almacenados en una base de datos o archivo, y aplicación a tiempo. (En Windows, genere el proceso de solicitud)

2) Es posible que la aplicación esté agregando trabajos más nuevos, anteriores sobre la marcha o eliminando trabajos, por lo que su hilo de dormir probablemente deba ser reactivable para volver a calcular para el nuevo trabajo anterior o para el trabajo posterior al trabajo eliminado. En Win32, haría esto mediante el hilo que espera con tiempo de espera en un evento, que configura para forzarlo a volver a calcular el tiempo de reposo. En Linux, sin duda, hay un mecanismo similar.

3) Para que la llamada de Soap consiga el tiempo, mantenga una nota de cuándo se envía el jabón y cuándo se recibe la respuesta. Si el tiempo de respuesta es demasiado largo, no puede confiar en el tiempo y puede necesitar repetir la llamada, o puede comprometerse. Por ejemplo, si el jabón dice que el reloj de la computadora tarda 5 minutos, pero la llamada de Soap tardó un minuto en responder, entonces solo puedes decir con certeza que el reloj de la computadora está al menos 4 minutos rápido.



Una cosa que hacemos es esencialmente descargar todas las operaciones de temporización a la máquina ''host''. Por ejemplo, si tiene 20 servidores que comparten una base de datos, use la hora de la base de datos. Si tiene un servidor central y un millón de máquinas cliente, entonces las máquinas cliente no deberían ser responsables de cronometrar nada; hacer toda la sincronización del lado del servidor. En un entorno verdaderamente ''distribuido'', como una red P2P o algo así, utilice la máquina que ''posee'' más directamente el recurso en cuestión (la PC real, el archivo que desea escribir) para sincronizar / controlar el acceso al archivo.