概念
- 条件是基础,在一定的原因下,产生结果
死锁三胞胎
- 死锁 僵持,消耗时间,双方都占用了部分资源,不释放
- 活锁 双方互相谦让,都不占用资源
- 饥饿 谦让的一方一直等待,无法占有资源,导致饥饿问题
死锁的原因以及必要的条件
应用程序 信号量使用不当
- 信号量的初始值设置错误,设为0,两个进程都卡死;
- 解决办法 :代码开发人员 和 代码测试人员
semaphore s1 = 0;
semaphore s2 = 0;
A(){while(1){p(s1);吃饭;v(s2);}
}B(){while (1){p(s2);喝茶;v(s2);}}
OS内核程序 不可剥夺的软硬件资源
- 多进程对不可剥夺资源的竞争
- 进程申请资源的顺序不合理
死锁的必要条件
死锁产生了,一定会产生如下四个条件;但是具有这四个条件不一定会造成死锁
- 互斥条件 临界资源
- 不可剥夺条件 进程之间不可以互相剥夺彼此的资源
- 请求保持条件 占有资源不主动释放
- 循环等待条件
预防死锁
破坏死锁的必要条件
- 互斥条件 临界资源 几乎行不通,比如更改临界资源
- 不可剥夺条件 进程之间不可以互相剥夺彼此的资源 需要付出代价,也有,比如cpu的切换;但是如果是打印机,会造成彼此文件交叉融合
- 请求保持条件 占有资源不主动释放 一次性申请完临界资源
- 循环等待条件 递增编号,按照顺序申请资源。比如一个资源切成两份,第一份资源叫1,第二份资源叫2,A申请资源1,B在申请的时候看到1号资源已经被占用,就需要等待,A继续申请2号资源,当A使用完资源,释放之后。B开始申请,按照资源的序号进行资源的申请
避免死锁
- 银行家算法 计算安全序列
- 规划合理的资源申请顺序,提高资金的流转速度
- 安全序列 找到 无死锁 可以避免;找不到 必死锁 无法避免
- 因此将1000万借给万达,收回3000万借给万科或者恒大都可以
- 访问顺序 万达 万科 恒大;万达 恒大 万科
例1
例2
死锁的检测与解除
死锁定理和资源分配图
- 化简 如果可以化简到最简则无死锁
- 不能化简到最简模式则检测到死锁,进行下一步解除死锁,1,资源剥夺法;2,报销进程法;3,进程回退法
资源分配图
- 圆圈代表进程
- 长方形代表一类资源的容器
- 长方形中的圆圈,代表该类资源,数量代表资源的数目
- 边 :从长方形指向圆圈,代表已分配边;圆圈指向长方形,代表申请边,请求边
- 寻找圆圈进程,依次尝试,判断p1的申请边(从圆圈指出的边)是否都可以得到满足,满足则删除,不满足则寻找下一个圆圈进程
死锁的解除
- 资源剥夺法
- 撤销进程法 进程停止运行
- 进程回退法 进行由运行80%出现死锁,进程回退到70%等待,继续执行