我正在考虑将简单的同步能力编写到我的应用程序中,并且弹出的问题之一是在两台远程计算机之间同步时间,每个计算机都有自己的时钟(特别是关于文件/对象的修改日期)。

我敢肯定,已经对这个主题进行了大量研究,并且不想太过分理论上了,但是我想知道是否有任何最佳实践可以最大程度地减少远程时钟之间的时间差异?

例如,一个开始是始终使用通用时间(UTC),因为避免了时区问题,但是不能保证两台计算机将具有完全相同的系统时间。幸运的是,我正在做的工作不是很好,因此这并不是一个非常重要的问题,但是我仍然很好奇。

一种解决方案是始终在两端使用相同的时钟,例如全局时间服务器,而不是本地系统时钟。据推测,这(与共享资源锁相结合)可以保证不会意外的同步时间重叠,但这不是很实际。

有人认为刚刚进入我的脑海中的一个人是将每个节点(每个客户端)与在某个时候计算的偏移同步,也许是通过使用全局时间服务器计算系统时钟的偏移。这只需要偶尔完成,因为偏移本身不会在短时间内发生很大变化。

更新: 让我补充说,我对实际同步两台计算机的系统时钟不感兴趣 - 我想在大多数情况下,操作系统将处理此操作。这只是一个问题,即如何确保应用程序的两个实例使用同步时间,尽管在这个时代,我想系统的时钟几乎可以肯定地同步到一些很小的三角洲。

有帮助吗?

解决方案

像其他人建议的那样,依靠NTP进行应用程序是简单的软糖。正确的方法是使用Lamport的分布式时钟同步算法。这在他的经典论文中解释了 时间,时钟和分布式系统中事件的顺序.

其他提示

看着 ”网络时间协议”(NTP)规范。

您可以尝试PTP,Precision Time协议(PTP)是用于整个计算机网络中时钟的协议。在局部网络上,它在子微秒范围内实现了时钟的准确性,使其适合测量和控制系统。http://en.wikipedia.org/wiki/precision_time_protocol

与其编写代码来同步时钟,还不可能在这两台计算机上运行NTP客户端吗?

另外,如果无法进行以上内容,并且您的应用程序具有足够的特权来设置时间,那么我将很想在应用程序中实现最小的NTP客户端,并尝试将其与公共服务器同步。只是不要在...

将它们同步 NTP 网络时间协议。

您在哪个平台?

使用NTP,您可以将计算机的时间与原子钟同步,并使用世界的正式时间。

这是我目前必须解决的一个问题,即对未老练的最终用户,他们可以做很多事情来破坏先前贡献者的明智建议。一个不老练的最终用户至少可以做这些事情,等等:

1)没有足够的计算知识来设置NTP时间同步

2)将计算机时间时钟设置为不正确的房屋时钟或手机时钟

3)在Windows XP中,意外禁用NTP时间同步,不知道如何再次启用它,或者将计算机日期设置错误,在这种情况下,Windows NTP不起作用

4)计算机BIOS电池已经平坦,因此PC始终在1970年启动!

5)用户将其笔记本电脑带到国外,并将笔记本电脑时钟设置为本地时间,但不会更改时区,因此现在PC将返回不正确的UTC时间!!!

因此,您的程序本身必须管理时间,当然您想以最少的开销来完成。

让我们假设两个最终用户运行您的程序需要程序在将来在同一绝对时间做某事。

我提出了这个方案,从Cron Jobs的工作方式中提取了一些想法,如果有人可以建议改进这个想法,我会很高兴。

1)当您的应用程序启动时,它会通过肥皂调用到第三方服务器或您自己的时间服务器(您可以按时与NTP保持稳定),将自己的内部UTC时间同步到NTP。

2)之后,它增加了系统时钟的经过的时间来维持时间。如果要求很严格,则可能需要以间隔重复NTP同步。

3)应用程序然后查看其需要按时完成的未来工作列表。它需要了解最早的工作。

4)然后,它创建了一个线程,它可以在最早的工作之前长时间入睡,而安全保证金则更少,这取决于您的要求,可能是提前10分钟,提前一两个小时。

5)当线程醒来时,它会通过进一步的肥皂调用重新检查绝对时间,然后依靠系统时间时钟添加经过的时间,直到达到应执行第一个作业的时间为止。

6)一旦触发作业(在另一个线程中运行),时间监控线程就会计算下一个任务时间,并在整个持续时间内再次睡觉。

对这个想法的增强:

1)用户可以在应付工作之前关闭您的应用程序,因此您可能需要使用上面使用相同同步方案的背景过程或服务,以独立监视您的作业列表,存储在数据库或文件中,然后启动及时申请。 (在Windows中,产生申请过程)

2)您的应用程序可能会添加更新的,即时的工作或删除作业,因此您的睡眠线程可能需要刷新才能重新计算新的较早作业或删除工作后的工作。在Win32中,您将通过线程等待活动进行此操作来执行此操作,您将其迫使它重新计算睡眠时间。毫无疑问,在Linux中,有类似的机制。

3)对于肥皂呼叫,以获取时间记下何时发送肥皂以及何时收到响应。如果周转时间太长,则不能依靠时间,并且可能需要重复通话,也可以妥协。例如,如果肥皂说计算机时钟快5分钟,但是肥皂呼叫本身需要一分钟的回复,那么您只能确定计算机时钟至少快4分钟。

我们要做的一件事是从本质上将所有定时操作卸载到“主机”计算机上。例如,如果您有20个共享DB的服务器,请使用数据库的时间。如果您有中央服务器和一百万个客户端机器,则客户端机器不应对任何时间进行计时;执行所有同步服务器端。在真正的“分布式”环境中,例如P2P网络或其他东西,请使用最直接“拥有”所讨论资源的计算机(实际上是您要编写的文件的实际PC)来同步/控制访问该文件。

任何网络机器都应使用NTP。所有现代系统都包含一种简单的设置方法。唯一的问题应该是选择特定的服务器,如果您需要一些额外的精度;但是它已经在毫秒范围内,所以我不在乎,通常只是指向pool.ntp.org

不要使用NTP。 NTP仅适用于日期/时间。

它可以同步不通信的应用程序之间的事件。例如,警报应用程序和您的身体。

对于具有直接通信,共享资源的应用程序,使用Diomidis所说的,使用Lamport Clocks或向量时钟。 Lamport Clocks效果很好,可以在事件之间达到部分订单,当您需要确定并发事件时,向量时钟很棒。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top