死锁的四个必备条件

2018-08-07 16:38:10 浏览数 (1)

今天来总结一下发生死锁的四个必备条件,他们分别是 · 互斥 · 不可剥夺 · 循环等待 · 请求和保持

互斥

互斥很好理解。举个例子,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的哲学家(释放已持有资源)。

0 人点赞