目录
一.进程死锁、饥饿、死循环的区别:
死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。永远在互相等待的进程称为死锁进程。
饥饿:由于长期得不到资源导致进程无法推进;
死循环:代码逻辑BUG。
二. 死锁
1.1 死锁产生的原因
- 系统资源的竞争
- 进程的不恰当推进顺序
- 简单来说,死锁产生的原因就是自己不释放资源还羡慕着别人的资源。
1.2 死锁的定义
死锁:多个进程因竞争资源而造成的一种僵局或者一种阻塞现象,如果没有外力这些进程将永远 无法推进。
1.3 产生进程死锁的4大必要条件:
- 互斥条件:独占资源而产生死锁 - 互斥条件是指多个线程不能同时使用同一个资源,若一个线程已经拥有了该资源,那么其它想获取该资源的线程就需要阻塞等待。
- 请求与保持条件:请求与保持条件是指线程已经拥有了一个资源,但又提出了新的资源请求,请求新资源的同时又保持自己原有的资源不释放,而请求新资源时新资源已被其它线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放。
- 不可剥夺条件:线程获得的资源在未完成使用前不能被剥夺(包括OS),只能由进程自身释放。不可剥夺条件就是指当一个资源被线程获取了之后,如果该线程不主动释放该资源,那么该资源一直被占有,其它想获取该资源的线程就要一直进行等待。
- 循环等待条件:是指在发生死锁时,必然存在进程-资源环形链(两个线程获取资源的顺序购构成了环行链),环路中每一个线程所占有的资源同时被一个线程申请,也就是前一个线程持有后一个线程所申请的资源,环路等待不一定造成死锁,但是死锁一定有循环等待。
- 右上图可知,死锁产生的原因都是自己不释放资源还羡慕别人的资源!
1.4 死锁的解决方法/处理策略
一. 预防死锁(破坏四个必要条件中的一个或多个)
- 破坏互斥条件(一般不会,因为事实上我们操作系统不仅不返回互斥,还非常支持互斥):将独占改为共享,将临界资源改为共享资源
- 破坏不可剥夺条件:请求新资源无法满足时必须释放已有资源
- 破坏请求与保持条件:请求新资源的时候不再保持原有资源
- 破坏循环等待条件(一般是这个):对所有资源进行排序,要求进程按照序号来申请 / 请求资源
二. 避免死锁
- 安全状态:安全状态一定不会发生死锁,安全状态是按照最坏的情况排列的,不安全状态不一定会发生死锁。
- 银行家算法:检查当前资源剩余是否可以满足某个进程的最大需求;如果可以,就把该进程 加入安全序列
三. 检测死锁
- 利用死锁原理
四. 解除死锁
- 资源剥夺法,撤销进程法,进程回退法