MST
星途 面试题库

面试题:并发与同步:复杂场景下死锁检测与恢复策略

假设在一个多线程且资源动态分配的大型系统中,已经发生了死锁。请描述一种高效的死锁检测算法,并说明如何基于该检测结果实现系统的恢复,同时尽量减少对正常业务的影响。
31.6万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

死锁检测算法 - 资源分配图算法

  1. 资源分配图:在这个算法中,我们将系统中的每个进程和每个资源类型抽象为节点,而进程对资源的请求以及资源对进程的分配关系抽象为边。具体来说,有两种类型的边:
    • 请求边:从进程节点指向资源节点,表示进程请求该资源。
    • 分配边:从资源节点指向进程节点,表示该资源已经分配给了这个进程。
  2. 算法步骤
    • 化简资源分配图
      • 寻找一个没有请求边的进程节点(意味着该进程已经获得了它所需要的所有资源)。移除这个进程节点以及它的所有分配边。这相当于模拟该进程完成任务并释放它所占用的资源。
      • 重复上述步骤,直到没有这样的进程节点可移除。
    • 判断死锁:如果在化简过程结束后,仍然存在一些节点(进程或资源)无法移除,那么这些节点就构成了一个死锁环,即发生了死锁。这些无法移除的进程就是处于死锁状态的进程。

基于检测结果的系统恢复

  1. 选择牺牲进程
    • 最小代价原则:选择那些对业务影响最小的进程作为牺牲进程。可以从多个维度来衡量代价,例如:
      • 进程优先级:优先选择低优先级的进程。在系统中,通常会为不同的进程分配不同的优先级,低优先级进程对业务的关键程度相对较低。
      • 进程已运行时间:选择已运行时间较短的进程。因为已运行时间短,意味着它完成的工作量相对较少,回滚它对系统整体进度的影响较小。
      • 进程资源占用量:选择占用资源量少的进程。这样释放的资源相对较少,对其他正常运行进程的资源供应影响较小。
  2. 终止牺牲进程
    • 强制终止:使用操作系统提供的相关函数或接口,如在Linux系统中可以使用kill命令来强制终止进程。这会立即终止进程的执行,并释放它所占用的所有资源。
  3. 资源重新分配
    • 更新资源分配状态:在终止牺牲进程后,系统需要更新资源的分配状态,将之前分配给牺牲进程的资源标记为可用。
    • 重新调度:重新评估系统中其他等待资源的进程的请求,并按照系统的资源分配策略进行资源重新分配。例如,可以采用先来先服务(FCFS)、最短作业优先(SJF)等策略,以确保资源能够合理地分配给需要的进程,使系统恢复正常运行。