操作系统期末复习——第七章 死锁

第七章 死锁

1.分析死锁问题

1.1什么时候会发生死锁

  1. 进程占用一个资源
  2. 进程请求被其他进程所占用的资源

当一组进程都在等待一个事件,而事件只能由这组进程的另一个进程引起,那么这组进程就处于死锁状态

1.2死锁特征——必要条件

  1. 互斥
  2. 占用并等待
  3. 非抢占
  4. 循环等待:“衔尾蛇”

当以上四个条件都满足时会发生死锁

1.3资源分配图

由节点集合V和边集合E组成

  1. 节点集合V分为进程集合P和资源集合R
  2. 边集合E:P->R表示P申请使用R,R->P表示R已经分配给了P

如果分配图中没有环一定没有死锁发生!

如果分配图中有环,可能发生死锁

  1. 若每个资源类型中只有一个实例,一定发生死锁
  2. 若有多个实例,可能发生死锁

2.预防和避免死锁

2.1预防死锁

  1. 破坏互斥条件
    • 不可共享资源互斥——打印机
    • 可共享资源不互斥——只读文件
  2. 破环“占有并等待条件”
    • 每个进程在执行前申请所有资源
    • 只有不占有资源时才允许进程申请资源

以上两种方式的缺点——资源利用率低,可能发生饥饿

  1. 破坏“非抢占条件”:
    • 一个进程请求的资源被其他进程占有,可以抢占该资源
  2. 破坏“循环等待条件”:
    • 给每个资源分配一个唯一的整数
    • 进程按整数递增的顺序申请资源

2.2避免死锁

避免死锁指的是确保系统不进入不安全状态,是一种动态的方法

2.2.1资源分配图算法

资源分配图算法适用于每个资源具有单个实例时

引入需求边虚线P-->R,表示进程P未来可能申请资源R

以后申请时虚线变实线

算法规则:只有申请边变分配边时不会导致资源分配图成环时才允许申请资源

2.2.2银行家算法

适用于资源中有多实例

  1. 安全性算法:确定计算机系统是否处于安全状态
  2. 资源分配算法:判断能否安全允许请求的算法

数据定义:n位进程个数,m位资源类型数

  1. Available(1* m向量)表示可分配的资源数,A[i] = k表示第i中资源还有k个
  2. Max(n * m矩阵)表示每个进程的资源最大需求数
  3. Allocation(n * m 矩阵):表示占有的资源数
  4. Need(n * m 矩阵):表示仍需要的资源数

资源分配算法伪代码:

if(Request[i] <= Need[i]){
    if(Request[i] <= Available[i]){
        Available[i] -= Request[i];
        Allocation[i] += Request[i];
        Need[i] -= Request[i];
        do SafetyCheck;//安全性检查算法
    }else{
        waiting;
    }
}else{
    error;
}

安全性检查伪代码:

work = Available;
for all i
    finish[i] = false;
for all i{
    if(finish[i] == false && Need[i] <= work){//当前进程需要的资源小于空闲的资源
        work += Allocation[i]//将空闲的资源分配给该进程,并在进程结束后将资源全部回收作为空闲的资源
        finish[i] = true;
    }
}
if (for all i,finish[i] == true){//每个进程都能按上边的方式获得资源执行完毕,则该序列为安全的
    System is safe
}

P4请求不可,P0可以

3.死锁的检测和恢复

3.1死锁的检测

3.1.1等待图法

适用于资源只有单个实体的检测算法

取消了资源分配图中的资源节点,P->P代表一个进程在等待另一个进程释放资源

  • 如果图中有环则存在死锁

3.1.2运用银行家算法的安全性检查算法进程检测

代码:

work = Available;
for all i
    if(Allocation[i] != 0){
        finish[i] = false;
    }else 
        finish[i] = true;

for all i{
    //当前进程需要的资源小于空闲的资源
    if(finish[i] == false && Need[i] <= work){
    //将空闲的资源分配给该进程,并在进程结束后将资源全部回收作为空闲的资源
        work += Allocation[i]
        finish[i] = true;
    }
}
//只要有一个进程不能执行完毕,系统处于死锁状态
if (there is a i -> finish[i] = false){
    System is in deadlock
}

何时使用检测算法取决于:

  1. 死锁发生的频率
  2. 死锁发生时,多少进程会受影响

3.2死锁恢复

  1. 结束所有进程
  2. 每次结束一个进程,直到没有死锁

需要考虑的是:要避免每次取消的都是一个进程——会导致饥饿

回滚:把不能正常运行的进程回滚到某个安全状态,以便重启进程

posted @   朝寝暮眠  阅读(117)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示