📜  处理死锁

📅  最后修改于: 2021-08-25 10:35:06             🧑  作者: Mango

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

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

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

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

这些解释如下。

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

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

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

  • 需要很长的等待时间
  • 有效利用分配的资源
  • 流程可能不预先知道所有必需的资源

    无抢占- “无抢占”技术

    • 如果某个进程正在保留某些资源,而请求另一个不能立即分配给它的资源,则当前正在保留的所有资源都会被释放,如果有必要,请与附加资源一起再次请求它们。
    • 如果某个进程请求当前由另一个进程持有的资源,则OS可能会抢占第二个进程并要求其释放其资源。仅当两个进程没有相同的优先级时,此方法才有效。

    循环等待确保此条件永不成立的一种方法是强加所有资源类型的总顺序,并要求每个进程以递增的枚举顺序请求资源,即,如果已为某个进程分配了R类型的资源,则它随后可能仅请求按顺序跟随R的那些类型的资源。

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

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

    避免死锁技术的优点:

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

    缺点:

    • 必须提前知道未来的资源要求
    • 流程可能会长期受阻
    • 存在固定数量的分配资源

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

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