死锁是指两个或两个以上的进程在执行过程中,由于对资源的互斥访问等原因导致这些进程因为缺乏资源而运行不下去,永远相互等待的情况。所以很容易想到产生死锁就必须有几个条件。
产生死锁的四个必要条件:
● 互斥条件:是指两个或多个进程不能同时访问这个共享资源,只能一个一个错开来访问资源。
● 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,但是该资源被其他进程占有,而且必须互斥访问,则这个进程就一直在等那个资源,但对自己已有的资源又保持不放。
● 不可剥夺条件:指每个进程已经获得的资源是不可能被其他的进程强行夺取的,只能自己运行完了或者其他条件自己主动来放弃。
● 循环等待条件:简单点说就是p1等p2,p2等p0,p0又等p1。成为了一个循环等待链。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。所以我们就可以从破坏这四个条件出发去解决死锁。
解决死锁
预防死锁
● 打破互斥条件:SPOOLing技术,但是大部分资源已无法改造。
● 打破请求与保持条件:进程一次性就申请所有需要的资源,如果申请不到那就先等待。(资源利用率低,可能产生饥饿)
● 打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则释放原有的资源。或者通过操作系统的协助去抢夺他人的资源(这种情况要考虑优先级的情况)。
● 打破循环等待条件:有序的去分配资源。
避免死锁
- 银行家算法
死锁避免和死锁预防的区别:
死锁预防是设法至少破坏产生死锁的四个必要条件之一防止死锁的出现;死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。