死锁

什么是死锁,死锁产生的四个必要条件是什么,如何理解这些条件?

什么是死锁

死锁所指范围比较宽泛,这里我们局限在操作系统中,特指进程死锁,至于其他方面,原理是一样的。

维基百科上的定义

当两个以上进程都在等待对方停止执行,以获取系统资源,但是没有一方提前退出时,系统进入停滞状态,此时就称为发生死锁。

还有一种定义

如果一个进程集合里面的每个进程都在等待只能由这个集合中的其他一个进程(包括他自身)才能引发的事件,这种情况就是死锁。

一个简单的例子,
资源R1、R2是互斥资源,进程P1拥有资源R2,但需要资源R1,进程P2拥有资源R1,但需要资源R2,如下图所示,
此时就会发生死锁,

process deadlock

死锁产生的四个必要条件

  1. 互斥条件(mutual exclusion)
    某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。
  2. 不可抢占条件(no preemption)
    进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,
    而只能由该资源的占有者进程自行释放。
  3. 占有且申请条件(hold and wait)
    进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;
    但是,它在等待新资源之时,仍继续占用已占有的资源。
  4. 循环等待条件(bounded waiting)
    存在一个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,
    ……,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。

四个条件缺一不可,所以避免死锁只要破坏任意一个或者多个条件即可。