操作系统笔记-2.4.2 死锁的处理策略—预防死锁
·
王道操作系统笔记,视频链接:2.4.2 死锁的处理策略—预防死锁
知识总览
- 死锁的处理:
- 不允许死锁发生
- 静态策略:预防死锁(本节重点)
- 破坏互斥条件
- 破坏不剥夺条件
- 破坏请求和保持条件
- 破坏循环等待条件
- 动态策略:避免死锁
- 静态策略:预防死锁(本节重点)
- 允许死锁发生
- 死锁的检测和解除
- 不允许死锁发生
- 知识回顾:死锁的产生必须满足四个必要条件,只要其中一个或者几个条件不满足,死锁就不会发生。
破坏互斥条件
- 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁。
- 如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。
- 比如:SPOOLing技术,操作系统可以采用 SPOOLing 技术把独占设备在逻辑上改造成共享设备。
- 用SPOOLing技术将打印机改造为共享设备:
- 改造前:进程1还没用完打印机之前,进程2申请使用打印机会阻塞
- 改造后:使用了SPOOLing技术后,在各进程看来,自己对打印机资源的使用请求立即就被接收处理了(由输出进程接收,然后按顺序处理),不需要再阻塞等待
- SPOOLing技术会在之后章节讲解。
- 缺点:
- 并不是所有的资源都可以改造成可共享使用的资源。
- 并且为了系统安全,很多地方还必须保护这种互斥性。
- 因此,很多时候都无法破坏互斥条件。
破坏不剥夺条件
- 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
- 破坏不剥夺条件:
- 方案一:
- 当某个进程请求新的资源得不到满足时,
- 它必须立即释放保持的所有资源,待以后需要时再重新申请。
- 也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。
- 方案二:
- 当某个进程需要的资源被其他进程所占有的时候,
- 可以由操作系统协助,将想要的资源强行剥夺。
- 这种方式一般需要考虑各进程的优先级
- 比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用
- 也就是要么主动释放,要么被动释放(被剥夺)
- 方案一:
- 缺点:
- 实现起来比较复杂。
- 释放已获得的资源可能造成前一阶段工作的失效。
- 因此这种方法一般只适用于易保存和恢复状态的资源,如CPU。
- 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
- 若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重新申请。
- 如果一直发生这样的情况,就会导致进程饥饿。
破坏请求和保持条件
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 可以采用静态分配方法,
- 即进程在运行前一次申请完它所需要的全部资源,
- 在它的资源未满足前,不让她投入运行。
- 一旦投入运行后,这些资源就一直归它所有,
- 该进程就不会再请求别的任何资源了。
- 举个例子:
- 原来:要A和B资源,系统检查,有A就给A,有B就给B
- 该方法:要A和B资源,系统检查,如果AB都有,那就都给,如果一者没有或都没有,那么进程A和B都拿不到,也就是要么不拿,要么全拿
- 缺点:
- ①有些资源可能只需要用很短的时间,
- 因此如果进程的整个运行期间都一直保持着所有资源,
- 就会造成严重的资源浪费,资源利用率极低。
- ②另外,该策略也有可能导致某些进程饥饿。
- 比如C类进程要资源1和2,A类进程要资源1,B类进程要资源2,
- 只要A和B源源不断,C就可能被饿死
- 和前面破坏不剥夺条件方法一的区别:
- 举例说明:如果进程需要进行两步,第一步只要A资源,第二步A和B资源都要,
- 那么前面的方法一就是,刚开始进程拿到A了,就走了第一步,
- 第二步想要B,发现没有,就把之前的A也释放了,后续需要重新申请A和B。
- 而该方法是最开始就需要把A和B都拿到,开始后A和B都不释放,要进程运行完了才释放,
- 如果最开始就没拿到A和B,那么就不开始。
破坏循环等待条件
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
- 可采用顺序资源分配法。
- 首先给系统中的资源编号,
- 规定每个进程必须按编号递增的顺序请求资源,
- 同类资源(即编号相同的资源)一次申请完。
- 也就是如果要两只筷子,那么两只筷子需要一次性申请,
- 不能先拿一只再拿另一只
- 原理分析:
- 一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。
- 按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,
- 从而就不会产生循环等待的现象。
- 比如进程需要资源1、2、3,那么申请资源2、3之前,必须占用了资源1。
- 假设系统中共有10个资源,编号为1, 2, … 10:
- 在任何一个时刻,总有一个进程拥有的资源编号是最大的,
- 那这个进程申请之后的资源必然畅通无阻。
- 因此,不可能出现所有进程都阻塞的死锁现象
- 缺点:
- 不方便增加新的设备,因为可能需要重新分配所有的编号;
- 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;
- 比如资源2是扫描仪,资源1是打印机,
- 进程要先用扫描仪扫描,再用打印机打印,
- 但是因为打印机顺序优先,所以进程申请扫描仪前需要先申请打印机,
- 此时打印机就会被占用,但是不会被使用,造成资源浪费
- 必须按规定次序申请资源,用户编程麻烦。
- 比如对于不同系统,扫描仪和打印机的编号顺序不同,
- 程序代码也需要按顺序修改,很不方便。
知识回顾与重要考点

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)