#操作系统-死锁
categories: 操作系统
这是我个人在学习操作系统的笔记。。。
死锁
定义:一组竞争系统资源或相互通信的进程,相互的“永久阻塞”。若无外力作用,这组进程将永远不能继续执行。
PS:简单的说,一组阻塞的进程持有一种资源,等待获取另一个进程所占有的一个资源。
可重复使用的资源
- 在一个时间内,只能一个进程使用且不能被删除
- 进程获得资源,在使用一段时间后就释放,释放的资源给其他进程重用
- 资料类型有:I/O通道,处理器,文件,数据结构,设备等
- 如果每个进程拥有一个资源,并请求其它资源,死锁就可能发生
使用资源
- 创建和销毁
- 在I/O缓冲区的中断,信号,消息,信息
- 如果接收消息阻塞,可能会发生死锁
- 可能少见的组合时间会引起死锁
基本情况
如果资源分配图不包括循环 ==>没有死锁
如果资源分配图包括循环 ==>
- 如果每个资源类只有一个实例,那么死锁
- 如果每个资源类有几个实例,可能死锁
死锁可能出现,如果下面四个条件同时成立
- 互斥:在一个时间内,只能有一个进程使用资源
- 持有并等待:进程保持至少一个资源正在等待获取其他进程持有的额外资源
- 无抢占:一个资源只能被进程资源释放,进程已经完成了它的任务之后
- 循环等待:存在等待进程集合{P0,P1…Pn},P0正在等待P1所占用资源,以此类推,Pn正在等待P0所占用的资源
PS:上面四个条件,是死锁的必要条件。就是说,死锁出现后,会有这四个条件。同时,这四个条件出现,不一定是死锁。
死锁处理的办法
- 确保系统永远不会进入死锁状态
- 运行系统进入死锁状态,然后恢复
- 忽略这个问题,假装系统中没有发生过死锁;目前大多数系统采用这种方法
死锁的预防和避免
- 限制申请方式
- 互斥 — 共享资源部署必须的,必须占用非共享资源。----->互斥变成不互斥的
- 占用并等待 — 必须保证当一个进程请求的资源,它不持有任何其他资源
需要进程请求并分配其所有资源,它开始执行前或运行进程请求资源时,仅当进程没有资源
导致资源利用率,可能发生饥饿
- 无抢占 —
如果进程占有某些资源,并请求其它不能被立即分配的资源,则释放当前正占有的资源
被抢占资源添加到资源列表中
只有当它能够获得旧的资源以及它请求新的资源,进程可以获得执行
- 循环等待 — 对所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请
- 需要系统具有一些额外的先炎信息提供
- 最简单和最有效的模式,是要求每个进程声明它可能需要的每个类型资源的最大数目
- 资源的分配状态是通过限定提供和分配的紫竹院数量,和进程的最大需求
- 死锁避免算法动态检查的资源分配状态,以确保永远不会有一个环形等待状态
- 当一个进程请求可用资源,系统必须判断;立即分配是否能使系统处于安全状态
-系统处于安全状态:针对所有进程,存在安全序列 - 序列<P1,P2…Pn>是安全的:针对每个Pi,Pi要求的资源能够有当前可用的资源 + 所有Pj持有的资源来满足,其中中J<i
如果Pi资源的需求不是立即可用,那么Pi可以等到所有Pj完成
当Pi完成后,Pi+1可以得到所需要的资源,执行,返回所分配的资源,并终止
同样的,Pi+2,Pi+3和Pn都能获得其所需的资源
PS:如果系统处于安全状态 ==>无死锁
如果系统处于不安全状态 ==>可能死锁
避免死锁:确保系统永远不会进入不安全状态
避免死锁-银行家算法
- 可利用资源向量Available:这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。
- 最大需求矩阵Max:这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
- 分配矩阵Allocation:这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
- 需求矩阵Need:这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要R j类资源K个,方能完成其任务。
- 上述三个矩阵间存在下述关系:Need[i, j] = Max[i, j] - Allocation[i, j]
–
死锁的恢复
- 终止所有的死锁进程
- 在一个时间内终止一个进程直到死锁消除
- 终止进程的顺序应该是:
进程的优先级
进程运行了多久,以及需要多少时间才能完成
进程占用的资源
进程完成需要的资源
多少进程需要被终止
进程是交互还是批处理
2.通过资源抢占
选择一个受害者 - 最小成本
回滚- 返回到一些安全状态,重启进程到安全状态
饥饿 - 同一进程可能一直被选作受害者,包括回滚的数量