-
死锁
-
是指在并发计算中,两个或多个进程(线程)因为互相等待对方释放资源而无法继续执行的状态
-
-
造成死锁的四个必要条件
-
互斥条件:至少有一个资源被排他性地分配给一个进程或线程,即在一段时间内只能由一个进程或线程使用。其他进程或线程需要等待该资源释放
-
请求与保持条件:一个进程或线程在持有某些资源的同时又请求其他资源,而这些请求的资源已被其他进程或线程占用。当多个进程互相持有一些资源并且正在等待其他进程所拥有的资源时,就可能发生死锁
-
不可剥夺条件:已经分配给一个进程或线程的资源不能强制性地被收回,只能由持有者自愿释放。换句话说,任何一个已经获取到的资源无法被强制性地抢占
-
循环等待条件:存在一组进程或线程,每个进程都在等待下一个进程所拥有的资源,形成了循环依赖关系。例如,P1等待P2的资源,P2等待P3的资源,而P3又等待P1的资源。
-
-
死锁的处理方法
-
预防死锁:通过破坏死锁发生的必要条件之一来预防死锁。常见的方法包括资源分配策略、安全序列算法、避免环路等
-
避免死锁:根据系统状态和资源请求情况,采取动态地检测是否会导致死锁,并在避免可能导致死锁的操作。这可以通过银行家算法、资源分配图等方式实现
-
检测与恢复:定期对系统进行死锁检测,一旦检测到死锁,则采取相应措施解除死锁状态。常见的方法包括资源剥夺、进程终止与回收等
-
忽略与放任:在某些特定情况下,如果发生了死锁但影响较小或成本过高,可以选择忽略或放任。例如,在一些嵌入式系统中,为了简化设计和降低成本,并不处理所有可能发生的死锁情况
-
-
如何预防死锁
-
破坏互斥条件:确保不同进程或线程在访问资源时不会同时持有相同的锁。例如,通过使用共享资源代替独占资源来避免互斥
-
破坏占有且等待条件:要求进程在请求资源之前释放已经获得的所有资源,然后再重新申请所需的资源。这样可以避免一个进程持有某些资源而等待其他资源的情况。
-
破坏不可剥夺条件:允许系统强制性地撤销某些进程所占有的资源,以满足其他进程对资源的需求。这意味着一个正在执行的进程可能会被中断并暂停
-
破坏循环等待条件:为了避免死锁,需要对系统中所有可能用到的资源进行全局编号,并规定每个进程按照编号顺序请求资源。换句话说,一个进程只能按照一定顺序申请资源,而不能随意选择。
-