持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
从上述情况,可以看出死锁发生需要具备以下几个必要条件
- 互斥资源:一个资源只能被一个任务获取。
- 占有等待:任务获取资源后,必须等待需要再获取的资源,同时不释放自己所获得的资源。
- 不可抢占:任务之间占有的资源不能互相抢占。
- 循环等待:产生资源依赖环路,即上面的任务a和任务b,互相依赖彼此占有的资源。
2.解决死锁
要解决死锁,就需要解决3类问题,即预防死锁、避免死锁和死锁恢复。
-
预防死锁
死锁发生有4个必要条件,因此,打破任何一个条件都可以预防死锁
- 互斥资源。只需要增加可获得资源数,使其大于任务数即可,不过这是不现实的,因为每个系统的资源都是有限的。
- 占有等待。既然任务占有了自己需要的资源,当再去获取需要的资源时,如果获取失败,则可以等待一段时间或者获取失败后立即释放占有的资源即可。
- 不可抢占。对这个条件的破坏可以更简单,粗暴,直接设置资源抢占即可。如获取资源多的任务可以抢占获得资源少的任务,假设任务a获取3个资源,还需要两个资源,而任务b获取两个资源,还需要1个资源,那么任务a可以抢占任务b获取的资源。
- 循环等待。要打破这个条件,就需要解决资源依赖环的问题,只要去除环就可以了,即任务a和任务b产生循环依赖,这个可以在任务获取资源之前将任务进行排队,让任务一次性获取所有需要的资源,如果获取不到,则退出重试。