面试题答案
一键面试资源分配图算法原理
- 资源分配图:用有向图表示系统资源分配状态,图中有两类节点,分别为进程节点(用圆圈表示)和资源节点(用方框表示,方框内的小点表示该资源类型的实例数)。有向边分为两种,从进程节点指向资源节点的边表示进程请求资源,称为请求边;从资源节点指向进程节点的边表示资源已分配给该进程,称为分配边。
- 算法核心思想:通过对资源分配图进行化简操作来检测是否存在死锁。若能将图中所有节点都化简掉(即所有进程都能获得所需资源并运行结束),则系统不存在死锁;若化简后仍存在不可化简的节点(即存在进程永远无法获得所需资源),则系统处于死锁状态。
- 化简步骤:
- 寻找一个既不阻塞又非孤立的进程节点Pi,即Pi的所有请求边都能通过分配现有资源得到满足。
- 假设Pi获得所需资源并运行完毕,释放其占用的所有资源,这意味着与Pi相连的分配边和请求边都可删除。
- 重复上述步骤,对剩余图中的进程节点进行化简。
在Unix和macOS操作系统中的实现与应用
- 数据结构:操作系统会维护类似资源分配图的数据结构来记录进程与资源之间的关系。例如,每个进程结构体可能包含一个请求资源列表和一个已分配资源列表,每个资源结构体包含一个指向占用该资源进程的指针列表和一个等待该资源的进程队列。
- 定期检测:操作系统会定期(或在特定事件发生时,如资源请求失败)触发死锁检测算法。通过遍历进程和资源的数据结构,构建资源分配图的内存表示。
- 应用场景:在多进程并发运行且共享资源的环境中,死锁检测算法用于确保系统的稳定性和资源的有效利用。例如,在多线程文件系统操作或数据库并发事务处理场景中,检测和预防死锁。
独特的优化策略
- Unix:
- 层次化资源管理:在一些Unix变体中,采用层次化的资源分配方式。例如,将资源划分为不同层次,高层次资源依赖于低层次资源。进程在请求资源时,必须按照层次顺序请求,这有助于减少死锁发生的可能性,并且在死锁检测时可以根据层次关系更快地定位问题。
- 启发式算法结合:结合启发式算法,如根据进程的优先级或资源使用历史来优先化简某些进程节点。高优先级进程或使用资源较频繁且稳定的进程优先得到处理,这可以提高死锁检测和恢复的效率。
- macOS:
- 基于缓存的检测:macOS可能利用缓存机制来加速死锁检测。例如,缓存最近一段时间内的资源分配图状态以及化简结果。当再次进行检测时,如果系统状态变化不大,可以直接利用缓存结果,避免重复进行完整的图化简操作,从而提高检测效率。
- 与内核调度结合:将死锁检测与内核调度机制紧密结合。在调度进程时,考虑进程对资源的请求情况,优先调度那些不太可能导致死锁的进程。同时,在死锁检测时,利用调度信息优化检测过程,比如对长时间未被调度且持有资源的进程重点关注,看是否可能引发死锁。