死锁是指两个或多个进程(或线程)在互相请求对方持有的资源时,由于资源的互斥性和占有且等待条件,导致它们无法继续执行,进而导致系统无法进行下去的一种状态。
死锁的四个必要条件是:
- 互斥条件:至少有一个资源必须处于非共享模式,即一次只能被一个进程使用。
- 持有并等待条件:一个进程可以持有一个资源并等待另一个资源,而该资源又被另一个进程所持有。
- 非抢占条件:已经分配的资源不能被强制性地抢占,只能由持有它的进程显示释放。
- 循环等待条件:存在一组进程(或线程),每个进程都在等待列表中等待下一个进程所持有的资源。
为了避免死锁,可以采取以下几种策略:
-
破坏互斥条件:
- 尽量使用共享资源,减少互斥资源的数量。
-
破坏持有并等待条件:
- 一种常见的方式是采用资源预先分配的策略,即进程在开始执行前一次性申请所有需要的资源,如果无法满足,就不分配任何资源。
-
破坏非抢占条件:
- 当一个进程在请求资源时得不到满足,它必须释放已经持有的资源,防止资源被长时间占用。可以采用超时机制,如果请求资源的操作在一定时间内无法完成,就放弃请求并释放已经持有的资源。
-
破坏循环等待条件:
- 给资源编号,要求进程按照编号递增的顺序申请资源,当一个进程需要申请一个资源时,要求先释放所有已经申请的资源再重新申请。这样就打破了循环等待条件。
-
死锁检测与恢复:
- 系统周期性地检测是否有死锁的发生,一旦检测到死锁,就采取相应的措施进行恢复,例如剥夺资源、杀死进程等。
以上是几种避免死锁的常见策略,不同的场景可能采用不同的组合来尽量减少死锁的发生。