[作业解析]死锁的四个条件及解决办法(全)

死锁的定义:

每个进程的都等待着资源,而这些资源必须有其他进程释放

死锁的四个条件

  1. Mutial Exclusion 互斥,在某个时刻一个资源只能被一个进程占用
  2. Hold and Wait 占用并等待,一个进程先占用一部分资源,并等待剩下的资源
  3. No Proemption,资源不能被抢走,也就是资源只能有占用的进程释放,
  4. Cyclic Waiting,形成头尾相连的等待,也就是相互等待

常见的死锁4大类措施:

  1. 忽视
  2. 有专门的算法发现并处理
  3. 避免死锁,通过专门的算法管理资源,使deadlock不会出现
  4. 消除死锁,在编写进程程序时就消除了可能出现死锁的条件,由于死锁的产生有4个充要条件,因此我们只掉使其中的一个或者多个条件不满足,那么死锁就不会产生,由于第一个条件必须被保证,我们一般会去处理后三个条件。

消除死锁的算法一:

2阶段锁定,1.阶段锁定所有的需要的资源,能锁定才继续,不能锁定就放手,并重启阶段一2.锁定了所有资源后计算这个算法主要破坏了第二个条件,应用在哲学家吃饭问题上:即哲学家必须拿到两个筷子后才能占用,否则必须放手
具体实现看伪代码

先定义一个非阻塞式wait

tryWait(Semaphore) = True if Semaphore available else False// 非阻塞式tryWait
loop
l = tryWait(left)
if l then:
  r = tryWait(right)
  if r then:
    eat()
  signal(right)
  else:
  signal(left)
end loop

但是这个算法解决了死锁,引入了活锁,活锁的定义是程序是整个系统都在运行没有锁死,但是每个进程的状态没有任何进展,这是因为第四个条件的存在,因此我们主动破坏第四个条件做了个小修改

对N个哲学家吃饭,前N-1个哲学家进程,先拿左手筷子,再拿右手筷子;而第N个线拿右手筷子,再拿左手筷子,不能同时拿到两个筷子就必须放手,不能hold and wait
第N个哲学家改写成

loop
r = tryWait(right)
if r then:
  l = tryWait(left)
  if l then:
    eat()
  signal(left)
  else:
  signal(right)
end loop

消除死锁的算法二:

或者我们尝试改良版的2阶段算法:Total Order,我翻译为全局有序算法,主要是解决破坏第二和第四个条件为基础解决死锁的。这个算法的思路,就是给每个进程一个序号(可以是时间戳),每个进程尝试用获取资源,能占用就占用,发现资源如果被比自己序号小的进程占用了,那就放弃所有资源,重启阶段一;
反之,如果是序号更大的进程占用了,则该进程保留其他资源,并等待,这个资源被释放。本质就是给2阶段锁定加上了时间戳

该算法可以用反证法证明有效性,具体不讲。

避免死锁的算法一:

前面两种都是最后一类措施,即有限的资源下,设计好程序,消除死锁;而还有一列避免死锁的方法,即通过计算资源数量,来判断是否无论用什么算法都不会发生死锁;因为在财大气粗的情况下,资源够用是不会发生死锁的
典型的是Dijstra的银行家算法:

某个进程P1对不同的资源ABCD,有最大的需求量M_P1(1,2,3,4),为了方便写成向量形式,当前进程已经占用资源ABCD的数量比如为C_P1(1,1,1,1)
进程2对不同的资源ABCD同理M_P2,C_P2
总共有资源ABCD数量分别为(2,3,4,5)

我们只要保证 存在进程P, M_P >= C_P + A, 该进程P结束运行,A = A + C_P,然后找下一个进程,知道所有进程都能结束运行,那么资源就是够用的,否则不够

参考文献:死锁的四个必要条件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容