前言
关于死锁,你了解多少?
本文内容如下:
各位亲们,请原谅我开启了仅粉丝可见,并不是为了赚粉丝,是因为一些可恶的网站大批量的爬我们这些原创博主的文章。开启了仅粉丝可见后他们就无法进行爬取后面的内容,也麻烦大家点个小小的关注才能看到后面的内容,当然了内容不好,看完也可以取消关注哈,嘿嘿。
文章目录
- 前言
- 一、你知道死锁是什么吗?
- 二、通过"让APP要随手机壳改变颜色,难怪程序员要和产品经理打架?"看死锁的产生
- 三、死锁的定义
- 四、产生死锁的4个必要条件
- 五、处理死锁的4种基本方法
- (一)预防死锁
- (二)避免死锁
- (三)检测死锁
- (四)解除死锁
- 五、避免方法
- (一)破坏请求和保持(部分分配)条件
- (二)破坏不可剥夺(不可抢占)条件
- (三)破坏环路等待条件
- 六、死锁的结论
一、你知道死锁是什么吗?
系统中诸多进程之间的一种牵制状态,与拥堵不同,无法自解。
例:P1,P2
两道进程,对资源R1,R2都有需求
,且须同时拥有两个资源才能继续工作
。
某时刻,P1获取R1
,P2获取R2
,这样,P1和P2都无法获取另一个资源
,且不会主动释放已有资源
,于是
,死锁产生
。
二、通过"让APP要随手机壳改变颜色,难怪程序员要和产品经理打架?"看死锁的产生
这个故事发生在2018年,已经过去2年了。为了方便朋友们理解,让我重新搬过来,重新回顾一下发生的经过,来解释死锁的产生,挺合适的。
为了还原情景,我搬过来了一段有意思的图文:
“据称某互联网公司产品经理提了个要求,要求APP开发人员可以做到根据用户的手机壳来改变软件主题颜色,然后就干起来了”。
原来是因为:
产品经理要求做个改造,让APP主题颜色跟随手机壳颜色变换。
(程序员:那我先来改造一下你吧),
这个要求的过分程度,
真是不亚于设计界,
风靡一时的配色——五彩斑斓的黑
真相1:
打架当事人不是产品经理和程序员
是平安产险科技中心外包人员
记者经过核实得知,视频里打架的二位是深圳平安产险科技中心外包人员。记者联系了视频中打架的当事人之一谢某,谢某告诉记者,他确是平安的员工,但网传的原因并不真实,他根本不认识与他发生争执的李某。
真相2:
打架原因不是因为要求太苛刻
是因为“你瞅啥?!!”
谢某称,上周一(7月23日)午休时,他趴在座位上休息,起来的时候,看了一眼经过的李某,结果被李某无端挑衅,“他冲到我的座位面前,指着我问,‘你瞅啥?!‘ ”,随后二人发生争执。
其实:
主要是是这个图:
你有你的理,我也有我的理;
你不让我,我不让你;
就产生了死锁
:
来源搜狐新闻:https://www.sohu.com/a/245084564_369533
注:如果不合适,请留言,立马删除。
三、死锁的定义
玩归玩、闹归闹。还是需要知道正规的死锁的定义的。
如下:
一组进程中,每个进程都
无限等待
被该组进程中另一进程所占有的资源,因而永远无法得到该资源
,这种现象称为进程死锁
,这一组进程就称为死锁进程
。
四、产生死锁的4个必要条件
1、互斥条件:
涉及的资源是非共享的,进程对其访问是互斥的。
2、不剥夺(不可抢占)条件:
不能强行剥夺进程拥有的资源,否则将会使进程的工作前功尽弃。
3、请求和保持(部分分配)条件:
进程在等待新资源时继续占有已分配的资源。
4、环路条件:
存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中的下一个进程所请求。
五、处理死锁的4种基本方法
(一)预防死锁
通过设置某些限制条件,去破坏死锁四个必要条件中的一个或多个,来防止死锁。
较易实现,广泛使用,但由于所施加的限制往往太严格,可能导致系统资源利用率和系统吞吐量的降低
。
(二)避免死锁
是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态
,从而避免死锁的发生。
实现较难,只需要较弱
的限制条件,可获得较高的资源利用率和系统吞吐量。
(三)检测死锁
事先并不采取任何限制,也不检查系统是否进入不安全区,允许死锁发生。
可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除掉。
(四)解除死锁
与检测死锁相配套,用于将进程从死锁状态解脱出来。
常用的方法是撤消或挂起一些进程。以回收一些资源,再将它们分配给处于阻塞状态的进程,使之转为就绪状态。
实现难度大,但可获得较好的资源利用率和系统吞吐量。
五、避免方法
在系统设计时确定资源分配算法,运行过程中按照算法进行资源管理,保证不发生死锁。
做法是破坏死锁的四个必要条件之一
。
(一)破坏请求和保持(部分分配)条件
系统要求所有进程要一次性申请
在整个运行过程中所需的全部资源。若系统有足够资源则完全分配。
优点:
简单、易于实现且安全。
缺点:
一个用户在作业运行之前可能提不出他的作业将要使用的全部设备。
用户作业必须等待,直到所有资源满足才能运行。实际上某些资源可能要到运行后期才会用到。
作业运行期间,对某些设备的使用时间很短,甚至不会用到。如:当用户作业出错时才需要打印机输出错误信息,但采用静态分配法必须把打印机分配给该作业,并长期占用。采用该方法对系统来说是非常浪费
的。
(二)破坏不可剥夺(不可抢占)条件
一个已拥有资源的进程,若它再提出新资源要求而不能立即得到满足时,它必须释放
已经拥有的所有资源。以后需要时再重新申请。
可以逐个申请资源,不满足时释放所有资源。
缺点:
实现复杂、要付出很大的代价,使前段时间的工作失效,有可能因反复申请和释放资源,使进程无限地推迟。
(三)破坏环路等待条件
系统中的所有资源都有一个确定的唯一
号码,所有分配请求必须以序号上升
的次序进行。
例如:系统中有下列设备:输入机(1),打印机(2),穿孔机(3),磁带机(4),磁盘(5)。有一进程要先后使用输入机、磁盘、打印机,则它申请设备时要按输入机、打印机、磁盘的顺序申请。
优点:
同前两法相比,其资源利用率和系统吞吐量有较明显的改善。
缺点:
进程实际需要资源的顺序不一定与资源的编号一致,因此仍会造成资源浪费;限制了设备增加;限制了用户简单、自主地编程。
六、死锁的结论
(1)参与死锁的进程最少是两个。
两个以上进程才会出现死锁
(2)参与死锁的进程至少有两个已经占有资源。
请求与保持
(3)参与死锁的所有进程都在等待资源。
(4)死锁的进程是当前系统中所有进程的子集。
(5)如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。