死锁的基本概念
就像“过独木桥”一样 // 你不让我,我不让你
死锁问题是如何产生的??就是竞争资源但是资源又不够
So,共享资源是如何获取和释放的??——申请–>使用–>释放
死锁的必要条件
- 互斥
- 不可剥夺
- 请求并保持(部分分配):“吃着碗里的看着锅里的”
- 环路等待
附:当发生死锁时,四个条件同时成立
描述进程和资源之间的关系时,可以用资源分配图来表示
一组顶点的集合V和边的集合E
V: 系统中的全部进程集合P + 系统中的全部资源集合R
E: Pi --> Ri (请求边) Ri --> Pi (分配边)
①如果资源分配图中无环,那么不会有死锁
②如果资源分配图有环,若每一种资源类型只有一个实例,那么死锁发生;若每种资源有多个实例,可能死锁。
下图是有环的资源分配图没有死锁例子 ,P2不需要等待,执行后释放,释放R1,P1准备被满足;然后再看P4…
死锁预防
忽略、预防、检测、避免、解除五种方法可以分为三个层次
- 鸵鸟策略:(忽略)
- 确保系统永远不会进入死锁状态:(预防 + 避免)
- 死锁发生(允许系统进入死锁状态),恢复系统:(检测 + 解除)
预防 即抑制死锁发生的必要条件,互斥(不可抑制)、占有并保持(必须保证进程申请资源的时候没有占有其他资源)、非抢占、循环等待(将所有资源类型放入资源列表中,并且要求进程按照资源表申请资源)
避免 即确保系统永远不会进入不安全状态
安全状态指的是系统能按照某种顺序来为各个进程分配其所需资源,直至最大需求,使每个进程都可顺序地一个个地完成的状态
死锁避免 允许进程动态的去申请资源,然后系统来判断把资源分配给你,系统会不会在一个安全的状态,如果是,就分配;否则就不予分配。有两种判别方法
①资源分配图
②银行家算法

银行家算法
Request <= Need , Request <= Available
Available = - Request
Allocation= + Request
Need = - Request
安全算法
Need <=Work
Work = Work + Allocation
死锁检测和解除
- 每一种资源类型只有一个实例(资源分配图转换成等待图,看看是否存在环)
- 一个资源类型的多个实例(死锁检测算法,类似于安全性算法)
发现死锁后如何解除??
——人工处理
——终止进程(全部终止 // 一次终止一个 // 计算时间后比较后终止)
——资源抢占(最小代价化,选个牺牲品 // 回退到安全状态再重新开始进程 // 饥饿)|| 逐步从进程中抢占资源,直到死锁被打破