我可以使用Unix时间作为Lamport时间戳吗?

时间:2018-10-30 13:52:10

标签: algorithm messaging distributed-computing distributed crdt

据我所知,lamport时间戳是一种用于确保跨多个站点的事件具有部分排序的工具。

From wikipedia

  

在伪代码中,发送算法为:

time = time + 1;
time_stamp = time;
send(message, time_stamp);
     

接收消息的算法是:

(message, time_stamp) = receive();
time = max(time_stamp, time) + 1;

时间戳是否可能是unix时间戳,它会根据时间而不是事件自动增加?如果每个站点都使用unix时间戳,这是否意味着事件仍在本地进行部分排序?我是否需要更改/省略接收消息的算法,或者完全使用unix时间戳只是错误的做法?

1 个答案:

答案 0 :(得分:3)

不幸的是,除非您使用MONOTONIC_CLOCK(虽然不能保证它存在于给定的系统中,但实际上已广泛实现),否则不能保证Unix时间戳会单调增加。

即使支持单调时钟,也不能保证两次连续调用clock_gettime会返回不同的值,如果两次调用之间没有足够的时间。

由于time()系统调用未使用单调时钟,因此如果使用“ Unix timestamp”,您的意思是“ time(NULL)返回的值”,那么答案是“使用Unix时间戳。”

如果使用单调时钟,则还需要全局跟踪返回的值,以确保每个调用都会产生不同的值。但是在这种情况下,您最好只使用一个计数器。还值得注意的是,单调时钟不是从纪元算起的(通常是从系统启动算起的,尽管标准将其完全打开),因此您不能从比较两个不同系统的单调时钟值中得出任何推论。