面试题答案
一键面试设计思路
- 资源层次化管理:将资源按类型和重要性划分为不同层次,高层次资源优先分配,低层次资源依赖于高层次资源的分配状态。这样在检测死锁和分配资源时可从高层次资源入手,减少搜索空间。
- 动态优先级调整:为每个线程根据其任务特性(如实时性、重要性等)赋予初始优先级,并在运行过程中根据资源占用时间、等待时间等因素动态调整优先级。高优先级线程优先获取资源,以保证关键任务的执行。
- 乐观分配与回滚:在进行资源分配时,先尝试乐观地分配资源,即假设分配不会导致死锁。如果后续检测到可能出现死锁,则进行资源回滚,重新调整分配策略。
关键数据结构
- 资源层次树:以树形结构组织资源,每个节点代表一种资源类型,父节点为高层次资源,子节点为低层次资源。节点包含资源数量、已分配数量等信息。
- 线程优先级队列:存储所有线程,根据线程优先级进行排序。每个线程记录其已占用资源、请求资源列表以及优先级。
- 等待图:用于死锁检测,图的节点为线程,边表示线程之间的资源等待关系。
算法流程
- 资源请求:线程请求资源时,首先检查资源层次树中对应资源类型是否有可用资源。若有,判断该线程优先级是否足够获取资源。若满足条件,尝试乐观分配资源,并更新资源层次树和线程状态。
- 死锁检测:定期(或在资源分配后)构建等待图,通过深度优先搜索(DFS)检查等待图中是否存在环。若存在环,则表示可能发生死锁。
- 死锁处理:若检测到死锁,从等待环中选择优先级最低的线程进行资源回滚,释放其占用的资源,并将其重新放入优先级队列。然后重新尝试分配资源给等待的线程。
- 优先级调整:在每个时间片结束时,根据线程的资源占用时间、等待时间等因素调整线程优先级。资源占用时间长则降低优先级,等待时间长则提高优先级。
不同负载情况下的性能表现
- 低负载情况:
- 乐观分配策略通常能成功,死锁检测频率低,系统性能接近无死锁检测时的理想状态,资源分配效率高,线程等待时间短。
- 由于线程竞争少,优先级调整对性能影响较小,但仍能保证关键任务优先执行。
- 中等负载情况:
- 乐观分配策略仍有较高成功率,但死锁检测频率会有所增加。由于资源层次化管理和优先级队列的存在,能快速定位和处理死锁,整体性能受死锁影响较小。
- 动态优先级调整能有效平衡不同线程对资源的需求,提高系统整体吞吐量。
- 高负载情况:
- 乐观分配失败次数增多,死锁检测和处理开销增大,但资源层次化管理可限制死锁搜索空间,减少检测时间。
- 通过动态优先级调整,可避免低优先级线程长时间饥饿,确保系统关键任务的执行,维持系统一定的响应能力,但整体性能会因资源竞争激烈而有所下降。