一、什么是死锁
在并发环境下,各进程存在抢夺资源而造成的互相等待对方手里的资源,导致进程阻塞,无法向前推进叫死锁
二、死锁、饥饿和死循环的区别
死锁,至少2个进程一起死锁,死锁进程处于阻塞态
饥饿,可以是1个或多个进程,饥饿进程可以是阻塞态也可以是就绪态
死循环,可以是1个或多个进程,死循环进程可以是运行态
死锁和饥饿是操作系统分配资源的策略不合理导致,由操作系统解决,死循环是程序员解决
三、死锁产生的必要条件
注意:从数学层面理解充分和必要区别
- 互斥条件,对必须互斥的资源的争抢才会导致死锁,互斥意思就是只能有1个进程在用,其他进程必须等待其释放
- 不剥夺条件,进程占用的资源只能自己主动释放
- 请求和保持条件,进程保持着某些资源不放的同时,请求其他资源,典型吃着碗里瞧着锅里
- 循环等待,存在一种进程资源的循环等待链;循环等待未必死锁(比如Q符号,虽然闭环,但是有其他进程可以介入,释放等待的资源即可解锁),死锁一定是循环等待
四、什么时候会发生死锁
对不可剥夺资源的不合理分配,可能导致死锁
五、死锁的处理策略
5.1. 预防死锁
-
破坏互斥条件
将临界资源改造成共享资源(共享是宏观上的意思),比如SPOOLing技术;
代码层面就是第三方进程处理用户消息,同步变异步,哪个进程的请求先到先处理哪个进程的消息缺点,可行性不高,很多时候不能破坏互斥条件,即我们要按序处理消息
-
破坏不剥夺条件
方案一,设置进程主动释放,当进程请求新的资源得不到满足时,释放保持的所有资源进入阻塞态
方案二,设置系统强制剥夺,当进程需要的资源被某进程占有时,由操作系统协助踢走缺点,实现比较复杂
释放已获得的资源可能造成前一段工作的失效
反复申请和释放资源增加系统开销,降低系统吞吐量;
方案一可能导致一直释放资源,导致进程饥饿 -
破坏请求和保持条件
避免出现在程序运行中请求资源,直接在进程运行前把所有需要的资源申请好缺点,资源浪费,有些运行过程中没有用到的资源,比如我打开QQ我不一定要用摄像头资源
可能导致某些进程饥饿 -
破坏循环等待条件
编号,避免闭环请求资源,也叫顺序资源分配法缺点,不方便新增设备,因为需要重新编号
进程使用资源的顺序跟资源的编号顺序不一样
程序员可能要频繁修改代码
5.2. 避免死锁
-
安全序列,安全状态,死锁联系
- 安全状态,只要能找到一个安全序列,即按照这个序列分配资源能保证所有进程完成(完成时会回收资源)
- 不安全状态,找不到一个安全序列,这意味着所有进程没有办法再请求新的资源来满足自己运行,但是这些进程不一定需要请求新资源,可能还会提前归还前面的资源
- 如果操作系统处于安全状态,即会按安全序列来分配资源,肯定不会发生死锁,如果操作系统处于不安全序列,有可能发生死锁,有可能不发生
-
银行家算法
- 检查申请的资源有没有超过最初声明最大需求数
- 检查系统剩下的资源够不够分配这次的请求
- 试探分配(修改数据),剩下的系统资源能不能满足安全性算法
- 满足安全性算法,真分配(保存刚才修改的数据);不满足安全性算法,不处理(不保存刚才修改的数据),该进程进入堵塞态
-
安全性算法
- 首先明确它是银行家算法里的一个步骤
- 其次它的作用是预测现在的资源能不能满足其他进程
- 步骤:
- 检查当前的剩余可以用的资源是否满足内存中这么多进程里的一个,它的最大需求,找到1个就行
- 如果可以加入安全序列,回收该进程的资源,在内存划掉这个进程
- 经历了第二个步骤回收资源,现在系统资源会变多或者不变,再重复1,2步骤,直到内存中所有进程加入安全序列,说明安全状态,如果有进程无法加入安全序列,说明不安全状态
5.3. 死锁的检测和解除
背景:如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供两个算法
①死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁。
②死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来。
-
如何检测
-
数据结构:资源分配图
2种结点:进程结点,资源结点
2种边,请求边,进程结点->资源结点;分配边,资源结点->进程结点
-
死锁检测算法
- 先找出不阻塞进程(注意不能是独立的结点)
- 依次消除与该进程相连的边,直到无边可消(因为不阻塞进程正常可以正常运行结束归还资源,所以可以消除这些边)
- 如果还有剩下的边不能消除,说明发生了死锁
-
死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁
-
-
如何解除(死锁解除算法)
资源剥夺法,挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。撤销进程法,也叫终止进程法,强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
进程回退法,让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
-
针对死锁,如何决定对谁动手?
- 进程优先级
- 已执行多长时间,还要多久能完成
- 进程已经使用了多少资源
- 进程是交互式的还是批处理式的,交互式就是跟用户有互动的,比如QQ,批处理式就是执行一堆任务,用户看不见的,这种情况下,我们干掉交互式的进程,用户肯定不爽,所以可以优先干掉批处理式进程
欢迎交流评论关注,有问题直接指出!!!
欢迎交流评论关注,有问题直接指出!!!
欢迎交流评论关注,有问题直接指出!!!