死锁产生的原因:
1、系统资源不足;
2、进程运行推进的顺序不合适;
3、资源分配不当等。
死锁产生的四个必要条件:
1、互斥条件:一个资源每次只能被一个进程使用
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
3、不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
---------------------------------------------------------------
银 行 家 算 法
算法的目的: 解决死锁问题
算法应用条件:
- 固定的线程数
- 能够获得每个线程所需要的最大资源数
- 使用资源的时间是有限的
- 等待资源的时间是有限的
- 不能申请比资源总数还多的资源
算法的实际过程:
- 会先对申请资源这个动作做出响应的分配,结果有分配成功和分配失败
- 分配成功后,资源、进程等实例会共同构成一个新的状态,但是这个状态类似于git中的暂存区,还没有进行真正的提交,只是一个可提交也可撤销的中间状态。
- 对中间状态进行判断,如果新产生的中间状态能够保证一个安全序列,那么整体的资源分配就是可行的,否则进行逆向操作。并且安排当前申请资源的线程进入等待状态。
如何判断是否安全???
- 维护出一个目前每种资源剩余可用的数组,Avaliable[],和一个与线程总数目等长的Finish[]数组,初始值为false。
- 遍历所有的线程,查看线程是否可以完成相应资源的获取并且还可以满足其他线程资源的申请。先要检查当前线程是否已经完成,如果没有检查获取相应的资源是否可以得到满足。如果可以,转3
- 将当前线程的状态转换为已经结束,true。再将当前线程占用的所有资源归还给Avaliable[]数组。然后循环的遍历所有线程,转2
- 如果遍历完毕所有线程,都可以得到对应的Finish[i]都为true。
如果可以,则证明是一个安全状态
否则,不安全状态