【发布时间】:2022-11-29 00:28:12
【问题描述】:
正在经历 Lamport 和矢量时钟的一些实现。让我震惊和困惑的一件事是它们都只是增加了时间的价值而没有锁定它。
我的想法是,它应该是:
acquireLock()
time += 1
releaseLock()
我错过了什么吗?它不会导致同时生成的事件的时间值不正确吗?或者这种影响不会影响整个系统(虽然应该)?
谢谢!
【问题讨论】:
正在经历 Lamport 和矢量时钟的一些实现。让我震惊和困惑的一件事是它们都只是增加了时间的价值而没有锁定它。
我的想法是,它应该是:
acquireLock()
time += 1
releaseLock()
我错过了什么吗?它不会导致同时生成的事件的时间值不正确吗?或者这种影响不会影响整个系统(虽然应该)?
谢谢!
【问题讨论】:
理解目的是什么的缺失部分是针对每种算法的。
Lamport 时间戳用于创建事件的总顺序。这意味着如果有两个事件 A 和 B,那么它要么是 A 发生在 B 之前,要么是 B 发生在 A 之前。Lamport 时间戳保证如果事件 B 无论如何都依赖于事件 A,那么在总顺序中,A 将是在 B 之前。但是如果 A 在 B 之前,那并不意味着这些事件之间存在逻辑依赖关系。
Lamport 时间戳示例:事件 A 放置预订,事件 B 确认预订。在总顺序中,A 将在 B 之前出现 - A 的 lamport 时间戳小于 B 的时间戳。
矢量时钟有不同的用途:它允许系统检测两个事件是否同时发生。例如,节点 A 将变量 X 的值设置为 1,而节点 B 将变量 X 的值设置为 2。向量时钟将允许系统检测到存在冲突。矢量时钟对解决冲突没有任何作用,因此系统需要对此做些什么。
lamport 时间戳或版本时钟都不用于锁定,因为它们解决了分布式系统中的不同问题。
分布式系统中的锁相当复杂,根据意图和可用性要求,有多种获取锁的方法。
锁定意图很重要:优化需要一些锁 - 例如没有两个节点做同样的工作,但如果他们这样做,那只是浪费了一些资源。对锁的另一个需求是正确性——例如从银行账户注销余额 - 锁必须绝对防弹。
探索锁的几点建议:
【讨论】: