面试题答案
一键面试死锁检测机制设计
- 资源分配图算法(RAG):
- 构建资源分配图,图中节点分为进程节点和资源节点。进程节点通过请求边指向资源节点,表示进程请求该资源;资源节点通过分配边指向进程节点,表示该资源已分配给该进程。
- 周期性(根据实时性要求设定合适周期)执行深度优先搜索(DFS)遍历资源分配图。若在遍历过程中发现环,则表明存在死锁。例如,进程 P1 请求资源 R1,R1 已分配给 P2,P2 又请求资源 R2,R2 已分配给 P1,形成环,即死锁。
- 时间戳机制:
- 为每个进程和资源分配唯一时间戳。每次资源请求时,记录请求时间。
- 当检测到可能的死锁环(通过 RAG 检测到环)时,比较环中进程和资源的时间戳。例如,若进程 P1 请求资源 R1,而 R1 当前被 P2 占用,且 P1 的时间戳小于 P2(表示 P1 比 P2 更早启动),则认为 P2 可能导致死锁。
死锁应对机制设计
- 进程回滚:
- 当检测到死锁后,选择死锁环中时间戳最早的进程(即启动最早的进程)进行回滚。回滚到该进程最近一次成功分配资源之前的状态,释放其占用的所有资源。例如,若 P1 是时间戳最早的进程,回滚 P1 到上一个资源分配点,释放 P1 占用的资源 R3。
- 通知相关进程资源已释放,允许它们重新请求资源。
- 抢占资源:
- 对于一些可抢占资源(如 CPU 时间片),直接从死锁环中的进程抢占资源分配给其他进程。例如,若死锁环中有进程 P1、P2、P3,且 P1 占用了可抢占资源 R4,将 R4 从 P1 抢占出来分配给 P2 或 P3 以打破死锁。
- 对于不可抢占资源,标记该资源为不可用,等待占用该资源的进程执行完毕释放资源,同时调整资源分配图。
性能表现
- 高负载情况下:
- 检测性能:由于高负载时进程和资源数量众多,RAG 遍历时间会增加,导致死锁检测时间变长。但通过时间戳机制可以快速筛选出可能导致死锁的关键进程,一定程度上缓解检测压力。
- 应对性能:进程回滚和资源抢占操作会增加系统开销,因为回滚需要恢复进程状态,抢占可能影响进程执行连续性。但由于选择时间戳最早的进程回滚,能相对减少回滚的影响范围。
- 资源紧张情况下:
- 检测性能:资源紧张时资源请求频繁,RAG 更新频繁,死锁检测可能需要更频繁执行,增加系统开销。但时间戳机制可帮助快速定位死锁环。
- 应对性能:由于资源紧张,进程回滚释放的资源可能不足以打破所有死锁环,可能需要多次回滚或抢占操作,增加系统处理时间。
优化方向
- 检测优化:
- 分布式检测:将系统划分为多个区域,每个区域独立执行死锁检测,最后汇总结果。例如,在大型集群系统中,每个节点负责自身区域的检测,减少单个检测任务的规模。
- 增量检测:只在资源分配或请求发生变化时,更新资源分配图并进行局部检测,而不是每次都全局遍历。
- 应对优化:
- 智能回滚:不仅仅根据时间戳选择回滚进程,还综合考虑进程优先级、已执行任务量等因素。例如,高优先级进程尽量避免回滚,选择已执行任务量少的进程回滚。
- 资源预分配:在系统初始化或进程启动时,根据进程资源需求进行预分配,减少运行时资源请求冲突导致的死锁。