📜  处理死锁

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

死锁是一个进程或一组进程被阻塞,等待某个其他等待进程持有的其他资源的情况。这是系统的不良状态。以下是发生死锁必须同时满足的四个条件。

  1. 互斥——
    一个资源一次只能被一个进程使用。如果另一个进程请求该资源,则必须延迟请求进程,直到资源被释放。
  2. 保持并等待 –
    某些进程必须以不可共享模式持有一些资源,同时必须等待获取更多资源,这些资源当前由处于非共享模式的其他进程持有。
  3. 不抢先——
    在流程完成其任务后,授予流程的资源只能作为该流程自愿操作的结果释放回系统。
  4. 循环等待——
    死锁进程包含在一个循环链中,这样每个进程都持有一个或多个资源,该资源被链中的下一个进程请求。

处理死锁的方法:
处理死锁的方法有3种。

1. Deadlock Prevention
2. Deadlock avoidance
3. Deadlock detection 

这些解释如下。

1. 死锁预防:
防止死锁的策略是以排除死锁可能性的方式设计系统。间接方法防止发生死锁的三个必要条件之一,即互斥、无抢占和保持等待。直接方法防止循环等待的发生。

预防技巧——
互斥 –由操作系统支持。

保持和等待 –可以通过要求进程一次请求其所有所需资源并阻塞该进程直到可以同时授予其所有请求来防止这种情况。但是这种预防不会产生好的结果,因为:

  • 需要很长的等待时间
  • 有效利用分配的资源
  • 一个进程可能无法提前知道所有需要的资源

    不抢占—— “不抢占”的技术

    • 如果持有某些资源的进程请求另一个不能立即分配给它的资源,则释放当前持有的所有资源,并在必要时与附加资源一起再次请求它们。
    • 如果一个进程请求另一个进程当前持有的资源,操作系统可能会抢占第二个进程并要求它释放其资源。这仅在两个进程没有相同的优先级时才有效。

    循环等待 确保这种情况永远不会成立的一种方法是强加所有资源类型的总排序,并要求每个进程以枚举的递增顺序请求资源,即,如果进程已分配类型 R 的资源,则它随后可能仅请求按顺序在 R 之后的那些类型的资源。

    2. 避免死锁:
    这种方法允许死锁的三个必要条件,但做出明智的选择以确保永远不会达到死锁点。它允许比回避检测更多的并发
    动态地做出当前资源分配请求是否会潜在地导致死锁的决定,如果被授予。它需要了解未来的流程请求。避免死锁的两种技术:

    1. 进程启动拒绝
    2. 资源分配拒绝

    死锁避免技术的优点:

    • 不需要抢占和回滚进程
    • 比死锁预防更少限制

    缺点:

    • 必须提前知道未来的资源需求
    • 进程可能会被长时间阻塞
    • 存在固定数量的资源分配

    3. 死锁检测:
    死锁检测是通过使用一种算法来跟踪循环等待并杀死一个或多个进程,从而消除死锁。定期检查系统状态以确定一组进程是否死锁。死锁是通过中止和重新启动进程,放弃进程持有的所有资源来解决的。

    • 此技术不限制资源访问或限制进程操作。
    • 尽可能将请求的资源授予进程。
    • 它从不延迟流程启动并便于在线处理。
    • 缺点是固有的优先购买损失。