概念
指两个或以上进程因竞争临界资源而造成的一种僵局,即一个进程等待一个已经被占用且永不释放的资源
产生原因
根本:系统能够提供的资源个数比要求该资源的进程数要少
基本:资源竞争和进程推进顺序不合理
必要条件
互斥条件
涉及的资源是非共享的,即一次只能有一个进程使用。如果有另一个进程申请该资源,那么申请进程必须等待,直到该资源被释放
不剥夺条件
进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自行释放
占有并等待
进程每次申请它所需要的一部分资源。在等待一新资源的同时,进程继续占用已分配到的资源
环路等待
存在一种进程收尾相接的循环链,链中每个进程都在等待下一个进程所持有的资源,造成这组进程处于永远等待状态
处理策略
预防死锁
通过设置一些限制条件,破坏死锁的四个必要条件中的一个或几个,让死锁无法发生
预防死锁的方法破坏了系统的并行性和并发性,通常会降低系统的效率
避免死锁
在动态分配资源的过程中,用一些算法来防止系统进入不安全状态,避免死锁的发生
具体策略如下:
1. 如果进程请求的资源会导致死锁,系统就拒绝启动该进程;
2. 如果对一个资源的分配会导致下一步的死锁,系统就拒绝本次分配
银行家算法,是指分配资源之前先确定资源分配是否会造成系统死锁。如果会死锁,则不分配,只有确认不会死锁后才进行分配
银行家算法,需要按如下原则判断是否分配资源:
新进程进入系统时,它必须说明对各类资源的最大需求量,这一数量不能超过系统的资源总数。只有满足这一条件系统才接纳该进程。
当进程申请一组资源时,该算法需要检查进程对各类资源的最大需求量,如果系统现存的各类资源的数量可以满足此时的资源最大需求量时,就分配资源;否则进程必须等待,直到其他进程释放足够的资源为止。
进程需要在一定时间内无条件地归还它所申请的全部资源
死锁的检测及解除
死锁检测不会试图阻止死锁,即在死锁发生前不会做任何操作,只是通过设置的检测机制,检测当前是否发生死锁。若发生死锁,则采取一些措施来解除死锁
判断死锁法则
资源分配路径中没有环路,则系统不会出现死锁
资源分配路径中存在环路,则系统可能出现死锁
如果环路中的每个资料类中都只有一个资源,则系统存在死锁
如果环路中的每个资源类的资源个数不止一个,则环路的存在是产生死锁的必要条件但不是充分条件
解除死锁方法
资源剥夺法
剥夺陷入死锁的进程所占用的资源,但并不撤销此进程,再将这些资源分配给需要的进程,直至死锁解除
进程撤销法
一次性撤销陷入死锁的所有进程,回收所有占用的资源,等死锁解除后,再重新运行进程
逐个撤销陷入死锁的进程,依次回收其资源并重新分配,直至死锁解除。可以优先撤销优先级低、预计剩余执行时间最长、CPU消耗时间少的进程
进程回退法
让所有的进程回退到系统保存的检查点,这种方法要求系统建立并保存检查点、建立回退机制
系统重启法
结束所有进程并重启系统。这种方法很简单,但损失很大,先前的工作可能都浪费了