分布式系统中的资源死锁与通信死锁的区别

2025 年 4 月 29 日 | 阅读 5 分钟

死锁是指一个进程无法继续执行,因为它需要获取由另一个进程持有的资源,而它本身又持有另一个进程需要的资源。要发生死锁,必须满足以下四个条件:

  1. 互斥条件: 系统中至少有一个资源一次只能被一个进程使用。
  2. 持有并等待: 必须有一个进程在持有资源的同时,等待获取由其他进程获得的另一资源。
  3. 不可抢占: 资源不能被强制从一个进程中剥夺并交给另一个进程。
  4. 循环等待: 所有进程必须以循环方式等待资源,即最后一个进程等待第一个进程的资源。
Resource Deadlocks vs Communication Deadlocks in Distributed Systems

分布式系统的死锁是什么?

分布式系统中的死锁与单处理器系统中的死锁类似。它们不易避免、预防,检测起来也更难,而且一旦发现,更难根治,因为所有相关信息都分散在许多机器上。有些系统,例如分布式数据库系统,情况可能极其严重,因此理解它们与普通死锁的区别非常重要。

分布式死锁有两种:通信死锁和资源死锁。通信死锁发生在进程 A 试图向进程 B 发送消息,而进程 B 试图向进程 C 发送消息,进程 C 又试图向进程 A 发送消息。这种情况导致死锁的各种场景,例如没有可用的缓冲区。资源死锁发生在进程争夺对 I/O 设备、文件、锁或其他资源的独占访问时。

处理死锁有各种策略。死锁处理可以通过以下几种方式进行:

  • 忽略问题: 我们可以选择忽略这个问题。这是最流行的选项之一。
  • 检测: 允许死锁发生,然后检测到系统中存在死锁,最后处理死锁。死锁检测需要检查进程-资源交互的状态是否存在循环等待。在分布式系统中进行死锁检测似乎是处理分布式系统死锁的最佳方法。
  • 预防: 我们可以施加资源分配限制来防止死锁。死锁预防通常通过让一个进程在开始执行前同时获取所有所需的资源,或者通过抢占持有所需资源的进程来实现。
  • 避免: 在分布式系统的死锁避免方法中,如果结果的全局系统状态是安全的,则将资源授予进程。然而,由于一些问题,死锁避免在分布式系统中是不切实际的。

分布式系统不使用死锁避免。死锁避免的难点在于算法需要提前了解资源使用需求才能正确调度它们。

所有这四种方法都可能适用于分布式系统。在分布式系统中,死锁处理变得非常复杂,因为没有一个站点能够准确了解系统的当前状态,并且每一次站点间的通信都涉及有限且不可预测的延迟。

什么是资源死锁?

在资源死锁中,进程可以同时等待多个资源,并且在获取所有这些资源之前无法继续执行。如果一个进程集中的每个进程都请求由该集中的另一个进程持有的资源,并且它必须在被解除阻塞之前获得所有请求的资源,那么这个进程集就是资源死锁。这称为资源死锁。

例如, 假设系统正在运行 2 个进程 P1 和 P2,它们想要资源 R1 和 R2。资源分配图如下所示。

Resource Deadlocks vs Communication Deadlocks in Distributed Systems

但是,这里 P1 进程持有资源 R1 并等待获取 R2 资源,而进程 P2 持有资源 R2 并等待获取 R1 资源。通过这种方式,P1 等待 P2 完成,P2 等待 P1 完成,从而发生死锁。

什么是通信死锁?

在这种死锁中,进程等待与一组进程中的其他进程进行通信。等待的进程可以通过接收来自这些进程中任何一个的通信来解除阻塞。如果集中的每个进程都在等待与集中的另一个进程进行通信,并且集中的任何进程在收到它所等待的通信之前都不会开始任何其他通信,那么该集就是通信死锁。

例如: 假设进程 A 等待从进程 B 接收消息,进程 B 等待从进程 C 接收消息,进程 C 等待从进程 A 接收消息,从而发生死锁。TFW 图如下所示。

Resource Deadlocks vs Communication Deadlocks in Distributed Systems

在分布式数据库系统(DDBS)中,用户通过执行事务来访问数据库的数据对象。事务可以被认为是读写数据对象的一系列操作。数据库的数据对象可以被视为由事务获取(通过锁定)和释放(通过解锁)的资源。在 DDBS 中,等待图被称为事务等待图(TWF Graph)。

资源死锁与通信死锁的区别

资源死锁中,进程访问资源,例如数据库系统中的数据对象和存储转发通信网络中的缓冲区。进程在访问资源之前获取它,在使用后释放它。需要资源执行的进程在获取所有所需资源之前无法继续执行。如果进程集中的每个进程都请求由该集中的另一个进程持有的资源,那么该进程集就是资源死锁。

通信死锁中,消息是进程等待的资源。接收到消息可以将进程从等待状态中唤醒并解除阻塞。如果进程集中的每个进程都在等待来自该集中的另一个进程的消息,并且该集中的任何进程在收到它所等待的通信之前都不会开始任何其他通信,那么该集就是通信死锁。以下是资源死锁与通信死锁之间的一些区别。

资源死锁通信死锁
不能直接知道哪个事务依赖于哪个其他事务。在通信模型中,在进程继续执行之前,它可能知道它必须接收消息进行通信的进程的标识。
在资源分配模型中,进程在收到所有它正在等待的资源之前无法继续执行。在通信模型中,进程在能够与其正在等待的进程之一进行通信之前无法继续执行。
进程的等待是为了资源。进程的等待是为了消息。
如果集中的每个进程都寻求由集中的另一个进程持有的资源,并且必须在被解除阻塞之前获得所有请求的资源,则该进程集是资源死锁。如果集中的每个进程都在等待与集中的另一个进程进行通信,并且该集中的任何进程在收到它所等待的通信之前都不会开始任何其他通信,那么该集就是通信死锁。
可以通过安全状态来预防资源死锁。通信死锁不能通过安全状态来预防。

下一主题小型操作系统