系统模型
死锁定义:当一组进程内的每个进程都在等待一个事件,而这一事件只能由这一组进程的另一个进程引起
死锁特征
必要条件:
互斥:资源非共享
占有并等待:一个进程占有资源并等待另一个资源,而该资源为其它进程占有
非抢占:资源不能被抢占,只能被进程完成后释放
循环等待:有一组等待进程{p0,p1…pn},p0等待p1,p1等待p2…,pn等待p0
死锁处理方法
预防
检测进入死锁并恢复
忽视(大多数操作系统采用的方法)
死锁预防
互斥:必须成立,否则不会参与死锁
持有且等待:1.每个进程在执行前申请并获得所有资源(资源利用率低)
2.一个进程申请更多的资源前,应释放已有资源(可能发生饥饿)
无抢占:一个进程持有资源并等待时,它以分配的资源可被抢占
循环等待:要求每个进程按递增顺序申请资源
死锁避免
安全序列:对于每个进程Pi,Pi仍然可以申请的资源数小于当前可用资源加上所有进程Pj(j<i)所占用的资源
- 资源分配图算法:
需求边Pi->Rj:进程Pi可能在某个时候申请资源Rj
分配边Rj->Pi:进程Pi申请了资源Rj
当进程Pi释放了资源Rj时,分配边重新变为需求边
将申请边Pi->Rj变成分配边Rj->Pi并且不会成环时,才允许申请资源
- 银行家算法:
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
检验系统状态是否安全:
查找没有完成的任务,且需要的资源<=可用资源,标记其为完成,可用资源+=该任务以分配的资源
直到所有任务都能够完成,说明系统处于安全状态
是否允许请求资源:
如果某个任务申请的资源<=该进程还需要的剩余资源(否则出错):
如果申请的资源<=可用资源(否则等待):
可用资源 -= 申请资源
该任务以分配资源 += 申请资源
该任务还需要的剩余资源 -= 申请资源
如果该状态安全,则可以执行分配;否则进程应当恢复到原来的状态并等待
死锁检测
找出一个未完成的任务,它申请的资源<=可用资源,标记它为完成,且可用资源 += 该任务已分配资源
如果找不到且存在任务未完成,系统死锁
死锁恢复
进程终止
资源抢占