死锁

死锁定义和产生的根本原因

两个p进行交换

哲学家进餐问题,每个哲学家都拿不到右边的筷子,而阻塞等待,而且永远等待下去。

  1. 死锁的定义

一组进程因竞争资源而造成的一种僵局,即每个进程都占有部分资源,同时又需得到已被该组进程中其他占用的资源,若无外力作用,这些进程将永远处于等待状态

一种死锁状态的例子

假设系统中有一个R1,一个R2资源,一次只允许一个进程使用,P1申请一个R1,再申请一个R2;P2申请一个R2,再申请一个R1;

P1:
P(R1);
P(R2);
...
V(R1);
V(R2);

P2:
P(R2);
P(R1);
...
V(R2);
V(R1);

  1. 死锁产生的根本原因
    (1) 竞争资源
    (2) 进程推进顺序不当

P1:
P(R1);
P(R2);
...
V(R1);
V(R2);

P2:
P(R2);
P(R1);
...
V(R2);
V(R1);

产生死锁的四个必要条件:

(1) 互斥条件

对于独占资源,每个资源每次只能给一个进程使用,进程一旦申请到了资源后占为已有,则排斥其它进程共享该资源。

(2) 不剥夺条件

正在使用的资源不可剥夺,进程获得的资源尚未使用完毕之前,只能由占有者自己释放,不能被其它进程强行占用。

(3) 请求和保持条件

进程因未分配到新的资源而受阻,但又不放弃已占有的资源。

(4) 环路等待条件

存在进程的循环等待链,前一进程占有的资源正是后一进程所需求的资源,结果就形成了循环等待的僵持局面。

上面四个条件是在死锁发生时同时出现的,我们可以利用它们的逆否命题,即:四个条件中只要有一个不满足,则死锁不会发生。这正是我们预防死锁所需考虑的方法。

死锁不仅会发生在两个进程之间,也可能发生在多个进程之间,甚至发生在全部进程之间。此外,死锁不仅会在动态使用外部设备时发生,而且也可能在动态使用存储区、文件、缓冲区、数据库时发生,甚至在进程通信过程中发生。随着计算机资源的增加,系统出现死锁现象的可能性也大大增加,死锁一旦发生,会使整个系统瘫痪而无法工作。因此,要想办法解决死锁问题。

死锁的处理方法

  • 死锁预防 破坏必要条件
  • 死锁避免 银行家算法
  • 死锁检测 死锁定理
  • 死锁解除 剥夺资源、撤销进程

1.死锁的预防

采取某种策略,限制并发进程对资源的请求,从而保证死锁的必要条件在系统执行的任何时间都不能得到满足。

2.死锁的避免

是指系统在分配资源时,根据资源的使用情况提前做出预测,给定一个合适的安全的进程推进顺序,从而避免死锁的发生。实现起来有一定的难度,但在一些较完善的系统中,常用这种方法。

3.死锁的检测

允许系统发生死锁。系统设有专门的机构,当死锁发生时,该机构能够检测到死锁的发生,并能确定参与死锁的进程及相关资源。

4.死锁的解除

这是与死锁检测相配套的措施,用于将进程从死锁状态中解脱出来。

常用的解除死锁的方法有两种:

  • 一种是强制性地撤销一些死锁进程,并剥夺它们的资源给其余进程;

  • 另一种是使用一个有效的挂起机构来挂起一些进程,以便从被挂起进程中剥夺一些资源来解除死锁。

posted @ 2020-04-14 00:18  insist钢  阅读(217)  评论(0编辑  收藏  举报