互斥是一种并发控制属性,被引入以防止竞争条件。要求一个进程不能进入其临界区,而另一个并发进程当前存在或在其临界区中执行,即在任何给定的时间实例只允许一个进程执行临界区。
单机系统中的互斥 Vs。分布式系统:
在单机系统中,内存和其他资源在不同进程之间共享。共享资源的状态和用户的状态在共享内存中很容易获得,因此借助共享变量(例如:信号量)的互斥问题可以轻松解决。
在分布式系统中,我们既没有共享内存,也没有公共物理时钟,因此无法使用共享变量解决互斥问题。为了消除分布式系统中基于消息传递的方法中的互斥问题。
由于缺乏共享内存和公共物理时钟,分布式系统中的站点没有完整的系统状态信息。
互斥算法要求:
- 无死锁:
两个或多个站点不应无休止地等待任何永远不会到达的消息。 - 无饥饿:
每个想要执行临界区的站点都应该有机会在有限的时间内执行它。任何站点都不应无限期地等待执行临界区,而其他站点则重复执行临界区 - 公平:
每个站点都应该有公平的机会来执行临界区。任何执行临界区的请求都必须按照它们发出的顺序执行,即临界区执行请求应该按照它们到达系统的顺序执行。 - 容错:
万一出现故障,它应该能够自己识别它,以便在没有任何中断的情况下继续运行。
分布式互斥解决方案:
我们知道共享变量或本地内核不能用于在分布式系统中实现互斥。消息传递是实现互斥的一种方式。下面是基于消息传递在分布式系统中实现互斥的三种方法:
- 基于令牌的算法:
- 唯一的令牌在所有站点之间共享。
- 如果站点拥有唯一令牌,则允许其进入其临界区
- 这种方法使用序列号对临界区的请求进行排序。
- 每个临界区请求都包含一个序列号。此序列号用于区分旧请求和当前请求。
- 这种方法确保互斥,因为令牌是唯一的
-
Example: Suzuki-Kasami’s Broadcast Algorithm
- 非基于令牌的方法:
- 一个站点与其他站点通信以确定接下来哪些站点应该执行临界区。这需要在站点之间交换两轮或更多轮连续的消息。
- 这种方法使用时间戳而不是序列号来对临界区的请求进行排序。
- 当站点请求临界区时,它会得到一个时间戳。时间戳还用于解决临界区请求之间的任何冲突。
- 遵循非基于令牌的方法的所有算法都维护一个逻辑时钟。根据 Lamport 的方案更新逻辑时钟
-
Example: Lamport's algorithm, Ricart–Agrawala algorithm
- 基于法定人数的方法:
- 不是从所有其他站点请求执行临界区的权限,每个站点只请求称为quorum的站点子集。
- 站点或仲裁的任何两个子集都包含一个公共站点。
- 本站共同负责保证互斥
-
Example: Maekawa’s Algorithm