基于雷蒙德树的算法
先决条件——分布式系统中的互斥
Raymond 的基于树的算法是基于锁的算法,用于分布式系统中的互斥,其中如果站点具有令牌,则允许其进入临界区。在该算法中,所有站点都被安排为一棵有向树,这样树的边缘被指定为朝向持有令牌的站点的方向。持有令牌的站点也称为树的根。
数据结构和符号:
- 每个站点 S i都有一个 FIFO 队列,称为request_q
该队列存储所有相邻站点的请求,这些站点已向站点 S i发送了令牌请求,但尚未发送令牌。任何站点的非空request_q表示该站点已向根节点发送了 REQUEST消息。 - 每个站点 S i都有一个局部变量,称为holder
该变量指向到根节点的有向路径上的直接邻居节点。
算法:
- 进入临界区:
- 当站点 S i想要进入临界区时,它会沿着指向根的定向路径向节点发送 REQUEST消息,前提是它不持有令牌并且其request_q为空。发送REQUEST消息后,它将其请求添加到它的request_q 中。
- 当路径到根上的站点的Sj接收站点的请求消息S I,它把该请求在其request_q并沿着引导路径发送所述请求消息发送到根,若没有发送任何请求消息先前收到请求消息。
- 当根站点 S r (拥有令牌)收到REQUEST消息时,它会将令牌发送到请求站点并将其持有者变量设置为指向该站点。
- 收到令牌后,站点 S j从其 request_q 中删除顶部条目,并将令牌发送到已删除条目指示的站点。站点 S j 的持有者变量设置为指向该站点。
删除 request_q的最顶层条目后,如果它仍然是非空站点 S j向持有者变量指示的站点发送 REQUEST消息以取回令牌。
- 执行临界区:
- 如果站点 S i已收到令牌并且其自己的条目位于其request_q的顶部,则它执行临界区。
- 释放临界区:
执行完临界区后,站点 S i执行以下操作:- 如果它的request_q是非空的,那么它会从它的
删除顶部的 msot 条目,然后它将令牌发送到由已删除条目指示的站点,并且它的持有者变量也被设置为指向该站点。 - 执行上述操作后,如果request_q仍然为非空,则站点S i向holder变量指向的站点发送REQUEST消息以取回token
- 如果它的request_q是非空的,那么它会从它的
消息复杂度:
在最坏的情况下,该算法需要每个临界区条目 2 *(树的最长路径长度)消息调用。如果所有节点都排列在一条直线上,那么最长的路径长度将为N – 1 ,因此该算法将需要 2 * (N -1) 次消息调用来进入临界区。但是,如果所有节点为特权生成相同数量的 REQUEST消息,则该算法将需要每个临界区条目大约 2*N / 3 条消息。
Raymond 的基于树的算法的缺点:
- 可能导致饥饿: Raymond 的算法使用贪婪策略,因为站点可以在接收令牌时执行临界区,即使其请求不在请求队列的顶部。这会影响算法的公平性,从而导致饥饿。
表现:
- 同步延迟是(T * log N )/ 2 ,因为连续执行临界区的两个站点之间的平均距离是(Log N)/2 。这里 T 是最大消息传输时间。
- 在重负载情况下,同步延迟变为T,因为每次传输令牌时站点都会执行临界区。
- 该算法的消息复杂度为O(log N),因为具有 N 个节点的树中任意两个节点之间的平均距离为 log N
- 死锁是不可能的