死锁的概念:死锁是指一组进程中的各个进程都占有不会释放的资源,但因相互申请其他进程不会释放的资源而处于一种永久等待状态。(请求与保持 和 循环等待撞在一块)
请求与保持通俗来讲:我加了A,然后去加B,如果不能加B,我也不释放A
循环等待通俗来讲:我加了A锁,然后去加B锁,对方加了B锁,对方想加A锁。(加锁顺序不当)
这样就陷入了一个回路,死锁就产生了。
产生死锁的条件(四个缺一不可)
1.互斥条件:一个资源每次只能被一个执行流使用
2.不可剥夺条件:一个执行流在未释放资源之前,不能强行剥夺
3.请求与保持:一个执行流因申请资源阻塞时,对已获取的资源保持不放
4.循环等待条件:若干条执行流形成首尾相接的循环等待资源的关系
避免死锁
1.破坏四个条件中的任何一个
2.加锁顺序一致
3.避免锁未释放场景:加锁和解锁永远要在一起。加了锁就必许要在任意有可能退出的地方解锁
4.资源一次性分配
避免死锁的算法
银行家算法思想:我们的系统分为安全和不安全状态,银行家算法考虑都有哪些锁,哪些执行流分配了哪些锁,哪个执行流想要加哪个锁,分配给执行流想要的锁之后是否会造成环路等待,是否系统运行进入不安全状态,如果有可能则不能分配。
死锁检测算法。