面试题答案
一键面试死锁产生的四个必要条件
- 互斥条件:资源在某一时间只能被一个进程所使用,即进程对所分配到的资源具有排他性,其他进程不能同时使用。例如打印机,同一时间只能被一个进程使用来打印文档。
- 占有并等待条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。比如进程A已经获得了资源R1,在等待资源R2的过程中,不会释放R1。
- 不可剥夺条件:进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。例如进程占用了内存空间,系统不能强行收回,只能等进程主动释放。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。比如进程A等待进程B占用的资源,进程B等待进程C占用的资源,进程C又等待进程A占用的资源,形成一个循环等待链。
银行家算法避免死锁的原理
银行家算法是一种资源分配与死锁预防算法,其核心思想是:系统把资源分配给进程时,先假设分配后系统仍处于安全状态,如果是则分配,否则拒绝分配。
- 数据结构:
- 可利用资源向量Available:表示系统中各类资源的总数。
- 最大需求矩阵Max:表示每个进程对各类资源的最大需求量。
- 分配矩阵Allocation:表示每个进程当前已获得的各类资源的数量。
- 需求矩阵Need:表示每个进程还需要的各类资源的数量,Need = Max - Allocation。
- 算法执行过程:
- 当进程提出资源请求时,系统首先检查该进程对资源的请求量是否超过其需要量(即请求量是否超过Need矩阵中对应的值),若超过则出错。
- 然后检查系统现有可利用资源是否能满足该进程的请求量(即请求量是否超过Available向量对应的值),若不能则进程等待。
- 若以上条件都满足,系统试探性地把资源分配给该进程,修改Available、Allocation和Need矩阵。
- 接着系统执行安全性算法,检查分配后系统是否处于安全状态。如果系统能找到一个安全序列(即按照这个序列分配资源,每个进程都能运行完成),则正式分配资源;否则,撤销试探性分配,让进程等待。
银行家算法在实际应用场景中的局限性
- 资源类型单一性假设:银行家算法假设系统中的资源类型是固定的、可分的,且每种资源的数量是有限的。但在实际中,资源可能具有复杂的特性,如有些资源可能是不可分割的,或者资源类型可能动态变化。例如,在云计算环境中,虚拟机资源的特性与传统资源不同,其创建和销毁可能是动态的,难以用银行家算法的模型准确描述。
- 进程行为的不确定性:算法假设进程预先声明其最大资源需求,且在运行过程中不会改变。然而,在实际应用中,进程的资源需求往往是动态变化的,可能由于业务逻辑、数据量等因素而改变。比如一个图像渲染进程,可能由于处理的图像分辨率不同,对内存和CPU资源的需求差异很大,难以提前准确预估。
- 系统开销较大:银行家算法在每次资源请求时都需要进行复杂的安全性检查,包括对多个矩阵的操作和安全序列的查找,这会消耗大量的系统时间和资源。在大型复杂系统中,频繁的资源请求会导致系统性能下降。例如,在大规模数据中心中,大量服务器进程同时请求资源,银行家算法的计算开销可能成为性能瓶颈。
- 实际应用场景限制:银行家算法适用于进程数量相对稳定、资源分配模式较规律的系统。但在一些实时系统、分布式系统或并发度极高的系统中,该算法难以有效应用。比如在实时多媒体处理系统中,对响应时间要求极高,银行家算法的复杂计算可能无法满足实时性需求。