什么是死锁
什么是死锁,如果你是个程序员,那么这概念肯定是不陌生的,死锁通常是指,在并发环境下,各个进程因竞争资源而造成一种相互等待的现象,导致的结果就是各个进程都处于阻塞状态,无法往下继续执行,这种情况就能称之为死锁
。
举个生活中的例子就是,张三和李四放学回家,走到家门口,张三却发现钥匙在李四那,同时李四也发现自己家的钥匙在张三那,就这样,两个人都不能进家门。
进程死锁、饥饿、死循环的区别
死锁
:各个进程相互等待对方手里的资源,导致各个进程都阻塞,程序无法进行往下执行。
饥饿
:由于长期得不到想要的资源,导致程序无法继续往下执行,比如说之前讲解进程调度算法中,短进程优先算法,由于一直不断的有短进程到来,导致长进程一直得不到 CUP 执行权,而从导致饥饿的现象。
死循环
:某个进程在执行过程中,一直跳不出循环的现象,这个可能是因为程序 BUG导致。
这三个有一个共同现象就是:都是进程无法正常的往下执行,但是三者还是有区别的:
死锁一定是循环等待对方手里的资源,至少有两个或者两个以上的进程同时发生死锁,而且发生死锁的进程一定是处于阻塞状态。
饥饿可能只有一个进程也会发生,发生饥饿的昵称可能是阻塞状态,也有可能是就绪状态。
而死循环最大的区别是,它是运行态,死循环的进程是可以在 CUP 上执行的,只不过无法正常的往下执行程序,这个是由代码逻辑的错误导致的。
死锁产生的必要条件
产生死锁必须同时满足四个条件,只要有其中任何一条不成立,死锁就不会发生:
1、互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。
2、不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走。
3、请求和保持条件:进程已经持有了至少一个资源,但是又同时请求新的资源,而该资源又被其他进程所占有,此时请求新资源的进程被阻塞,并且又没有释放自己手里的资源。
4、循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得资源啊的同时被下一个进程所请求。
注意:发生死锁时,一定有循环等待,但是发生循环等待不一定是死锁
什么时候会发生死锁
1、对系统资源的竞争:各个进程对不可剥夺的资源的竞争可能引起死锁,对可剥夺的资源竞争时不会引起死锁的。
2、进程推进顺序非法:请求和释放资源的顺序不当,同样也会发生死锁。例如:并发执行的进程 P1、P2 分别申请并且占有了资源 R1、R2,之后进程 P1 紧接着又申请资源 R2,而进程 P2 又申请资源 R1,两者会因为申请的资源被对方占用而阻塞,从而发生死锁。
3、信号量的使用不当也会导致死锁。
这三种情况,总而言之对不可剥夺的资源不合理的分配,可能会导致死锁。
死锁的处理策略
1、预防死锁:破坏死锁产生的四个必要条件中的一个或者几个。
2、避免死锁:用某种方法防止系统进入不安全状态,从而避免死锁。
3、死锁的检测和解除:允许死锁的发生,不过操作系统会负责监测死锁的发生,然后采取某种措施解除死锁。
这几种后面会有章节详细来讲。