目录
前言
死锁是在多线程或多进程环境下由于资源竞争而导致的系统僵局。了解和破坏死锁的四个必要条件,可以有效地预防或解决死锁问题。
什么是死锁?
死锁是一种计算机系统中的状况,通常发生在多线程或多进程环境中。当多个线程或进程彼此等待对方持有的资源释放时,它们就陷入了一种永远无法继续执行的状态,这种情况称为死锁。
死锁发生的条件
死锁的产生需要满足以下四个必要条件,也称为 Coffman条件 或 死锁的四个必要条件:
-
互斥条件:至少有一个资源必须处于非共享模式,即某个线程对该资源的独占访问,其他线程无法同时访问该资源。
-
占有且等待条件:一个线程已经占有至少一个资源,并且在等待获取其他被其他线程占有的资源时不释放已占有的资源。
-
不可剥夺条件:已经获得的资源在未被使用完之前,不能被强制剥夺,只能由占有它的线程主动释放。
-
循环等待条件:在发生死锁时,必然存在一个线程-资源的循环链。即线程A持有资源1并等待资源2,而线程B持有资源2并等待资源1,从而形成一个环形等待链。
死锁的解决方法
要解决或预防死锁,可以采用以下几种策略:
-
破坏互斥条件:
- 可以通过将资源变为可共享的方式避免死锁,但这通常不适用于硬件资源(如打印机)等必须独占的资源。
-
破坏占有且等待条件:
- 在请求资源之前,线程需要先释放已经持有的所有资源,然后重新请求所需的所有资源。
- 采用银行家算法来确保在申请资源时,系统仍然能够满足安全状态的要求。
-
破坏不可剥夺条件:
- 当一个线程持有的资源被其他线程请求时,如果该线程无法立即得到所需的资源,则它必须释放已经占有的资源,然后重新尝试获取所有资源。
-
破坏循环等待条件:
- 为资源分配一个顺序编号,所有线程必须按照这个顺序请求资源,从而避免循环等待。
- 例如,要求所有线程首先请求最低编号的资源,然后再请求编号更高的资源。
死锁的检测与恢复
除了预防死锁,还可以通过死锁检测和恢复的方式来处理死锁:
-
死锁检测:
- 定期或在某些资源请求被拒绝后,系统可以运行死锁检测算法,以识别是否存在死锁。
- 死锁检测通常会构建一个资源分配图,检查是否存在循环。
-
死锁恢复:
- 一旦检测到死锁,可以通过强制终止某些线程并释放它们占有的资源,或者通过回滚其中某些线程的操作来恢复系统。