死锁
一、什么是死锁
所谓死锁也就是多个进程竞争资源导致形成一种相互等待的局面,导致所有进程都无法推进。比如四角恋就是个死锁问题,我爱他,他爱她,她爱你,你爱我,此时发生了这样的情况:
- 我想得到他的心,但他的心被她占有
- 他想得到她的心,但她的心被你占有
- 她想得到你的心,但你的心被我占有
- 你想得到我的心,但我的心被他占有
也就是此时此刻,大家占有的资源都不足以让恋爱这个进程发生,大家又不能放弃现有的资源,但是又得不到想要的资源,于是乎,大家都在永无休止地等待下去,所有进程都进入死锁状态
简单来说,死锁就可以理解为,大家爱的人都爱上了其他人,所以人都无法恋爱。
二、死锁产生的条件
-
互斥条件:一段时间一个资源只被一个进程占有。(也就是每个人的心只能属于一个人)
-
不剥夺条件:资源未使用完之前,不能被其他程序强行夺走。(他爱上了她,他的心已经属于她了,你爱他也不能强行得到他)
-
请求并保持条件:进程至少占有了一个资源,又请求其他资源(每个人都占着别人的心,但又想得到另一个人的心)
-
循环等待条件:存在一种循环等待链,每一个进程已经获得的资源同时被下一个进程请求(我爱他,他爱她,她爱你,你爱我)
[死锁一定循环等待,循环等待不一定死锁,比如我爱着他也爱着它,我得到它也可以谈恋爱…虽然很扯哈哈哈]
三、怎么解决死锁
思路一:破快死锁产生的条件
-
破快互斥条件:把互斥变为共享(比如一个人可以被两个人爱着,一个人也可以爱两个人,共享情缘,允许出轨)
-
破快不剥夺条件:请求资源得不到就立即释放(爱的人得不到就放弃)或者强行剥夺(你不爱我没关系,我爱你你就要和我在一起)
-
破坏请求并保持条件:静态分配法,运行前一次申请完它需要的所有资源(我需要你,那就先把你给我,你属于我了之后就不能再把心给别人)
-
破坏循环等待条件:顺序资源分配法,按编号递增的顺序请求资源(比如把我你他她的心变为1234,我想要得到他的心,那就先把他的心给我,以此类推,这样就会导致有些人得不到想要的)
反正这几个方法听起来都很扯(优缺点),所以我们想到了其他办法
思路二:合理地分配资源
- 银行家算法(后续专门写一篇)
思路三:死锁的检测和解除
- 这个也单独写一篇