重要的概念和目标:
前提: 多道程序系统中(单道程序系统是不会出现死锁的情况的)
定义: 多个进程竞争资源造成的一种僵局;
和之前共享资源的互斥定义不一样,互斥是同一种资源,只是再某些不合理的调度算法下 只有一个进程长期得不到响应而陷入“饥饿”的现象 例如 一个进程占据着输入设备然后申请使用打印机,另一个进程占据着打印机申请输入设备 这样两个进程无休止的等待下去就形成了死锁
系统的资源的竞争
只有不可剥夺的资源竞争才会造成死锁,对于可以剥夺的资源不会造成死锁
进程推进顺序非法
请求和释放资源的顺序不当也会造成死锁,信号量使用不当也会造成死锁
必要条件
1. 互斥条件 所要求的资源具有排他性,一次性只能给一个进程服务,其他请求进程只能等待 2. 不剥夺条件 进程再资源未使用结束之前,不会被其他进程强行夺走,只能由自己来释放 3. 请求并保持 已经保持了至少一个资源,又提出了新的资源请求,再新的资源请求阻塞的时候 对已经获得的资源保持不释放 4. 循环等待 等待的资源形成一个循环链,一直等待也不会有资源释出
策略 | 资源分配 | 可能模式 | 优点 | 缺点 |
---|---|---|---|---|
死锁的预防 | 保守,宁可资源闲置 | 一次性请求所有资源 | 突发处理进程,不剥夺 | 效率低,进程初始化长,次数过多 |
死锁的避免 | 预防与检测的这种,运行时判断是否可能死锁 | 寻找安全的允许顺序 | 不必剥夺 | 计算将来的资源需求,不能长时间阻塞 |
死锁的检测解除 | 宽松,只要允许就分配 | 定期检查是否发生死锁 | 允许死锁现场处理 | 通过剥夺解除死锁造成损失 |
死锁的预防就是破坏死锁的4个条件之一即可:
破坏互斥的条件:
不可能执行,破坏互斥条件;有些场合需要保护这种互斥性
破坏不可剥夺
再请求的资源得不到满足之后,释放之前占有的资源。破坏不可剥夺的条件;
造成前面一段时间工作内容失效; 增加系统开销,降低系统吞吐量,常用于易于保存回复的资源例如CPU,寄存器。不能用于打印机等等
破坏请求并保持条件
静态分配法,一次性分配所有资源,再没有满足条件资源之前不投入运行(获取CPU),运行过程中一直保持资源。
破坏循环等待条件
给资源进行编号,必须按编号递增的顺序请求资源,编号必须相对稳定,限制了新类型设备的增加
允许动态的申请资源
每次申请资源,批准之前进行予批准计算系统安全状态。如果分配后安全则允许分配。否则让进程等待
银行家算法 - 死锁避免算法
数据结构表示:
可用资源向量 : 鄙视现在系统中各个可用资源的项目数量
最大需求矩阵: 每个进程会用到的最大的各个资源的数目
分配矩阵: 当前各个进程已经占有的各个资源的数目
需求矩阵: 各个进程接下来还需要的资源的数矩阵
计算过程描述 :
例题: 3个资源被共享 R1,R2,R3 总量分别是 18,6,22 ;
在某个时刻时,他们的情况如下所示,计算此时的安全序列。
进程 | R1 | R2 | R3 |
---|---|---|---|
P0 | 5 | 5 | 10 |
P1 | 5 | 3 | 6 |
P2 | 4 | 0 | 11 |
P3 | 4 | 2 | 5 |
P4 | 4 | 2 | 4 |
进程 | 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. 如果可以消除所有的边则没有死锁