操作系统中的死锁


当两个或多个进程需要某些资源才能完成执行,而这些资源却被其他进程持有时,就会在操作系统中发生死锁。

Deadlock in Operating System

在上图中,进程1拥有资源1,需要获取资源2。同样,进程2拥有资源2,需要获取资源1。进程1和进程2处于死锁状态,因为它们都需要对方的资源才能完成执行,但两者都不愿意释放其资源。

Coffman条件

如果四个Coffman条件都成立,则会发生死锁。但这些条件并非相互排斥的。

Coffman条件如下:

  • 互斥

    应该有一个资源,一次只能被一个进程持有。在下图中,资源1只有一个实例,并且仅被进程1持有。

    Mutual Exclusion
  • 持有并等待

    一个进程可以持有多个资源,并且仍然可以向持有这些资源的其他进程请求更多资源。在下图中,进程2持有资源2和资源3,并正在请求进程1持有的资源1。

    Hold and Wait
  • 不可抢占

    不能强行从进程中抢占资源。进程只能自愿释放资源。在下图中,进程2无法从进程1抢占资源1。只有在进程1完成执行后自愿释放资源1时,进程2才能获得资源1。

    >No preemption
  • 循环等待

    一个进程正在等待第二个进程持有的资源,而第二个进程正在等待第三个进程持有的资源,以此类推,直到最后一个进程正在等待第一个进程持有的资源。这形成了一个循环链。例如:进程1被分配了资源2,并正在请求资源1。同样,进程2被分配了资源1,并正在请求资源2。这形成了一个循环等待循环。

    Circular Wait

死锁检测

资源调度程序可以检测死锁,因为它会跟踪分配给不同进程的所有资源。检测到死锁后,可以使用以下方法解决:

  • 终止所有参与死锁的进程。这不是一个好方法,因为所有进程已经完成的工作都将被破坏。
  • 可以从某些进程中抢占资源,并将其提供给其他进程,直到解决死锁为止。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

死锁预防

在死锁发生之前预防死锁非常重要。因此,系统在执行每个事务之前都会检查它,以确保它不会导致死锁。如果即使有一点点可能性,一个事务将来可能会导致死锁,那么它将永远不会被执行。

死锁避免

最好避免死锁,而不是在死锁发生后采取措施。等待图可用于避免死锁。然而,这只对较小的数据库有用,因为它在较大的数据库中可能会变得相当复杂。

更新于:2023年9月10日

42K+ 浏览量

启动您的职业生涯

通过完成课程获得认证

开始学习
广告