现有一双筷子每支标为1,2(分开放)。有A,B两人竞争筷子来吃饭。当A拿到1后,要去拿2,此时却发现B已经拿到了2。而B要拿1时却发现它已经被A拿到。双方都希望对方能够放弃他所拥用的的一支筷子。而不愿放弃自己所拥有的。此时,二者便陷入了僵持状态,从而形成了死锁。
计算机中死锁的产生
计算机中的资源通常分为两类:一类叫可重用资源,一类叫可消耗资源
可重用资源
一次只能供给一个进程安全的使用,并不会因为使用而耗尽。当一个进程使用完后,该资源就被归还。然后可以再供给其他进程或线程使用。例如内存,外设,处理器等资源
可消耗资源
指可以被创建和销毁的资源。例如在生产者消费者模型中,生产者生产产品创建了资源,消费者取走产品从而销毁了资源。常见的有:信号,消息等资源。
竞争可重用资源产生死锁
例如现在内存大小共有4G。进程1总共需要3G,进程2总共需要3.5G。进程1首先申请了2G内存,进程2首先申请了1.5G内存,此时内存总量还剩余0.5G。
当进程1想要在申请剩余的1G时,内存资源不够了。进程2想要在申请2G时,内存当然也不够了。此时,进程1希望进程2释放它所拥有的1.5G内存。进程2希望进程1释放它所拥有的2G内存。双方都占着自己所拥有的资源等待着对方释放资源,此时二者便陷入了死锁状态。
竞争可消耗资源产生死锁
进程1和进程2之间通过消息进行通信。
(1)进程1发送消息m1给进程2
(2)进程2发送消息m2给进程1
(3)进程1接收消息m2
(4)进程2接收消息m1
如果按上述的(1)~(4)顺序执行,二者之间便可以进行正常通信。但是如果执行顺序为:(3)(4)(1)(2),此时二者都会发生阻塞而造成死锁。
通过上述的例子,可以得到以下死锁的结论。
死锁的定义
当一组进程中中的各进程都在等待某个事件发生(通常是等待资源的释放),但能够触发该事件的进程正处于阻塞中。此时,这组进程就发生了死锁。
死锁产生的四个必要条件
通过上述的几个例子可以得出死锁产生的四个必要条件,当以下四个条件均满足时,才会产生死锁。只要有一个不满足。就不会产生:
(1)互斥条件:各进程对某一资源必须是互斥的访问,当一个进程在访问时,请他进程只能等待
(2)请求和保持条件:指进程已经拥有了一个资源,还要在申请另一个资源。
(3)不可抢占条件:资源在只能被申请它的进程使用完后自动释放,请他进程不能抢占
(4)循环等待条件:如进程1等待进程2所拥有的资源,进程2等待进程3所拥有的资源,进程3等待进程1所拥有的资源。
有关避免死锁的算法理论见银行家算法一文