死锁
1 死锁的定义
到底什么是死锁?(下面是从《操作系统概念》所摘录的)
在多道程序环境中,多个进程可以竞争有限数量的资源。当一个进程申请资源时,如果这时没有可用资源,那么这个进程进入等待状态。有时,如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变状态。这种状态称为死锁
。
说实际一点就是,当一组进程内的每个进程都在等待一个事件,而这一个事件只能由这一组进程的另一个进程所引起,那么这组进程就处于死锁状态。
作为一个开发人员,死锁的避免对我们来说相当重要,应该特别注意如何获得和释放锁
2 死锁的特征
当死锁时,进程永远不能完成,系统资源被阻塞使用,以致于阻止了其他作业开始执行。下面是产生死锁的必要条件,如果在一个系统中以下四个条件同时成立,那么就可能引起死锁:
互斥:
至少有一个资源必须处于非共享模式,即一次只能够一个进程可以使用,如果另一进程申请该资源,那么申请进程应该等到该资源释放为止。占有并等待:
一个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。非抢占:
资源不可以抢占,即资源只能被进程在完成任务后自愿释放。循环等待:
有一组等待进程『a,b,c,d,e,f』,a等待的资源为b所占有,b等待的资源为c所占有,c等待的资源为d所占有…一直循环下去。
以上四个条件必须全部满足才会死锁!!!!!!
3 死锁的处理方法
一般来说,处理死锁问题有三种方法:
- 通过协议来预防或避免死锁,确保系统不会进入死锁状态
- 可以允许系统进入死锁状态,然后检测它,修复它
- 可以忽视这个问题,认为死锁不可能在系统内发生。
第三个方法为大多数操作系统所采用,所以应用程序开发人员需要自己编写程序,以便处理死锁。
为了确保不会发生死锁,系统可以采用死锁预防
或死锁避免
方案。死锁预防
方法确保至少有一个必要条件不成立。死锁避免
要求操作系统事先得到有关进程申请资源和使用资源的额外信息。
3.1 死锁预防
确保至少一个必要条件不成立,就能预防死锁发生。
- 破坏互斥条件
- 破坏占有和等待条件
- 破坏不可抢占条件
- 破坏环路等待