参考链接
产生死锁的原因
系统资源的竞争
系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁
进程运行推进顺序不合适
进程在运行过程中,请求和释放资源的顺序不当,会导致死锁
死锁的四个必要条件
场景:如此这般,死锁就产生了
两个线程各自持有一个 无法共享(互斥条件) 的资源,并且他们 都需要获取(请求与保持条件)对方现在持有的资源 才能进行下一步,但是他们又 必须等对方释放了才能去获取(不可剥夺条件),于是 A等待B,B也在等待A(环路等待条件)
互斥(Mutual exclusion):一个资源每次只能被一个进程使用
请求与保持(Hold and wait):已经得到资源的进程可以再次申请新的资源,且对已获得的资源保持不放
不剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
预防死锁
可以通过 破坏死锁产生的4个必要条件来 预防死锁,由于资源互斥是资源使用的固有特性是无法改变的,所以考虑破坏其他三个条件
(实现简单,但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低)
破坏”请求与保持条件“:
第一种方法:静态分配即每个进程在开始执行时就申请他所需要的全部资源
第二种方法:动态分配即每个进程在申请所需要的资源时他本身不占用系统资源
破坏“不可剥夺”条件:
一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行
破坏“循环等待”条件:
采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程
避免死锁
也是预防死锁,但不会事先去破坏死锁的必要条件,只是有人请求资源时,用某种方法防止系统进入不安全的状态(死锁),从而避免发生死锁
银行家算法
基本思想是分配资源之前,判断系统是否是安全的;若是,才分配
检测死锁和解除
不采取措施防止死锁产生,允许系统产生死锁,但是可以通过一些手段检测出死锁,然后将死锁解除。
检测方法:
定时检测
效率低时检测
进程等待时检测
解除死锁方法:
根据具体业务场景,可以撤销或挂起死锁的进程/线程,使资源释放。