面试题答案
一键面试死锁检测机制设计
- 资源分配图算法:
- 构建资源分配图,图中的节点分为进程节点和资源节点。边分为请求边(从进程指向资源)和分配边(从资源指向进程)。
- 定期执行资源分配图算法(如 Banker 算法的变种),算法尝试对资源分配图进行化简。
- 若化简后所有进程节点都能成为孤立节点,则系统无死锁;否则,存在死锁。
- 时间戳方法:
- 为每个进程分配一个唯一的时间戳。
- 当进程请求资源时,若资源不可用,将请求加入等待队列,并记录等待关系。
- 定期检查等待队列,若发现进程 A 等待进程 B,进程 B 等待进程 C,以此类推,最终又回到进程 A 的情况,且进程 A 的时间戳是等待环中最小的,则判定为死锁。
- 基于分布式哈希表(DHT)的方法:
- 在分布式系统中,利用 DHT 存储进程的资源请求和分配信息。
- 每个节点负责管理一部分资源和进程的相关信息。
- 当检测死锁时,各节点根据本地管理的信息,与其他节点进行信息交互,共同构建全局的资源分配关系图,进而检测死锁。
恢复机制设计
- 选择牺牲进程:
- 优先选择优先级低的进程作为牺牲进程。例如,对于后台批处理进程优先级可设置较低,而前台交互进程优先级较高。
- 选择持有资源较少的进程。这样可以减少释放资源时对系统运行的影响。
- 考虑进程的运行状态,如处于空闲或等待状态时间较长的进程可优先考虑牺牲。
- 资源释放与重新分配:
- 牺牲进程释放其持有的所有资源。
- 将释放的资源按照一定的策略重新分配给其他等待资源的进程。例如,按照进程优先级和等待时间进行排序,优先分配给优先级高且等待时间长的进程。
- 回滚进程:
- 对于某些进程,简单释放资源可能不够,需要回滚到某个安全的检查点状态。
- 在系统正常运行时,定期创建进程的检查点,记录进程的状态和已执行的操作。
- 当牺牲进程时,回滚到最近的检查点,然后重新启动进程,从检查点处继续执行。
设计过程中关键因素
- 性能开销:
- 死锁检测机制不能过于频繁执行,以免占用过多系统资源,影响正常业务运行。例如,可根据系统负载动态调整检测频率。
- 检测算法应尽可能高效,如资源分配图算法化简过程要优化,减少不必要的计算。
- 准确性:
- 死锁检测机制要准确识别死锁,避免误判和漏判。对于复杂的分布式系统,不同节点间信息同步可能存在延迟,需要合理处理以确保检测的准确性。
- 分布式特性:
- 分布式系统中节点可能出现故障,死锁检测和恢复机制要能适应节点故障的情况。例如,在基于 DHT 的方法中,当某个节点故障时,要能重新分配管理的资源和进程信息。
- 不同节点间的时钟可能不同步,时间戳方法需要考虑时钟同步问题或采用逻辑时钟等解决方案。
- 系统状态一致性:
- 在恢复机制执行过程中,要确保系统状态的一致性。例如,资源释放和重新分配过程要保证数据的完整性,避免出现资源重复分配或未分配的情况。
- 回滚进程时,要保证回滚操作的原子性,防止部分回滚导致系统状态不一致。