概念
- 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束;
- 占有且请求:一个进程本身占有欲资源,同时还有资源未得到满足,正在等待其他进程释放该资源;
- 不可被剥夺:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来;
- 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需要的至少一种资源。
检查死锁
- 可以通过依赖关系利用拓扑排序,查看是否有环的状态;
- https://blog.nowcoder.net/n/3b89794d3ae6408b96a50a30c5d8f0c5
避免死锁
银行家算法
- 当前系统可用资源(available);
- 进程的要求获取的资源(max),进程已经占有的资源(allocation),进程还需要的资源(need);
- 通过比较available与need的关系,如果小于说明当前进程是不安全的序列继续遍历,如果大于说明可以运行该进程,在进程链中删除该进程同时添加到安全序列中,将available的值更新为available + allocation。
- 参考(记得点个start):https://github.com/HSshuo/OperatingSystem/blob/master/src/hshuo/BankerAlgorithm.java
解决死锁
- 进程在开始运行之前,一次性的申请在整个运行过程中所有需要的全部资源,破坏了占有且等待;类似于spring解决循环注入的问题,参考:https://blog.nowcoder.net/n/9343e7c4215547eb82fbe7fe8f0dc1a1
- 将占用资源少的进程,将其占有的资源释放,以后需要的时候再重新获取,破坏了不可抢占条件;类似于MySQL解决死锁,将相对较短的事务回滚来释放锁资源;
- 通过定义资源的线性顺序来预防,可以将每个资源编号,当一个进程占有编号为i的资源时,那么该进程下一次申请资源只能申请编号大于i的资源,也就是破坏了循环等待。