一、死锁的四大条件
互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
循环等待条件: 若干进程间形成首尾相接循环等待资源的关系
二、如何避免死锁
1、系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。
2、银行家算法
- 申请的贷款额度不能超过银行现有的资金总额
- 分批次向银行提款,但是贷款额度不能超过一开始最大需求量的总额
- 暂时不能满足客户申请的资金额度时,在有限时间内给予贷款
- 客户要在规定的时间内还款
如果操作系统能保证所有进程在有限时间内得到需要的全部资源,则系统处于安全状态否则系统是不安全的。
三、死锁具体避免方法
1)设置加锁顺序
假如在多线程中,一个线程需要锁,那么他必须按照一定得顺序获得锁。
2)设置加锁时限
在获取锁的时候尝试加一个获取锁的时限,超过时限不需要再获取锁,放弃操作对锁的请求。
3)死锁检测
当一个线程获取锁的时候,会在相应的数据结构中记录下来,相同下,如果有其他线程请求锁,也会在相应的结构中记录下来。当一个线程请求失败时,需要遍历一下这个数据结构检查是否有死锁产生。
参考:https://blog.csdn.net/qq_38663729/article/details/80058980