04分布式
Coordination: Mutual Exclusion 协调互斥
- centralized 集中式
- distributed 分布式
- token ring 令牌环
Coordination: Mutual Exclusion 协调互斥
在多个进程或线程同时访问共享资源时,保证同一时刻只有一个进程(或线程)能够访问共享资源的特性。互斥是分布式系统中非常重要的一个概念,因为如果多个进程同时访问共享资源而没有互斥机制,可能会导致数据不一致性或其他问题。
在分布式系统中实现互斥通常面临一些挑战,例如:
- 分布式环境的不确定性: 在分布式系统中,各个节点的相对速度和消息传递时间是不确定的,这使得确定一个全局的顺序变得非常困难。
- 通信延迟: 在分布式系统中,节点之间的通信存在延迟,因此需要考虑消息传递的时间,否则可能会导致竞争条件。
为了在分布式系统中实现互斥,通常采用以下方法之一:
- 中心化方法: 一个中心节点负责协调各个节点的访问请求。当一个节点需要访问共享资源时,它必须向中心节点发送请求,中心节点决定是否允许访问。
- 去中心化方法: 去中心化方法包括 Lamport 的分布式互斥算法、Ricart-Agrawala 算法、Maekawa 算法等。这些算法使用逻辑时钟或者消息传递的方式,使得节点能够协调彼此的访问请求,确保在同一时刻只有一个节点能够访问共享资源。
- 基于硬件的方法: 一些现代处理器提供硬件支持,例如原子操作、比较交换指令(compare-and-swap),这些指令可以帮助实现分布式系统中的互斥。
- 基于软件的方法: 使用分布式锁服务(例如 Zookeeper、etcd)或者分布式事务管理(例如 Two-Phase Commit)来确保在分布式系统中的互斥访问。
centralized 集中式
单个coordinator(协调器)控制流程是否可以进入关键区域
-
- a申请之后会返回允许,别的再请求就无应答,并放入queue里,等前一个结束会发送release,接着会给队列的发送ok
- 优点:
- 它能够工作(It works): 集中式系统在某种程度上可以正常工作。
- 公平性(It is fair): 它可以确保公平地分配资源或者任务。
- 没有进程饥饿(There’s no process starvation): 所有的进程都能够得到执行的机会,避免了某些进程因资源分配不公平而长时间得不到执行的情况。
- 易于实现(Easy to implement): 相对来说,集中式系统比较容易实现。
- 缺点:
- 存在单点故障(There’s a single point of failure): 如果协调者发生故障,整个系统可能会瘫痪,因为它是系统的唯一控制点。
- 繁忙系统中的瓶颈(The coordinator is a bottleneck on busy systems): 在繁忙的系统中,协调者可能成为性能瓶颈,限制了系统的处理能力。
- 如果协调者没有回复,可能是因为它发生了故障(失去响应,即“死”了)或者它正在处理大量的请求而无法立即回复(繁忙)。这种区分对于系统管理员或者开发人员来说非常重要,因为它决定了采取什么样的措施来解决问题。例如,如果协调者是“死”了,可能需要启动备用协调者或者采取其他故障恢复措施;而如果它只是繁忙,可能需要优化系统的性能或者增加协调者的处理能力
distributed 分布式
小组协商进程进入关键区域是否安全
- 可以检查事件时间戳
- 需要这些关键点
- The critical region ID. The requesting process ID. The current time.
- 互斥是指在多个进程或节点中,只有一个进程可以进入关键区域(critical region)执行,而其他进程必须等待
- 当一个进程X(被称为“请求进程”)决定要进入关键区域时,它会向分布式系统中的所有进程发送消息,包括自己。
- 每个接收到请求的进程N会根据自身的状态来决定如何回应:
- 如果该进程N当前不在关键区域中(并且也不在等待进入关键区域的队列中),那么它会向请求进程X发送一个“OK”消息,表示允许它进入关键区域。
- 如果该进程N当前正在关键区域中,那么它将把请求进程X的请求放入一个队列中,表示该请求被暂时拒绝。同时,该进程不会回复请求进程,即不发送任何回应消息。
- 确保在任意时刻只有一个进程可以进入关键区域,而其他进程必须等待。当一个进程想要进入关键区域时,它会广播请求给所有其他进程,等待它们的回应。如果它收到了所有其他进程的“OK”回应,它就可以进入关键区域。如果有任何一个进程拒绝了请求(因为它自己在关键区域中),那么请求进程必须等待,直到所有其他进程都同意它的请求。这样可以确保在任何时刻只有一个进程可以进入关键区域,从而保持数据的一致性和正确性。
- 当一个进程想要进入关键区域时,它会向所有其他进程发送请求消息,带有一个时间戳。
- 每个接收到请求的进程会执行以下操作:
- 如果该进程当前不在关键区域中,它会比较接收到的请求的时间戳与自身队列中最早的请求的时间戳。如果接收到的请求的时间戳比队列中的所有请求都要小(即更早),那么该进程将发送一个“OK”回应,表示允许请求进程进入关键区域。
- 如果接收到的请求的时间戳不是最早的,那么该请求将被放入队列中,表示请求被暂时拒绝。同时,该进程不会发送回应消息。
- 当请求进程收到所有其他进程的“OK”回应时,表示它可以安全地进入关键区域。
- 当请求进程离开关键区域时,它会向队列中的所有进程发送“OK”消息,表示它已经离开。然后,它会清空自身的队列。
这个算法利用时间戳来确定请求的顺序,保证了最早发出请求的进程最先得到满足。当一个进程收到其他进程的回应后,如果它的请求时间戳比其他进程的都小,那么它就可以进入关键区域。当它离开关键区域时,它会通知队列中的其他进程,使得其中的一个进程可以获准进入关键区域。这样,算法保证了互斥性,确保了在关键区域内只有一个进程执行。这种做法可以提高算法的公平性和正确性。
-
- 就是说此时的0和2的时间戳,0的更小,所以2允许0,同时1允许这俩,因为此时没有进程,当0结束之后0就发送ok给2
-
这个算法利用时间戳(或者可以看作事件序列号)来确定事件在分布式系统中的总体顺序,从而解决了可能出现的冲突情况。在这个算法中,当进程请求进入关键区域时,它会带有一个时间戳,其他进程会比较接收到的请求的时间戳与自身队列中请求的时间戳。如果接收到的请求的时间戳较小(即请求较早),则允许该请求进程进入关键区域。
优点:
- 能够工作: 这个算法确保了只有一个进程能够进入关键区域,保证了互斥性。
- 没有单点故障: 与某些集中式系统相比,该算法没有单点故障。如果某个节点出现问题,其他节点仍然可以正常运行。
缺点:
- 多点故障: 引入时间戳的做法带来了新的问题,如果系统中的时钟同步出现问题,可能导致时间戳不准确,从而影响互斥性。
- “崩溃”被解释为进入关键区域的拒绝: 如果一个进程在处理请求时发生崩溃,其他进程可能会将其视为拒绝进入关键区域,即使该进程实际上是正常的。这种情况可能会导致系统的不正确行为。
- 需要消息的确认(ACK): 为了解决崩溃被误解的问题,可能需要引入消息确认机制,确保消息被正确接收。这会增加系统的复杂性。
-
所有进程必须维护当前进程组的列表(这可能很棘手): 为了实现分布式互斥,每个进程都需要知道系统中其他进程的状态,以便正确地处理请求。维护这样的列表可能变得非常复杂,特别是在大规模系统中,节点的加入、离开和状态变化都需要被及时更新,确保所有进程都具备最新的信息。
-
一个过载的进程可能成为整个系统的瓶颈: 在分布式系统中,如果某个进程的负载过重,处理请求的速度变慢,可能导致整个系统的性能下降。这种情况下,即使其他进程准备好并能够快速响应请求,但由于等待这个过载进程的响应,整个系统的吞吐量和响应时间都受到影响。
token ring 令牌环
进程被组成陈逻辑循环,并使用token确定什么时候进入关键区域
所有进程逻辑上组成一个环,首先每个进程知道其下一个进程是谁(通常更常用的应该是每个进程要维护一个记录,知道其后的所有其他进程,以便在其直接后继发生崩溃时,能把令牌传递给其后继,更有甚者传递给其后继的后继);
当环初始化时,进程0得到一个令牌(可以理解为一个互斥锁),该令牌沿着环进行传递,当进程获得到令牌后,会首先检查其是否有访问共享资源的需求,如果需要,则进行资源访问,访问完成后向后继传递令牌;如果不需要访问,则直接传递令牌给其后继。如图1所示。为了增强可靠性,我们要求当令牌传递给下一个进程时,要求其往回回复确认信息,如果没有返回确认信息,则认为此节点崩溃,此时将令牌传递给后继的后继。
-
系统中的进程被组织成一个逻辑环(或链),一个特殊的令牌(token)在这个环上循环传递。只有持有令牌的进程才能够进入关键区域(critical section),执行临界区内的操作。
算法的基本思想是,当一个进程需要进入关键区域时,它必须等待并抢夺到令牌。一旦进程获得了令牌,它可以进入关键区域执行操作。当进程退出关键区域时,它释放令牌,令牌继续在环上传递,供其他进程使用。
-
优点:
- 互斥性: 确保在任意时刻只有一个进程可以进入关键区域,实现互斥访问。
- 公平性: 每个进程最终都能获得令牌,确保了公平性,每个进程有机会进入关键区域。
- 无死锁: 由于令牌在环上循环传递,不存在死锁的情况。
缺点:
- 延迟: 当一个进程希望进入关键区域时,它必须等待令牌,这可能引入一定的延迟。
- 单点故障: 如果持有令牌的进程出现故障,整个系统的互斥性可能受到影响。
要注意,令牌环算法是一种经典的分布式互斥算法,适用于许多不同的分布式系统场景。然而,具体的实现和优化可能因系统需求和架构而异。
-