答案 1
最佳答案
死锁是什么?彼此拥有对方正在申请的互斥量,解决方法:
- 按照一定的先后顺序申请这些互斥量。
产生死锁的必要条件
- 资源互斥;如果是共享不存在死锁等待
- 非抢占:如果可以抢占直接抢占
- 循环等待:必要不充分条件,同时等待时可以顺序执行,除非出现环路等待
解决死锁的基本方法
- 破坏互斥:使用类似CAS无锁结构
- 破坏不抢占:锁获取失败时自动放弃持有的锁,并重试
- 破坏环路等待:按顺序请求锁,给锁排序、给线程(安全序列)
怎么预防死锁?
- 破坏请求条件:一次性分配所有资源,这样就不会再有请求了;
- 破坏请保持条件:只要有一个资源得不到分配,也不给这个进程分配其他的资源;
- 破坏不可剥夺条件:当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源;
- 破坏环路等待条件:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反。
避免死锁的算法
银行家算法
- 当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
- 当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请资源数之和是否超过了该进程对资源的最大需求量。
- 若超过则拒绝分配资源。若没超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若满足则按当前的申请量分配资源,否则也要推迟分配。
解决死锁
- 资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其它死锁进程(但应该防止被挂起的进程长时间得不到资源);
- 撤销进程:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源(撤销的原则可以按进程优先级和撤销进程代价的高低进行);
- 进程回退:让一个或多个进程回退到足以避免死锁的地步。进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。