什么是死锁
每个人都占有一个资源,同时又在等待另一个人手里的资源,发生死锁
在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象就是死锁,发生死锁后若无外力干涉,这些进程都无法向前推进
进程死锁,饥饿,死循环的区别
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象,比如在短进程优先的算法中,如果源源不断有短进程到来,那么长进程一直得不到处理机就会被饿死
死循环:某种进程在执行的过程中一直跳不出某个循环的现象,有时是因为程序逻辑bug导致的,有时是程序员故意设计的
死锁产生的必要条件
必须满足以下四个条件,任何一个不成立,死锁就不会发生
1.互斥条件:只有对必须互斥使用的资源的抢夺才会导致死锁,比如哲学家的筷子或者打印机设备,想内存还有扬声器这样可以同时让多个进程使用的资源是不会导致死锁的,因为进程不用阻塞等待这种资源
2.不可剥夺条件:进程获得的资源在未使用完之前,是不可让其他进程强行夺走的,只能主动释放
3.请求和保持条件:进程已经保持了至少一个资源,但是又提出了新的资源请求,但是又对自己已经有的资源保持不放
4.循环等待条件:存在一种进程循环的等待链,链中的每一个进程已获得的资源同时被下一个进程需求
发生死锁的时候一定有循环等待,但是发生循环等待时未必死锁
如果同类资源数量大于1,即使有循环等待页未必发生死锁,但是如果系统中每一类资源都只有一个,那么循环等待就是死锁的充要条件了
什么时候会发生死锁
对资源的竞争,各进程对不可剥夺的资源的竞争可能引起死锁,对可剥夺的资源竞争是不会引起死锁的
进程推进顺序非法,请求和释放资源的顺序不当,同样会引起死锁
信号量使用不当也会造成死锁
总之就是对不可剥夺的资源的不合理分配会造成死锁
死锁的处理策略
1.预防死锁:破坏死锁产生的四个必要条件中的一个或者几个
2.避免死锁:用某种方式放置系统进入不安全状态,从而避免死锁(银行家算法)上一节的作业里有这个
3.死锁的检测和接触:允许死锁发生,不过操作系统会负责监测处死锁的发生,然后才去某种措施解除死锁