死锁必要条件及避免算法
1、死锁概念
当两个线程为了保护两个共享资源而使用了两个互斥锁,他们在应用不当的时候,造成互相等待对方解锁,在没有外力作用下会一直等待无法继续运行,发生了死锁。
本质原因
1、系统资源有限。
2、进程推进顺序不合理。
死锁在满足下列四个条件才会发生:
- 互斥条件
- 持有并等待条件
- 不可剥夺条件
- 环路等待条件
①互斥条件:多个线程不可同时使用同一个资源。
②持有并等待条件:
A在获取资源1,又想申请资源2,而此时资源2被C持有,A会进入等待状态,但是A在等待的时候不会释放自己持有的资源1。
③不可剥夺条件:
当线程已经持有了资源 ,在自己使用完之前不能被其他线程获取。
④环路等待条件:
在死锁发生的时候,两个线程获取资源的顺序构成了环形链。
2、 死锁预防:确保系统永远不会进入死锁状态。
-
最常见的并且可行的就是使用资源有序分配法,来破坏环路等待条件。有序会让资源的执行速度变慢。
-
破坏“持有并等待”条件
方法一:静态分配,每个进程在开始执行时就申请他所需要的全部资源。简单安全,但减低了资源利用率,会发生饥饿现象。
方法二:允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。 -
破坏“不可剥夺”条件
一个进程不可获得其所需要的全部资源便处于等待状态,等待期间他占用的资源将被隐式的释放重新加入到系统的资源列表中,可以被其他进程使用。
而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
复杂代价大,反复申请和释放会延长进程的周转周期,还会影响系统的吞吐量。
3、避免死锁 :在使用前进行判断,只允许不会产生死锁的进程申请资源
死锁避免是利用额外的检验信息,在分配资源时判断是否会出现死锁,只在不会出现死锁的情况下才分配资源。
两种避免办法:
1、如果一个进程的请求会导致死锁,则不启动该进程
2、如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请。
4、死锁检测与解除: 在检测到运行系统进入死锁,进行恢复。
常用的解除死锁的方法:
1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。