面试题答案
一键面试数据结构
- 全局资源表(Global Resource Table):
- 记录整个分布式系统中每种资源的总量。例如,假设有CPU、内存、磁盘空间三种资源,该表可表示为
[total_cpu, total_memory, total_disk]
。
- 记录整个分布式系统中每种资源的总量。例如,假设有CPU、内存、磁盘空间三种资源,该表可表示为
- 节点资源表(Node Resource Table):
- 每个节点都有自己的资源表,记录该节点当前可用的资源。结构类似全局资源表,如
node_i_resource = [available_cpu_i, available_memory_i, available_disk_i]
。
- 每个节点都有自己的资源表,记录该节点当前可用的资源。结构类似全局资源表,如
- 进程资源需求表(Process Resource Demand Table):
- 记录每个进程在不同节点上对各类资源的最大需求。例如,进程
P_j
在节点i
上对资源的最大需求可表示为max_demand[P_j][node_i] = [max_cpu_j_i, max_memory_j_i, max_disk_j_i]
。
- 记录每个进程在不同节点上对各类资源的最大需求。例如,进程
- 进程资源分配表(Process Resource Allocation Table):
- 记录每个进程当前在各个节点上实际分配到的资源。如
allocation[P_j][node_i] = [allocated_cpu_j_i, allocated_memory_j_i, allocated_disk_j_i]
。
- 记录每个进程当前在各个节点上实际分配到的资源。如
算法流程
- 资源请求阶段:
- 当一个进程
P_j
在节点i
上请求资源request = [req_cpu, req_memory, req_disk]
时,首先检查该节点的可用资源是否满足请求,即node_i_resource >= request
。 - 若节点资源不足,检查其他节点是否有足够资源且满足进程迁移条件。
- 若全局资源都无法满足请求,则进程等待。
- 当一个进程
- 资源分配阶段:
- 若节点
i
有足够资源,检查分配后是否会导致死锁。计算分配后的剩余资源new_node_i_resource = node_i_resource - request
,以及进程P_j
在该节点上的剩余需求remaining_demand[P_j][node_i] = max_demand[P_j][node_i] - request
。 - 使用类似银行家算法的安全性检查,假设分配资源后,尝试寻找一个安全序列,即系统中是否存在一种方式能让所有进程依次完成任务并释放资源。若存在安全序列,则进行资源分配,更新
node_i_resource
、allocation[P_j][node_i]
等相关表。
- 若节点
进程迁移过程中的资源再分配和死锁检测
- 资源再分配:
- 当进程
P_j
从节点i
迁移到节点k
时,首先在节点i
上释放该进程占用的资源,即node_i_resource += allocation[P_j][node_i]
,并清空allocation[P_j][node_i]
。 - 然后在节点
k
上根据进程的需求和节点k
的可用资源进行资源分配,按照资源请求和分配的算法流程进行操作。
- 当进程
- 死锁检测:
- 定期(或在资源分配、进程迁移等关键操作后)进行死锁检测。构建资源分配图(如Wait - For图),节点表示进程和资源,边表示进程对资源的请求或分配关系。
- 使用深度优先搜索(DFS)等算法检测图中是否存在环。若存在环,则表示可能发生死锁。
- 当检测到死锁时,选择一个牺牲进程(如资源占用少、优先级低的进程),终止该进程并释放其占用的资源,然后重新进行资源分配和死锁检测,直到系统恢复到无死锁状态。