1. 死锁的定义:死锁是指在多道程序系统中,一组进程中的每一个进程均无限期地等待该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称为系统处于死锁状态。 处于死锁状态的进程称为死锁进程。
一个最简单的例子就是有资源A和资源B,都是不可剥夺资源,现在进程C已经申请了资源A,进程D也申请了资源B,进程C接下来的操作需要用到资源B,而进程D恰好也在申请资源A,那么就引发了死锁。
资源包括了软的资源(代码块)和硬的资源(例如扫描仪)。资源一般可以分两种:可剥夺资源(Preemptable)和不可剥夺资源(Nonpreemptable)。一般来说对于由可剥夺资源引起的死锁可以由系统的重新分配资源来解决,所以一般来说大家说的死锁都是由于不可剥夺资源所引起的。
2. 产生死锁的原因主要有两个:一是竞争资源,系统提供的资源数量有限,不能满足每个进程的需求;二是多道程序运行时,进程推进顺序不合理。
3. 死锁的必要条件:
互斥条件: 资源不能被共享,只能由一个进程使用。
不可剥夺条件: 已经分配的资源不能从相应的进程中被强制地剥夺。
请求和保持条件: 已经得到资源的进程可以再次申请新的资源。
循环等待条件: 系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
只要发生了死锁,那以上四个条件中至少有一个成立。
4. 解决死锁的办法:不让死锁发生:允许死锁发生,然后再加以解决。 具体的办法有以下几种:
预防死锁:设置某些严格限制,破坏产生死锁的条件以防止死锁产生,这一方法会导致系统资源利用率过低;
避免死锁:在资源的动态分配过程中,采取某种方法防止系统进入不安全状态,从而避免死锁的发生;
检测死锁:允许系统运行过程中发生死锁,即事先不采取任何预防,避免措施。但通过在系统中设置检测机构,可以及时检测出死锁是否真的发生,并能精确地确定与死锁有关的进程和资源,然后采取措施解除死锁;
解除死锁:这是与检测死锁相配套的措施,用于将进程从死锁状态下解脱出来。
5. 处理死锁的策略
(1)忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
(2)检测死锁并且恢复。
(3)仔细地对资源进行动态分配,以避免死锁。
(4)通过破除死锁四个必要条件之一,来防止死锁产生。
阅读(974) | 评论(0) | 转发(0) |