0%

操作系统之死锁(七):破坏死锁

1. 破坏死锁概述

  • 死锁本质上是无法避免的,因为它需要获得未知的资源和请求,但是死锁是满足四个条件后才出现的,它们分别是
    • 互斥
    • 保持和等待
    • 不可抢占
    • 循环等待

2. 破坏互斥条件

  • 我们首先考虑的就是破坏互斥使用条件。如果资源不被一个进程独占,那么死锁肯定不会产生。如果两个打印机同时使用一个资源会造成混乱,打印机的解决方式是使用 假脱机打印机(spooling printer) ,这项技术可以允许多个进程同时产生输出,在这种模型中,实际请求打印机的唯一进程是打印机守护进程,也称为后台进程。后台进程不会请求其他资源。我们可以消除打印机的死锁
  • 后台进程通常被编写为能够输出完整的文件后才能打印,假如两个进程都占用了假脱机空间的一半,而这两个进程都没有完成全部的输出,就会导致死锁
  • 因此,尽量做到尽可能少的进程可以请求资源

3. 破坏保持等待的条件

  • 第二种方式是如果我们能阻止持有资源的进程请求其他资源,我们就能够消除死锁。一种实现方式是让所有的进程开始执行前请求全部的资源。如果所需的资源可用,进程会完成资源的分配并运行到结束。如果有任何一个资源处于频繁分配的情况,那么没有分配到资源的进程就会等待
  • 很多进程无法在执行完成前就知道到底需要多少资源,如果知道的话,就可以使用银行家算法;还有一个问题是这样无法合理有效利用资源
  • 还有一种方式是进程在请求其他资源时,先释放所占用的资源,然后再尝试一次获取全部的资源

4. 破坏不可抢占条件

  • 破坏不可抢占条件也是可以的。可以通过虚拟化的方式来避免这种情况

5. 破坏循环等待条件

  • 现在就剩最后一个条件了,循环等待条件可以通过多种方法来破坏。一种方式是制定一个标准,一个进程在任何时候只能使用一种资源。如果需要另外一种资源,必须释放当前资源。对于需要将大文件从磁带复制到打印机的过程,此限制是不可接受的。另一种方式是将所有的资源统一编号,如下图所示

  • 进程可以在任何时间提出请求,但是所有的请求都必须按照资源的顺序提出。如果按照此分配规则的话,那么资源分配之间不会出现环

  • 尽管通过这种方式来消除死锁,但是编号的顺序不可能让每个进程都会接受

-------------------- 本文结束感谢您的阅读 --------------------