面试题答案
一键面试死锁检测算法
- 资源分配图算法(如银行家算法的变体)
- 数据结构:维护资源分配表,记录每个进程已分配的资源和请求的资源;资源状态表,记录每种资源的总数和可用数。
- 检测过程:
- 首先标记所有未完成的进程为“未检查”。
- 寻找一个“未检查”且其请求资源数小于等于当前可用资源数的进程。如果找到,将该进程标记为“完成”,并将其已分配的资源归还给可用资源池。
- 重复上一步,直到找不到满足条件的“未检查”进程。
- 如果此时仍有“未检查”进程,说明存在死锁,这些“未检查”进程即为死锁进程集合。
- 基于等待图的算法
- 数据结构:构建等待图,图中的节点为进程,边表示进程间的等待关系(如进程A等待进程B释放资源,则有一条从A到B的边)。
- 检测过程:
- 定期(或在资源分配、请求操作时)更新等待图。
- 使用深度优先搜索(DFS)或广度优先搜索(BFS)算法在等待图中查找环。如果存在环,则环上的进程处于死锁状态。
死锁恢复机制
- 终止进程
- 选择策略:
- 优先终止优先级低的进程。可以根据进程的类型(如后台进程优先级低于前台交互进程)、进程已运行时间(运行时间短的优先终止,减少浪费的计算资源)等因素确定优先级。
- 终止占用资源少的进程,以减少释放资源后对系统其他部分的影响。
- 操作:终止选定的进程,将其已分配的资源归还给系统资源池,解除死锁。
- 选择策略:
- 资源剥夺
- 选择策略:
- 从死锁进程中选择占用可剥夺资源(如CPU时间片等可临时收回再分配的资源)的进程。
- 优先剥夺优先级低的死锁进程的资源。
- 操作:剥夺选定进程的资源分配给其他进程,直到死锁解除。被剥夺资源的进程可能需要等待重新分配资源后才能继续执行。
- 选择策略:
兼顾系统性能和资源利用效率
- 性能方面
- 检测频率优化:对于死锁检测,不宜过于频繁(如每秒检测一次会消耗过多系统资源),也不能过于稀疏(可能导致死锁长时间未被发现影响系统性能)。可以根据系统的负载情况动态调整检测频率,例如在系统负载低时适当降低检测频率,负载高时提高检测频率。
- 高效算法选择:选择复杂度较低的死锁检测算法,如基于等待图的算法在查找环时可以采用高效的DFS或BFS实现,减少检测过程中的计算开销。
- 资源利用效率方面
- 恢复策略优化:在死锁恢复时,优先采用资源剥夺策略而不是终止进程,因为终止进程意味着进程之前的计算工作全部白费,而资源剥夺可以尽量保留进程的执行进度。
- 资源预分配与预留:在系统初始化或进程启动阶段,对于一些关键资源可以进行预分配或预留,减少死锁发生的可能性,提高资源利用的稳定性和效率。同时,在资源动态变化过程中,合理调整预分配和预留策略,避免资源浪费。