Linux教程

操作系统学习笔记 2.2 - 死锁

本文主要是介绍操作系统学习笔记 2.2 - 死锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

死锁

重要的概念和目标:

  1. 什么是死锁
  2. 死锁的形成
  3. 如何避免死锁

死锁的形成 dead lock

前提: 多道程序系统中(单道程序系统是不会出现死锁的情况的)
定义: 多个进程竞争资源造成的一种僵局;

和之前共享资源的互斥定义不一样,互斥是同一种资源,只是再某些不合理的调度算法下
只有一个进程长期得不到响应而陷入“饥饿”的现象 
例如 一个进程占据着输入设备然后申请使用打印机,另一个进程占据着打印机申请输入设备
这样两个进程无休止的等待下去就形成了死锁 
形成的原因
  1. 系统的资源的竞争

    只有不可剥夺的资源竞争才会造成死锁,对于可以剥夺的资源不会造成死锁

  2. 进程推进顺序非法

    请求和释放资源的顺序不当也会造成死锁,信号量使用不当也会造成死锁

  3. 必要条件

     1. 互斥条件 
     所要求的资源具有排他性,一次性只能给一个进程服务,其他请求进程只能等待
     2. 不剥夺条件
     进程再资源未使用结束之前,不会被其他进程强行夺走,只能由自己来释放
     3. 请求并保持
     已经保持了至少一个资源,又提出了新的资源请求,再新的资源请求阻塞的时候
     对已经获得的资源保持不释放
     4. 循环等待
     等待的资源形成一个循环链,一直等待也不会有资源释出
    

死锁的处理策略优劣

策略 资源分配 可能模式 优点 缺点
死锁的预防 保守,宁可资源闲置 一次性请求所有资源 突发处理进程,不剥夺 效率低,进程初始化长,次数过多
死锁的避免 预防与检测的这种,运行时判断是否可能死锁 寻找安全的允许顺序 不必剥夺 计算将来的资源需求,不能长时间阻塞
死锁的检测解除 宽松,只要允许就分配 定期检查是否发生死锁 允许死锁现场处理 通过剥夺解除死锁造成损失

死锁的预防

死锁的预防就是破坏死锁的4个条件之一即可:

  1. 破坏互斥的条件:
    不可能执行,破坏互斥条件;有些场合需要保护这种互斥性

  2. 破坏不可剥夺
    再请求的资源得不到满足之后,释放之前占有的资源。破坏不可剥夺的条件;
    造成前面一段时间工作内容失效; 增加系统开销,降低系统吞吐量,常用于易于保存回复的资源例如CPU,寄存器。不能用于打印机等等

  3. 破坏请求并保持条件
    静态分配法,一次性分配所有资源,再没有满足条件资源之前不投入运行(获取CPU),运行过程中一直保持资源。

  4. 破坏循环等待条件
    给资源进行编号,必须按编号递增的顺序请求资源,编号必须相对稳定,限制了新类型设备的增加


死锁的避免

允许动态的申请资源
每次申请资源,批准之前进行予批准计算系统安全状态。如果分配后安全则允许分配。否则让进程等待

银行家算法 - 死锁避免算法

数据结构表示:
可用资源向量 : 鄙视现在系统中各个可用资源的项目数量
最大需求矩阵: 每个进程会用到的最大的各个资源的数目
分配矩阵: 当前各个进程已经占有的各个资源的数目
需求矩阵: 各个进程接下来还需要的资源的数矩阵

计算过程描述 :

例题: 3个资源被共享 R1,R2,R3 总量分别是 18,6,22 ;
在某个时刻时,他们的情况如下所示,计算此时的安全序列。

  • 最大需求矩阵 Max
进程 R1 R2 R3
P0 5 5 10
P1 5 3 6
P2 4 0 11
P3 4 2 5
P4 4 2 4
  • 已经分配的矩阵 Allocation
进程 R1 R2 R3
P0 3 2 3
P1 4 0 3
P2 4 0 5
P3 2 0 4
P4 3 1 4
剩余 2 3 3

首先根据最大需求矩阵Max和已经分配矩阵Allocation计算需求矩阵
Need = Max - Allocation

需求矩阵

进程 R1 R2 R3
P0 2 3 7
P1 1 3 3
P2 0 0 6
P3 2 2 1
P4 1 1 0

当前剩余的资源 2,3,3 其中可以满足P1 ~ P4的进程所以是处于安全状态
假如首先满足了P3的需求 ,剩余资源为0,1,2,等待P3完成后可以获取全部的P3的资源

4,2,5 + 0,1,2 = 4,3,7

对于剩下的所有进程都可以满足

依次类推可以获得一个安全的序列为 P3,P4,P2,P1,P0;


死锁的检测及解除

资源分配图 部分图例解释

进程 圆形
资源 矩形+个数⭕
箭头 进程-> 资源 请求边
箭头 资源 -> 进程 分配边

化简 :

1. 找到非孤立的进程
2. 检查请求边的资源是否可以满足 
3. 可以满足消除请求边,以及该进程的分配边
4. 如果可以消除所有的边则没有死锁 
死锁的解除
  1. 资源剥夺法
    挂起死锁的进程,并抢夺他的资源。来推进其他进程
  2. 撤销进程法
    强制撤销部分或者全部死锁进程
  3. 进程回退发
    让一个或者多个进程回退道足以回避死锁的地步

这篇关于操作系统学习笔记 2.2 - 死锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!