分布式系统 资源死锁和通信死锁的区别
死锁是一个进程无法继续执行的情况,因为它需要获取另一个进程持有的资源,而它本身持有另一个进程需要的资源。死锁发生需要满足以下四个条件:
- 互斥: 系统中至少有一个资源一次只能被一个进程使用。
- 持有并等待: 必须有一个进程在等待另一个进程获取的资源的同时保持着自己已经获得的资源。
- 无抢占: 资源不能被强制从一个进程中取出并交给另一个进程。
- 循环等待: 所有进程必须以循环的方式等待资源,其中最后一个进程等待第一个进程的资源。
什么是分布式系统死锁
分布式系统中的死锁与单处理器系统中的死锁类似。由于所有相关信息分散在许多机器上,它们不容易避免、预防、检测,并且在追踪时更难解决。某些系统,如分布式数据库系统,可能非常严重,因此了解它们与普通死锁的区别非常重要。
分布式死锁有两种类型,通信死锁和资源死锁。所谓“通信死锁”是指进程A试图向进程B发送消息,而进程B试图向进程C发送消息,而进程C又试图向进程A发送消息。在这种情况下,没有缓冲区可用等各种情况都可能导致死锁。所谓“资源死锁”是指进程争夺对I/O设备、文件、锁或其他资源的独占访问。
处理死锁的方法有多种。可以通过以下方式处理死锁:
- 忽略问题: 可以选择忽略问题,这是最流行的选择之一。
- 检测: 允许死锁发生,然后检测到系统中存在死锁,并最终解决死锁。死锁检测需要检查进程-资源交互状态是否存在循环等待。在分布式系统中,死锁检测似乎是处理分布式系统死锁的最佳方法。
- 预防: 可以实施资源分配限制以防止死锁。通常通过在进程开始执行之前使其同时获取所有需要的资源,或者通过抢占持有所需资源的进程来实现死锁预防。
- 回避: 在分布式系统中,回避死锁的方法是如果结果的全局系统状态是安全的,则向进程授予资源。然而,由于存在几个问题,死锁回避在分布式系统中是不切实际的。
在分布式系统中不使用死锁回避。死锁回避的困难之处在于算法需要提前知道资源使用要求以正确地调度它们。
这四种方法都有可能适用于分布式系统。在分布式系统中,死锁处理变得非常复杂,因为没有任何站点能够准确地了解系统的当前状态,而且每个站点之间的通信都会存在有限且不可预测的延迟。
什么是资源死锁
在资源死锁中,进程可以同时等待多个资源,并且只有在获取所有这些资源之后才能继续执行。如果一组进程中的每个进程都请求由该组中的另一个进程持有的资源,并且在解除阻塞之前必须接收到所有请求的资源,那么这就被称为资源死锁。
例如,假设系统运行2个进程P1和P2,它们都需要资源R1和R2。资源分配图如下所示:
但是在这里,进程 P 1 持有资源 R 1 并等待获取 R 2 资源,而进程 P 2 持有资源 R 2 并等待获取 R 1 资源。这样,P 1 等待 P 2 完成,P 2 等待 P 1 完成,从而导致死锁。
什么是通信死锁
在这种死锁中,进程等待与进程组中的其他进程进行通信。等待的进程可以通过从这些进程中的任何一个接收通信来解除阻塞。如果集合中的每个进程都在等待与集合中的另一个进程进行通信,并且在它收到等待中的通信之前,集合中的任何进程都不会开始任何其他通信,则集合被称为通信死锁。
例如: 假设进程 A 等待从进程 B 接收消息,进程 B 等待从进程 C 接收消息,进程 C 等待从进程 A 接收消息,从而导致死锁。TFW 图如下所示:
分布式系统中的用户(DDBS)通过执行事务来访问数据库的数据对象。事务可以被视为在数据对象上执行的一系列读取和写入操作。数据库的数据对象可以被认为是通过事务获得(通过锁定)并释放(通过解锁)的资源。在DDBS中,等待图被称为事务等待图(TWF图)。
资源死锁和通信死锁之间的区别
在 资源死锁 中,进程访问资源,例如数据库系统中的数据对象和存储转发通信网络中的缓冲区。进程在访问资源之前获取资源,并在使用后释放资源。一个需要资源进行执行的进程在获得所有这些资源之前无法继续进行。如果集合中的每个进程都请求集合中另一个进程持有的资源,则该进程集合就处于资源死锁状态。
在 通信死锁 中,消息是进程等待的资源。接收到消息会使进程解除等待并解除阻塞。如果集合中的每个进程都在等待来自集合中其他进程的消息,而集合中没有任何进程发送消息,则该进程集合就处于通信死锁状态。以下是资源死锁和通信死锁之间的一些其他区别。
资源死锁 | 通信死锁 |
---|---|
直接不知道哪个事务依赖于哪个其他事务。 | 在通信模型中,一个进程在继续执行之前,可能需要知道必须从哪些进程中接收消息以进行通信的标识。 |
在资源分配模型中,一个进程在收到其等待的全部资源之前,无法继续执行。 | 在通信模型中,一个进程在能够与其等待的进程之一进行通信之前,无法继续执行。 |
通过进程等待资源来进行等待。 | 通过进程等待消息来进行等待。 |
如果集合中的每个进程都寻求集合中另一个进程持有的资源,并且在能够解除阻塞之前必须获得所有请求的资源,则进程集合处于资源死锁状态。 | 如果集合中的每个进程都在等待与集合中的另一个进程进行通信,并且在接收到等待的通信之前,集合中的任何进程都不会开始任何其他通信,则该集合处于通信死锁状态。 |
可以通过安全状态来预防资源死锁。 | 无法通过安全状态来预防通信死锁。 |