进程死锁

来源:互联网 发布:建站如何买域名和空间 编辑:程序博客网 时间:2024/06/07 01:54

一. 死锁定义

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁的发生必须具备以下四个必要条件:
  (1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
  (2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
  (3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
  (4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2, …… ,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,…… ,Pn正在等待已被P0占用的资源。

简单而言,就是形成一个闭环等待:
这里写图片描述

检测闭环也是一种检测死锁的方法,只要检测到闭环等待,就说明产生了死锁。

二. 解决死锁

解决死锁的方式主要有:
1. 预防死锁,事先预防的方法,通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。
2. 检测、解除死锁,这种方法并不须事先采取限制性措施。及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。一般就是闭环检测。
3. 避免死锁。与预防死锁一样,该方法同样是属于事先预防的策略。在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。经典的方法就是银行家算法。

三. 银行家算法

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
银行家算法实际上就是找到一个安全序列,来避免死锁的产生。

举个例子来说明,就很清楚了:

有3个进程{P1, P2, P3},两类资源{R1, R2},各自的总数量(S)为6, 3。

T0时刻各进程资源分配情况如下:
这里写图片描述
上表的关系为:
N=C-Ac
A=S-Ac

现在要找到一个安全序列,来避免死锁的产生。
这个例子比较简单,可以看出P2, P1, P3是一个安全序列。

  1. 执行P2,可用资源(2,1)>N(0,1),结束后,可用资源变为(2,2);
  2. 执行P1,可用资源(2,2)>N(1,1),结束后,可用资源变为(3,3);
  3. 执行P3,可用资源(3,3)>N(3,1)。

所以P2,P1,P3在T0时刻是一个安全序列。

原创粉丝点击