1、死锁的概念
死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的
- 发生死锁的进程将无法继续推动下去,出现假死现象
- 死锁进程已获得的资源无法释放,导致系统资源的浪费
2、死锁产生的原因
死锁是与时间相关的错误
- 一组进程竞争非剥夺永久性资源或临时性资源
- 进程推进顺序不当
2.1 进程推进顺序不当引起的死锁
进程P1和P2均已占用了一部分资源而又要申请对方占用的资源导致阻塞,且所占资源后续又无法释放
2.2 死锁产生的原因——竞争资源
- 永久性资源:可以就永久性重复使用的资源
- 剥夺性资源(CPU、内存)(不会产生死锁)
- 非剥夺性资源(磁带机、打印机、扫描机)
- 临时性资源:只使用一次的资源(可消耗性资源),如信号量、中断信号、同步信号等
3、死锁产生的四个必要条件
- 互斥条件:至少有一个资源每次只能给一个进程使用
- 请求和保持条件:在申请新的资源的同时保持对原有资源的占有
- 不可剥夺条件:资源申请者不能强行从资源占有者中夺取资源,资源只能由占有者自愿释放
- 循环等待条件:存在一个进程—资源的循环链{P1,P2,P3,…,Pn}.
4、死锁的处理策略
- 预防策略:破坏产生死锁的四个必要条件之一
- 避免策略:精心的分配资源,动态的回避死锁
- 检测和解除:发生死锁后及时能检测出,并采取措施解除
- 鸵鸟策略:采用不理睬策略
4.1 预防策略
- 破坏互斥条件------互斥虚拟为共享
- 破坏不可剥夺条件-------主动放弃
- 破坏请求和保持条件------一次性申请所有资源
- 破坏循环等待条件------资源有序使用
4.2 死锁避免-策略
核心是OS判断系统是否处于安全状态,安全状态可分配申请的资源,否则拒绝分配资源,进程阻塞,从而避免死锁的发生
安全状态:系统能按某种顺序,为各个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成
避免死锁的实质是防止系统进入不安全状态
4.3 银行家算法
判断队请求的满足是否会导致银行进入不安全状态,如果是拒绝请求,如果满足请求后系统仍是安全的,就予以分配
数据结构:m为系统中资源种类,n为系统中进程
- 可用资源向量Available[m]
- 最大需求矩阵Max[n, m]
- 分配矩阵Allocation[n, m]:每一类资源当前已分配给每一进程资源数
- 需求矩阵Need[n, m]:Need = Max - Allocation
系统安全性状态检测
- 工作向量Work[m]:系统客人提供的各类资源数目
- 标志向量Finish[m]:系统是否有足够资源分配给进程
算法步骤:
- S1:Work:=Available(保存系统当前可用资源值); Finish:=false;(初始化所有进程为未完成状态)
- S2:寻找满足条件的 i ,满足Finish[i] = false(未完成状态); Need[i]≤Work(资源需求量小于可用量); 如果不存在,则转S4
- S3:Work:=Work+Allocation[i](释放已分配资源); Finish[i]:=true(完成状态); 转S2
- S4:若对所有 i ,Finish[i]=true,则系统处于安全状态,否则处于不安全状态