如果面试官问我们“说说什么是死锁,怎样预防死锁”,我们该如何回答呢?
详细回答
死锁的概念:
死锁的定义:
死锁是指在多个进程或线程执行过程中,由于资源竞争而导致的一种相互等待状态,从而使这些进程或线程无法继续执行。
死锁的原因:
资源竞争:在系统资源总量有限的情况下,多个进程或线程同时对这些资源发起争夺。例如多个进程同时申请使用打印机、内存区域等,一旦资源分配不当,就容易引发死锁。
进程推进顺序不当:进程或线程在执行时,其推进顺序有着内在逻辑要求。若由于程序设计缺陷或调度不合理等因素,导致进程或线程的执行顺序出现偏差,就可能使它们互相等待对方释放资源,从而陷入死锁。
死锁产生的必要条件:
互斥条件:系统中的资源具有排他性,在任意时刻,资源一次仅能被一个进程或线程占用,其他进程或线程若要使用该资源,必须等待当前占用者释放。
请求和保持条件:某个进程或线程在已经持有部分资源的同时,又向系统请求其他资源。在等待新资源分配的过程中,它不会主动释放已持有的资源,这就为死锁的产生埋下了隐患。
不可抢占条件:进程或线程一旦获得了某些资源,这些资源就不能被其他进程或线程强行夺取,只有持有资源的进程或线程主动释放,其他进程或线程才有机会获取。
循环等待条件:系统中存在一组进程或线程,它们形成了一个循环等待链。在这个链条中,每个进程或线程都在眼巴巴地等待下一个进程或线程所持有的资源,导致整个链条上的进程或线程都无法前行。
如何预防死锁?
破坏互斥条件:
允许资源共享,避免资源独占。多个进程或线程可以同时访问不改变状态的资源,如只读文件,从而提高资源利用率,减少死锁的可能。
破坏请求和保持条件:
在请求新资源时,要求释放当前资源,防止持有资源同时请求其他资源。采用一次性分配策略,即在任务开始前获取所有所需资源,确保资源分配过程清晰可控,降低死锁风险。
破坏不可抢占条件:
系统应能抢占资源,尤其在资源分配异常或资源长期被占用时。若资源请求失败,系统可收回部分资源,重新分配给紧急需求的进程,打破僵局,防止死锁。
破坏循环等待条件:
对资源进行排序,并要求进程按特定顺序请求资源。这种有序请求方式避免了循环等待链的形成,根本上杜绝了死锁的可能性。例如,按编号顺序请求资源,以确保所有进程遵循相同规则,防止资源争夺。
知识拓展
有死锁的资源分配图,如下所示:
死锁的处理方法
死锁预防(Deadlock Prevention):
死锁预防的原理是破坏死锁产生的必要条件,从而避免死锁发生。具体手段有:
- **破坏互斥条件**:让资源可被多个进程共享,比如只读文件能同时被多个进程读取。
- **破坏请求和保持条件**:要求进程请求新资源时,先释放已持有的资源,或者采用一次性分配策略,让进程在执行前就申请好全部所需资源。
- **破坏不可抢占条件**:允许系统抢占进程持有的资源,像强制回收资源。
- **破坏循环等待条件**:给资源排序,进程按顺序请求资源。这些方法通过约束资源分配,从根源上杜绝死锁。
死锁避免(Deadlock Avoidance):
死锁避免是动态检查资源分配状态,保证系统不进入不安全状态。其中,银行家算法最为经典。该算法要求每个进程声明最大资源需求,系统分配资源前,检查是否存在安全序列(即一种能让所有进程顺利完成的资源分配顺序)。若有安全序列,就分配资源,否则拒绝。这种方式不用限制资源分配,但需要提前知晓进程资源需求,计算成本也比较高。
死锁检测(Deadlock Detection):
死锁检测不预先限制资源分配,允许死锁出现。通过定期检查系统里进程和资源的状态,判断是否存在死锁。常见方法有资源分配图和定期检测算法。资源分配图通过查看有无环路判断死锁;定期检测算法模拟资源分配过程,看系统是否处于死锁状态。其优点是不限制资源分配,不过检测会消耗系统资源,检测出死锁后还得进一步处理。
死锁解除(Deadlock Recovery):
死锁解除是在检测到死锁后,采取措施让系统恢复正常运行。常用方法有终止进程和资源抢占。终止进程就是选择一个或多个死锁进程并结束它们,释放其占用资源;资源抢占是强制回收一个或多个死锁进程的资源,分配给其他进程。选择终止或抢占的进程时,一般会考虑进程优先级、运行时长、资源占用情况等,尽量减少对系统的影响。
友情链接:
Copyright © 2022 世界杯预选赛亚洲区_高达世界杯 - fzxzyy.com All Rights Reserved.