📜  分布式系统中的互斥

📅  最后修改于: 2021-09-27 14:35:13             🧑  作者: Mango

互斥是一种并发控制属性,被引入以防止竞争条件。要求一个进程不能进入其临界区,而另一个并发进程当前存在或在其临界区中执行,即在任何给定的时间实例只允许一个进程执行临界区。

单机系统中的互斥 Vs。分布式系统:
在单机系统中,内存和其他资源在不同进程之间共享。共享资源的状态和用户的状态在共享内存中很容易获得,因此借助共享变量(例如:信号量)的互斥问题可以轻松解决。

在分布式系统中,我们既没有共享内存,也没有公共物理时钟,因此无法使用共享变量解决互斥问题。为了消除分布式系统中基于消息传递的方法中的互斥问题。

由于缺乏共享内存和公共物理时钟,分布式系统中的站点没有完整的系统状态信息。

互斥算法要求:

  • 无死锁:
    两个或多个站点不应无休止地等待任何永远不会到达的消息。
  • 无饥饿:
    每个想要执行临界区的站点都应该有机会在有限的时间内执行它。任何站点都不应无限期地等待执行临界区,而其他站点则重复执行临界区
  • 公平:
    每个站点都应该有公平的机会来执行临界区。任何执行临界区的请求都必须按照它们发出的顺序执行,即临界区执行请求应该按照它们到达系统的顺序执行。
  • 容错:
    万一出现故障,它应该能够自己识别它,以便在没有任何中断的情况下继续运行。

分布式互斥解决方案:
我们知道共享变量或本地内核不能用于在分布式系统中实现互斥。消息传递是实现互斥的一种方式。下面是基于消息传递在分布式系统中实现互斥的三种方法:

  1. 基于令牌的算法:
    • 唯一的令牌在所有站点之间共享。
    • 如果站点拥有唯一令牌,则允许其进入其临界区
    • 这种方法使用序列号对临界区的请求进行排序。
    • 每个临界区请求都包含一个序列号。此序列号用于区分旧请求和当前请求。
    • 这种方法确保互斥,因为令牌是唯一的
    • Example: 
      Suzuki-Kasami’s Broadcast Algorithm
  2. 非基于令牌的方法:
    • 一个站点与其他站点通信以确定接下来哪些站点应该执行临界区。这需要在站点之间交换两轮或更多轮连续的消息。
    • 这种方法使用时间戳而不是序列号来对临界区的请求进行排序。
    • 当站点请求临界区时,它会得到一个时间戳。时间戳还用于解决临界区请求之间的任何冲突。
    • 遵循非基于令牌的方法的所有算法都维护一个逻辑时钟。根据 Lamport 的方案更新逻辑时钟
    • Example: 
      Lamport's algorithm, Ricart–Agrawala algorithm
  3. 基于法定人数的方法:
    • 不是从所有其他站点请求执行临界区的权限,每个站点只请求称为quorum的站点子集。
    • 站点或仲裁的任何两个子集都包含一个公共站点。
    • 本站共同负责保证互斥
    • Example: 
      Maekawa’s Algorithm