目录
死锁的必要条件
四个必要条件:
- 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
- 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
- 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
- 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
例如:线程A持有资源1,线程B持有资源2。
- 线程A与线程B的资源无法被强制性抢占(不可抢占);
- 资源1与资源2在同一时间只能被一个线程使用(互斥);
- 线程A占有资源1时可以去获取其他的资源,线程B也可(占有与等待);
- 线程A占有资源1区尝试获取资源2,线程B占有资源2尝试去获取资源1(环路等待)
死锁的处理方法
鸵鸟策略
假装根本没发生死锁问题。
因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。
当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。
大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。
死锁检测与死锁恢复
不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。
1. 每种类型一个资源的死锁检测
每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。
2. 每种类型多个资源的死锁检测
3. 死锁恢复
- 利用抢占恢复
- 利用回滚恢复
- 通过杀死进程恢复
死锁预防
在程序运行之前预防发生死锁。
破坏互斥条件
例如假脱机打印机技术允许若干个进程同时输出,唯一真正请求物理打印机的进程是打印机守护进程。
(资源不互斥,而是共享的方式存在)
破坏占有和等待条件
一种实现方式是规定所有进程在开始执行前请求所需要的全部资源。
(哲学家拿到左筷子右筷子之后才能占有使用,只拿到一个而获取不到另一个不加锁)
破坏不可抢占条件
破坏环路等待
给资源统一编号,进程只能按编号顺序来请求资源。
死锁避免
在程序运行时避免发生死锁。
算法判断对请求的满足是否会进入不安全状态,如果是,就拒绝请求;否则予以分配。