死锁避免和死锁预防有什么区别?

sky*_*oor 19 multithreading

我听说过这两个术语,它们是相同的还是不同的东西?

小智 32

僵局:

僵局是指两个或更多竞争行为各自等待另一个完成的情况,因此两者都没有.它还可以定义为一组被阻止的进程,每个进程持有一个资源并等待获取该集合中另一个进程持有的资源.

例如,如果有一个带有两个磁盘驱动器的系统.如果有两个进程P1和P2,每个进程保持一个磁盘驱动器,每个进程需要另一个磁盘驱动器,则发生死锁的情况.如果出现死锁,将同时执行以下条件:

•相互排斥:一次只能有一个进程使用资源

•保持并等待:持有至少一个资源的进程正在等待获取其他进程持有的其他资源

•无抢占:在该过程完成其任务之后,资源只能由持有它的进程自愿释放

•循环等待:存在等待进程的集合{P0,P1,...,Pn},使得P0正在等待P1持有的资源,P1正在等待由P2持有的资源,...,Pn- 1正在等待由Pn保持的资源,并且Pn正在等待由P0保持的资源.

死锁预防,避免和检测之间的差异如下:

预防:

•目标是确保至少有一个必要的死锁条件永远不会成立.

•通常无法实现死锁预防.

•系统不需要有关每个流程的每种资源的总体潜在使用的额外先验信息.

•为了使系统能够防止死锁情况,它不需要知道现有,可用和请求的所有资源的所有细节.

•死锁预防技术包括非阻塞同步算法,序列化令牌,Dijkstras算法等.

•预防死锁的资源分配策略是保守的,它承诺资源.

•立即请求所有资源.

•在某些情况下,抢占的次数超过了必要的范围.

回避:

•避免死锁的目标是系统不得进入不安全状态.

•通常无法实现死锁避免.

•系统需要有关每个流程的每种资源的总体潜在使用的额外先验信息.

•为了使系统能够确定下一个状态是安全还是不安全,它必须事先知道现有,可用和请求的所有资源的数量和类型.

•死锁避免技术包括Banker算法,等待/死亡,伤口/等待等.

•避免死锁的资源分配策略选择在检测和预防之间.

•需要操作,直到找到至少一条安全路径.

•没有先发制人.

检测:

•目标是在发生死锁之后或之前检测死锁.

•在发生死锁之前检测死锁的可能性要困难得多,实际上通常是不可判定的.但是,在特定环境中,使用特定的锁定资源的方法,死锁检测可以是可判定的.

•在所有情况下,系统不需要有关每个过程的每种资源的总体潜在使用的额外先验信息.

•为了使系统能够检测到死锁条件,它不需要知道所有现有,可用和请求的所有资源的详细信息.

•死锁检测技术包括但不限于模型检查.这种方法构建了一个有限状态模型,在该模型上,它执行进度分析并在模型中查找所有可能的终端集.

•死锁检测的资源分配策略非常自由.资源按要求授予.

•需要定期调用以测试死锁.

•看到抢占.


NG.*_*NG. 19

你可以把它看作:

避免:不要跨进程/多个线程共享资源

预防:在收集共享资源时,请使用信号量.如果锁定多个信号量,请确保以与锁定相反的顺序解锁.始终确保处理关键部分中的错误,以便在所有条件下释放信号量.