通俗易懂,简单理解死锁的四个条件

死锁四个必要条件

  1. 互斥
  2. 请求保持
  3. 不可剥夺(不可抢占)
  4. 循环等待(环路等待)

通俗地解释

人对故事场景的记忆会更加深刻,因此故事——真实案例如下:
想象你来到巴黎卢浮宫博物馆,想要排队看看蒙娜丽莎的微笑。

  1. 互斥:这幅画一次只能一个人看(太小了)——某个资源只能互斥地使用,如磁盘,物理内存。
  2. 请求,保持:
    • 请求:老王排队轮到了他看这幅蒙娜丽莎,它很贪心,说我看蒙娜丽莎的同时,要看其他画,比如梵高的向日葵——进程在使用已申请资源时,申请使用其他互斥资源。
    • 保持:如果不给他看向日葵他就不走,不给其他人看正在看的蒙娜丽莎——进程保持对已分配资源的占有。
  3. 不可剥夺:如果老李正在看梵高的向日葵,不能满足老王的需要,那么老王就一直堵在蒙娜丽莎前面,不给给别人看——进程已经申请的资源在没释放前不可被剥夺。
  4. 循环等待(环路等待):老李也不满足于看向日葵,也要同时看蒙娜丽莎,而老王占用了蒙娜丽莎,同时请求向日葵,导致两人谁都不走,陷入了僵局——一系列进程都占有一定资源,并申请别人占有的资源,且形成了环路。

比如有进程ABC,资源123。

进程已分配资源申请新的资源
A12
B23
C31

A等待B,B等待C,C等待A,形成环路

死锁预防

通过破坏死锁的四大必要条件,来预防死锁的发生:

  1. 互斥:有些资源本身就是互斥的,无法改变,有的时候是代码设计导致的某些变量互斥了。就像这里的画一样,如果你让多个人一起看不就解决了,但是多个人同样有上限,那么干脆就拍照给全世界看就好了。——同样的,一些资源可以采取一些措施来消除互斥。

比如MIT6.S081实验LOCK中提到了这么个例子。内核每次分配一个页的物理空间,都需要锁上总的物理页链表,这样导致多个CPU申请物理页只能一个CPU申请了下一个再申请。解决办法也很简单,将总的物理页平分给每个CPU,每个CPU维护一个自己的物理页链表,需要分配的时候先在CPU自己链表中找,不够了就去其他CPU中的物理页链表中偷。

  1. 请求保持:即一次性分配资源。每个人参观必须事先申明好想看的画,然后一次性分配所需要的画,不能中途提新的要求——一次性分配进程所需所有资源。

很明显,对于动态分配内存的程序来说,本身需要动态分配内存资源,不能一次性分配完,所以这种方法有明显的缺陷。不过在ACM这样的算法竞赛中,常常会有数据范围的限制,比如输入106个数字以内的数据,求和。那么就可以开一个那么大的数组,代码每次运行时,不论输入范围是多少都行。也就是分配一个绝对能满足进程的资源,不过很显然,开大了会导致浪费。

  1. 不可剥夺:让这个想看同时看两幅画的人先滚到一边去,等两幅画都有空了再给他——进程等待新的资源的时候,将自己的资源先释放,等有新的资源后,操作系统会唤醒它,进程再进入可执行阶段,等待操作系统调度。
  2. 循环等待:将向日葵编号为1,蒙娜丽莎编号为2,必须先申请参观1,持有1的同时才能再申请2,这样一次就只有一个人参观1、2——将资源编号,每次只能从小到大申请。

死锁避免

银行家算法,待补充。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值