死锁的四个必备条件
Posted Android每日一讲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁的四个必备条件相关的知识,希望对你有一定的参考价值。
今天来总结一下发生死锁的四个必备条件,他们分别是
· 互斥
· 不可剥夺
· 循环等待
· 请求和保持
互斥
互斥很好理解。举个例子,A进程和B进程都需要操作一个map,而这个map是唯一的。那么对这个资源的使用就是互斥的。
不可剥夺
这个条件的意思是,A进程在使用完某个资源前,这个资源是不会被其他进程所使用的,除非A主动释放。
循环等待
发生死锁的一个必要条件是当前进程队列产生了闭环。
很好理解,当有进程{p1,p2…pn},p2等待p1释放一个互斥资源,Pn等待Pn-1释放一个互斥资源,而P1等待Pn,那么久产生了闭环。
请求和保持
这个条件是说,当某个进程在请求新资源时,它不放弃原有的资源。
如何避免死锁
避免死锁,只要破坏死锁产生的条件就可以。一般有三种思路
· 破坏不可剥夺
· 破坏闭环
· 破坏请求和保持
破坏不可剥夺
从"不可剥夺"条件上来说,经常发生的情况是A进程持有了某个资源,此时它执行过程中发现需要其他资源,而且资源被其他进程持有,如果此时A进程不释放已经持有的资源,那么就有可能导致死锁。
破坏这个条件的原则是,如果当前不能获取到需要的所有资源,则进程等待状态
,并且释放已持有的资源。
破坏请求和等待
这个思路的原则是一次性分配所有需要的资源。然而这种方法系统开销比较大。还有一种是动态的分配资源,并且在请求新资源的时候释放已经持有的资源。
破坏循环等待
基本思想是把资源顺序编号。以资源稀缺程度进行降序编号,申请资源时按编号进行,只有获取了较小编号的资源才能申请大编号的资源。
这么说不好理解,来看一个具体的例子。
哲学家吃饭问题
有五个哲学家坐在圆桌上,没人左手边有一根筷子。哲学家们必须拿到两根筷子才能吃饭。这就造成了一种可能出现的情况,每个哲学家都拿到了左手边的筷子,大家都没饭吃。
结合上面破坏循环等待
的思想。我们可以给筷子顺序编号1-5,第一个哲学家左手边起第一根筷子编号1.
这样最后一个哲学家只有在持有编号为4的筷子时才有资格申请编号5的筷子。
这样当他拿不到5的筷子的时候,只能乖乖把编号4的筷子交给持有编号1的哲学家(释放已持有资源)。
以上是关于死锁的四个必备条件的主要内容,如果未能解决你的问题,请参考以下文章