1.基本概念:
死锁(Deadlock)是指在并发系统中,两个或多个进程因相互等待而陷入永久阻塞状态的情况。死锁通常发生在计算机系统中的多线程或多进程环境下,当每个进程都在等待其他进程释放某些资源时,系统就会出现死锁。
2.死锁的四个必要条件:
死锁的发生需要满足以下四个条件,称为死锁的四个必要条件:
互斥条件(Mutual Exclusion):每个资源要么已经分配给一个进程使用,要么是可用的。
占有且等待条件(Hold and Wait):一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件(No Preemption):进程已获得的资源在未使用完之前不能被强行剥夺,只能在使用后自己释放。
环路等待条件(Circular Wait):存在一个进程—资源的循环链,其中的每个进程都在等待下一个进程持有的资源。
3.为了避免死锁,通常有以下几种策略:
(1).破坏“互斥条件”:将资源设计为可共享的,使得多个进程可以同时访问资源。例如,对于读操作,可以允许多个进程同时读取数据而不相互排斥。
(2).破坏“占有且等待条件”:进程在申请资源之前,必须释放自己当前占有的资源,然后重新申请所需资源。这可以通过静态分配所有资源或请求所有资源前释放已有资源来实现。
(3).破坏“不剥夺条件”:当一个进程已经占有了一些资源但无法获得新的资源时,它必须释放已经占有的资源。这样可以避免死锁的情况。
(4).破坏“环路等待条件”:可以通过对资源进行线性排序,并要求进程按一定顺序请求资源来避免环路的形成。例如,可以规定所有进程按照从低到高的顺序请求资源,这样就不会出现环路等待的情况。
4.死锁的处理方法
(1).预防策略(Deadlock Prevention):通过确保至少有一个死锁条件永远不会发生来避免死锁。
(2).避免策略(Deadlock Avoidance):在资源分配之前动态地检查是否会发生死锁,如果可能会发生,则拒绝该分配请求。银行家算法是一种经典的死锁避免算法。
(3).检测与恢复(Deadlock Detection and Recovery):允许系统进入死锁状态,但定期检测系统是否发生死锁。一旦检测到死锁,通过终止进程或撤销部分进程的资源请求来恢复系统。
(4).鸵鸟算法(Ostrich Algorithm):一种不处理死锁的策略,假装死锁不会发生。这种策略通常用于死锁发生概率很低且代价不高的场景。