死锁,银行家算法

来源:互联网 发布:孙叔敖之知翻译 编辑:程序博客网 时间:2024/05/22 17:47

死锁:由于竞争资源和通信关系,两个或者更多线程在执行中出现,永远相互等待只能由其他进程引发的事件

我们知道操作系统中很多种资源,如CPU,内存,IO设备等,每种资源又有很多实例,对于这些资源,进程该如何访问?

  1. 请求/获取:申请空闲资源
  2. 使用/占用:进程占用资源
  3. 释放:资源状态由占用变为空闲

为了更好的了解死锁,我们将资源分类:

这里写图片描述

造成死锁必须要满足以下条件:

如果在系统中已经出现死锁后,应该及时检测到死锁的发生,并采取适当的措施来解除死锁。目前处理死锁的方法可归结为以下四种:

1) 预防死锁。
  这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

对于互斥条件,可以设为共享资源可同时访问;
对于持有并等待,设为进程请求资源必须不能持有其他资源,也就是说,要么不申请资源,要么一次性申请完所有资源;
对于不抢占(不剥夺)条件,如果进程请求不能理解分配的资源就释放掉已经占有的资源;
对于循环等待条件,对资源排序,要求进程按照顺序申请资源


2) 避免死锁。
  该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。

这里写图片描述

在这里,需要提醒一点就是:

系统在安全状态下一定不会死锁,但是在不安全状态可能死锁也可能不死索,因此我们需要防止系统进入不安全状态就一定可以避免死锁。

如何防止系统进入不安全状态?银行家算法为我们提供了一个很好的办法:

这里写图片描述

这里写图片描述


3)检测死锁。
  这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。


4)解除死锁。
  这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

0 0
原创粉丝点击