什么是死锁?

死锁的定义

在多线程编程环境中,都会给共享资源加上互斥锁防止共享资源被某一进程使用时其他进程进行访问或使用导致数据错乱,但是这就可能导致两个进程都会等待对方释放锁,那么这两个进程就会陷入相互等待的状态,没有外力介入,就无法进行下去。
死锁指两个或多个进程在相互持有对方所需要的资源且相互等待,导致它们永远无法继续执行下去的状态。

eg: 进程A持有资源1,等待资源2. 进程B持有资源2,等待资源1. 两个进程互相等待,陷入死锁状态

死锁的四个必要条件

  1. 互斥条件:多个进程不能同时使用同一资源。在某一时刻,一个资源只能被一个进程占有,如果另一个进程需要这个资源,必须等待。
  2. 持有并等待:进程在持有至少一个资源的情况下,可以请求其他资源,并且在等待其他资源时保持对已有资源的占有。
  3. 不可剥夺条件:某进程持有的共享资源不可以被强制剥夺,只能由该进程主动释放才能被其他进程获取
  4. 循环等待条件:发生死锁时,存在一个进程的循环等待链。链中的每个进程都在持有下一个进程所需要的资源,同时也在等待上一个进程持有的资源

如何预防死锁

防止死锁的发生,破坏死锁的四个必要条件之一即可:
使用资源有序分配,破坏环路等待条件。将系统中的资源进行编号,进程只能按照编号递增的顺序请求资源。或者每个进程必须按照相同的顺序申请自己想要的资源。

死锁检测和恢复

系统使用资源分配图来判断是否存在死锁,或者在进程请求资源时,使用银行家算法判断该请求是否导致系统进入不安全状态
一旦检测到死锁,可以通过强制终止一个或多个进程打破锁。或者从死锁进程中剥夺资源。或者回滚到之前的状态